3
// Copyright Thorsten Ottosen, Neil Groves 2006 - 2008. Use, modification and
4
// distribution is subject to the Boost Software License, Version
5
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6
// http://www.boost.org/LICENSE_1_0.txt)
8
// For more information, see http://www.boost.org/libs/range/
11
#ifndef BOOST_RANGE_ADAPTOR_MAP_HPP
12
#define BOOST_RANGE_ADAPTOR_MAP_HPP
14
#include <mlib/range/adaptor/transformed.hpp>
15
#include <boost/range/iterator_range.hpp>
16
#include <boost/range/value_type.hpp>
20
namespace range_detail
22
struct map_keys_forwarder {};
23
struct map_values_forwarder {};
28
typedef BOOST_DEDUCED_TYPENAME range_value<Map>::type pair_t;
29
typedef const BOOST_DEDUCED_TYPENAME pair_t::first_type&
32
result_type operator()( const pair_t& r ) const
39
struct select_second_mutable
41
typedef BOOST_DEDUCED_TYPENAME range_value<Map>::type pair_t;
42
typedef BOOST_DEDUCED_TYPENAME pair_t::second_type& result_type;
44
result_type operator()( pair_t& r ) const
51
struct select_second_const
53
typedef BOOST_DEDUCED_TYPENAME range_value<Map>::type pair_t;
54
typedef const BOOST_DEDUCED_TYPENAME pair_t::second_type&
57
result_type operator()( const pair_t& r ) const
63
template<class StdPairRng>
64
class select_first_range
65
: public transform_range<
66
select_first<StdPairRng>,
69
typedef transform_range<select_first<StdPairRng>, const StdPairRng> base;
71
typedef select_first<StdPairRng> transform_fn_type;
72
typedef const StdPairRng source_range_type;
74
select_first_range(transform_fn_type fn, source_range_type& rng)
79
select_first_range(const base& other) : base(other) {}
82
template<class StdPairRng>
83
class select_second_mutable_range
84
: public transform_range<
85
select_second_mutable<StdPairRng>,
88
typedef transform_range<select_second_mutable<StdPairRng>, StdPairRng> base;
90
typedef select_second_mutable<StdPairRng> transform_fn_type;
91
typedef StdPairRng source_range_type;
93
select_second_mutable_range(transform_fn_type fn, source_range_type& rng)
98
select_second_mutable_range(const base& other) : base(other) {}
101
template<class StdPairRng>
102
class select_second_const_range
103
: public transform_range<
104
select_second_const<StdPairRng>,
107
typedef transform_range<select_second_const<StdPairRng>, const StdPairRng> base;
109
typedef select_second_const<StdPairRng> transform_fn_type;
110
typedef const StdPairRng source_range_type;
112
select_second_const_range(transform_fn_type fn, source_range_type& rng)
117
select_second_const_range(const base& other) : base(other) {}
120
template< class StdPairRng >
121
inline select_first_range<StdPairRng>
122
operator|( const StdPairRng& r, map_keys_forwarder )
125
boost::adaptors::transformed( select_first<StdPairRng>() ) );
128
template< class StdPairRng >
129
inline select_second_mutable_range<StdPairRng>
130
operator|( StdPairRng& r, map_values_forwarder )
133
boost::adaptors::transformed( select_second_mutable<StdPairRng>() ) );
136
template< class StdPairRng >
137
inline select_second_const_range<StdPairRng>
138
operator|( const StdPairRng& r, map_values_forwarder )
141
boost::adaptors::transformed( select_second_const<StdPairRng>() ) );
146
using range_detail::select_first_range;
147
using range_detail::select_second_mutable_range;
148
using range_detail::select_second_const_range;
154
const range_detail::map_keys_forwarder map_keys =
155
range_detail::map_keys_forwarder();
157
const range_detail::map_values_forwarder map_values =
158
range_detail::map_values_forwarder();
161
template<class StdPairRange>
162
inline select_first_range<StdPairRange>
163
keys(const StdPairRange& rng)
165
return select_first_range<StdPairRange>(
166
range_detail::select_first<StdPairRange>(), rng );
169
template<class StdPairRange>
170
inline select_second_const_range<StdPairRange>
171
values(const StdPairRange& rng)
173
return select_second_const_range<StdPairRange>(
174
range_detail::select_second_const<StdPairRange>(), rng );
177
template<class StdPairRange>
178
inline select_second_mutable_range<StdPairRange>
179
values(StdPairRange& rng)
181
return select_second_mutable_range<StdPairRange>(
182
range_detail::select_second_mutable<StdPairRange>(), rng );