Chris@16
|
1 // Boost.Range library
|
Chris@16
|
2 //
|
Chris@16
|
3 // Copyright Thorsten Ottosen, Neil Groves 2006 - 2008. Use, modification and
|
Chris@16
|
4 // distribution is subject to the Boost Software License, Version
|
Chris@16
|
5 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
6 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
7 //
|
Chris@16
|
8 // For more information, see http://www.boost.org/libs/range/
|
Chris@16
|
9 //
|
Chris@16
|
10
|
Chris@16
|
11 #ifndef BOOST_RANGE_ADAPTOR_MAP_HPP
|
Chris@16
|
12 #define BOOST_RANGE_ADAPTOR_MAP_HPP
|
Chris@16
|
13
|
Chris@16
|
14 #include <boost/range/adaptor/transformed.hpp>
|
Chris@16
|
15 #include <boost/range/iterator_range.hpp>
|
Chris@16
|
16 #include <boost/range/value_type.hpp>
|
Chris@16
|
17 #include <boost/range/reference.hpp>
|
Chris@16
|
18
|
Chris@16
|
19 namespace boost
|
Chris@16
|
20 {
|
Chris@16
|
21 namespace range_detail
|
Chris@16
|
22 {
|
Chris@16
|
23 struct map_keys_forwarder {};
|
Chris@16
|
24 struct map_values_forwarder {};
|
Chris@16
|
25
|
Chris@16
|
26 template< class Map >
|
Chris@16
|
27 struct select_first
|
Chris@16
|
28 {
|
Chris@16
|
29 typedef BOOST_DEDUCED_TYPENAME range_reference<const Map>::type argument_type;
|
Chris@16
|
30 typedef const BOOST_DEDUCED_TYPENAME range_value<const Map>::type::first_type& result_type;
|
Chris@16
|
31
|
Chris@16
|
32 result_type operator()( argument_type r ) const
|
Chris@16
|
33 {
|
Chris@16
|
34 return r.first;
|
Chris@16
|
35 }
|
Chris@16
|
36 };
|
Chris@16
|
37
|
Chris@16
|
38 template< class Map >
|
Chris@16
|
39 struct select_second_mutable
|
Chris@16
|
40 {
|
Chris@16
|
41 typedef BOOST_DEDUCED_TYPENAME range_reference<Map>::type argument_type;
|
Chris@16
|
42 typedef BOOST_DEDUCED_TYPENAME range_value<Map>::type::second_type& result_type;
|
Chris@16
|
43
|
Chris@16
|
44 result_type operator()( argument_type r ) const
|
Chris@16
|
45 {
|
Chris@16
|
46 return r.second;
|
Chris@16
|
47 }
|
Chris@16
|
48 };
|
Chris@16
|
49
|
Chris@16
|
50 template< class Map >
|
Chris@16
|
51 struct select_second_const
|
Chris@16
|
52 {
|
Chris@16
|
53 typedef BOOST_DEDUCED_TYPENAME range_reference<const Map>::type argument_type;
|
Chris@16
|
54 typedef const BOOST_DEDUCED_TYPENAME range_value<const Map>::type::second_type& result_type;
|
Chris@16
|
55
|
Chris@16
|
56 result_type operator()( argument_type r ) const
|
Chris@16
|
57 {
|
Chris@16
|
58 return r.second;
|
Chris@16
|
59 }
|
Chris@16
|
60 };
|
Chris@16
|
61
|
Chris@16
|
62 template<class StdPairRng>
|
Chris@16
|
63 class select_first_range
|
Chris@16
|
64 : public transformed_range<
|
Chris@16
|
65 select_first<StdPairRng>,
|
Chris@16
|
66 const StdPairRng>
|
Chris@16
|
67 {
|
Chris@16
|
68 typedef transformed_range<select_first<StdPairRng>, const StdPairRng> base;
|
Chris@16
|
69 public:
|
Chris@16
|
70 typedef select_first<StdPairRng> transform_fn_type;
|
Chris@16
|
71 typedef const StdPairRng source_range_type;
|
Chris@16
|
72
|
Chris@16
|
73 select_first_range(transform_fn_type fn, source_range_type& rng)
|
Chris@16
|
74 : base(fn, rng)
|
Chris@16
|
75 {
|
Chris@16
|
76 }
|
Chris@16
|
77
|
Chris@16
|
78 select_first_range(const base& other) : base(other) {}
|
Chris@16
|
79 };
|
Chris@16
|
80
|
Chris@16
|
81 template<class StdPairRng>
|
Chris@16
|
82 class select_second_mutable_range
|
Chris@16
|
83 : public transformed_range<
|
Chris@16
|
84 select_second_mutable<StdPairRng>,
|
Chris@16
|
85 StdPairRng>
|
Chris@16
|
86 {
|
Chris@16
|
87 typedef transformed_range<select_second_mutable<StdPairRng>, StdPairRng> base;
|
Chris@16
|
88 public:
|
Chris@16
|
89 typedef select_second_mutable<StdPairRng> transform_fn_type;
|
Chris@16
|
90 typedef StdPairRng source_range_type;
|
Chris@16
|
91
|
Chris@16
|
92 select_second_mutable_range(transform_fn_type fn, source_range_type& rng)
|
Chris@16
|
93 : base(fn, rng)
|
Chris@16
|
94 {
|
Chris@16
|
95 }
|
Chris@16
|
96
|
Chris@16
|
97 select_second_mutable_range(const base& other) : base(other) {}
|
Chris@16
|
98 };
|
Chris@16
|
99
|
Chris@16
|
100 template<class StdPairRng>
|
Chris@16
|
101 class select_second_const_range
|
Chris@16
|
102 : public transformed_range<
|
Chris@16
|
103 select_second_const<StdPairRng>,
|
Chris@16
|
104 const StdPairRng>
|
Chris@16
|
105 {
|
Chris@16
|
106 typedef transformed_range<select_second_const<StdPairRng>, const StdPairRng> base;
|
Chris@16
|
107 public:
|
Chris@16
|
108 typedef select_second_const<StdPairRng> transform_fn_type;
|
Chris@16
|
109 typedef const StdPairRng source_range_type;
|
Chris@16
|
110
|
Chris@16
|
111 select_second_const_range(transform_fn_type fn, source_range_type& rng)
|
Chris@16
|
112 : base(fn, rng)
|
Chris@16
|
113 {
|
Chris@16
|
114 }
|
Chris@16
|
115
|
Chris@16
|
116 select_second_const_range(const base& other) : base(other) {}
|
Chris@16
|
117 };
|
Chris@16
|
118
|
Chris@16
|
119 template< class StdPairRng >
|
Chris@16
|
120 inline select_first_range<StdPairRng>
|
Chris@16
|
121 operator|( const StdPairRng& r, map_keys_forwarder )
|
Chris@16
|
122 {
|
Chris@16
|
123 return operator|( r,
|
Chris@16
|
124 boost::adaptors::transformed( select_first<StdPairRng>() ) );
|
Chris@16
|
125 }
|
Chris@16
|
126
|
Chris@16
|
127 template< class StdPairRng >
|
Chris@16
|
128 inline select_second_mutable_range<StdPairRng>
|
Chris@16
|
129 operator|( StdPairRng& r, map_values_forwarder )
|
Chris@16
|
130 {
|
Chris@16
|
131 return operator|( r,
|
Chris@16
|
132 boost::adaptors::transformed( select_second_mutable<StdPairRng>() ) );
|
Chris@16
|
133 }
|
Chris@16
|
134
|
Chris@16
|
135 template< class StdPairRng >
|
Chris@16
|
136 inline select_second_const_range<StdPairRng>
|
Chris@16
|
137 operator|( const StdPairRng& r, map_values_forwarder )
|
Chris@16
|
138 {
|
Chris@16
|
139 return operator|( r,
|
Chris@16
|
140 boost::adaptors::transformed( select_second_const<StdPairRng>() ) );
|
Chris@16
|
141 }
|
Chris@16
|
142
|
Chris@16
|
143 } // 'range_detail'
|
Chris@16
|
144
|
Chris@16
|
145 using range_detail::select_first_range;
|
Chris@16
|
146 using range_detail::select_second_mutable_range;
|
Chris@16
|
147 using range_detail::select_second_const_range;
|
Chris@16
|
148
|
Chris@16
|
149 namespace adaptors
|
Chris@16
|
150 {
|
Chris@16
|
151 namespace
|
Chris@16
|
152 {
|
Chris@16
|
153 const range_detail::map_keys_forwarder map_keys =
|
Chris@16
|
154 range_detail::map_keys_forwarder();
|
Chris@16
|
155
|
Chris@16
|
156 const range_detail::map_values_forwarder map_values =
|
Chris@16
|
157 range_detail::map_values_forwarder();
|
Chris@16
|
158 }
|
Chris@16
|
159
|
Chris@16
|
160 template<class StdPairRange>
|
Chris@16
|
161 inline select_first_range<StdPairRange>
|
Chris@16
|
162 keys(const StdPairRange& rng)
|
Chris@16
|
163 {
|
Chris@16
|
164 return select_first_range<StdPairRange>(
|
Chris@16
|
165 range_detail::select_first<StdPairRange>(), rng );
|
Chris@16
|
166 }
|
Chris@16
|
167
|
Chris@16
|
168 template<class StdPairRange>
|
Chris@16
|
169 inline select_second_const_range<StdPairRange>
|
Chris@16
|
170 values(const StdPairRange& rng)
|
Chris@16
|
171 {
|
Chris@16
|
172 return select_second_const_range<StdPairRange>(
|
Chris@16
|
173 range_detail::select_second_const<StdPairRange>(), rng );
|
Chris@16
|
174 }
|
Chris@16
|
175
|
Chris@16
|
176 template<class StdPairRange>
|
Chris@16
|
177 inline select_second_mutable_range<StdPairRange>
|
Chris@16
|
178 values(StdPairRange& rng)
|
Chris@16
|
179 {
|
Chris@16
|
180 return select_second_mutable_range<StdPairRange>(
|
Chris@16
|
181 range_detail::select_second_mutable<StdPairRange>(), rng );
|
Chris@16
|
182 }
|
Chris@16
|
183 } // 'adaptors'
|
Chris@16
|
184
|
Chris@16
|
185 }
|
Chris@16
|
186
|
Chris@16
|
187 #endif
|