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 <boost/range/adaptor/transformed.hpp>
15 #include <boost/range/iterator_range.hpp>
16 #include <boost/range/value_type.hpp>
17 #include <boost/range/reference.hpp>
21 namespace range_detail
23 struct map_keys_forwarder {};
24 struct map_values_forwarder {};
29 typedef BOOST_DEDUCED_TYPENAME range_reference<const Map>::type argument_type;
30 typedef const BOOST_DEDUCED_TYPENAME range_value<const Map>::type::first_type& result_type;
32 result_type operator()( argument_type r ) const
39 struct select_second_mutable
41 typedef BOOST_DEDUCED_TYPENAME range_reference<Map>::type argument_type;
42 typedef BOOST_DEDUCED_TYPENAME range_value<Map>::type::second_type& result_type;
44 result_type operator()( argument_type r ) const
51 struct select_second_const
53 typedef BOOST_DEDUCED_TYPENAME range_reference<const Map>::type argument_type;
54 typedef const BOOST_DEDUCED_TYPENAME range_value<const Map>::type::second_type& result_type;
56 result_type operator()( argument_type r ) const
62 template<class StdPairRng>
63 class select_first_range
64 : public transformed_range<
65 select_first<StdPairRng>,
68 typedef transformed_range<select_first<StdPairRng>, const StdPairRng> base;
70 typedef select_first<StdPairRng> transform_fn_type;
71 typedef const StdPairRng source_range_type;
73 select_first_range(transform_fn_type fn, source_range_type& rng)
78 select_first_range(const base& other) : base(other) {}
81 template<class StdPairRng>
82 class select_second_mutable_range
83 : public transformed_range<
84 select_second_mutable<StdPairRng>,
87 typedef transformed_range<select_second_mutable<StdPairRng>, StdPairRng> base;
89 typedef select_second_mutable<StdPairRng> transform_fn_type;
90 typedef StdPairRng source_range_type;
92 select_second_mutable_range(transform_fn_type fn, source_range_type& rng)
97 select_second_mutable_range(const base& other) : base(other) {}
100 template<class StdPairRng>
101 class select_second_const_range
102 : public transformed_range<
103 select_second_const<StdPairRng>,
106 typedef transformed_range<select_second_const<StdPairRng>, const StdPairRng> base;
108 typedef select_second_const<StdPairRng> transform_fn_type;
109 typedef const StdPairRng source_range_type;
111 select_second_const_range(transform_fn_type fn, source_range_type& rng)
116 select_second_const_range(const base& other) : base(other) {}
119 template< class StdPairRng >
120 inline select_first_range<StdPairRng>
121 operator|( const StdPairRng& r, map_keys_forwarder )
124 boost::adaptors::transformed( select_first<StdPairRng>() ) );
127 template< class StdPairRng >
128 inline select_second_mutable_range<StdPairRng>
129 operator|( StdPairRng& r, map_values_forwarder )
132 boost::adaptors::transformed( select_second_mutable<StdPairRng>() ) );
135 template< class StdPairRng >
136 inline select_second_const_range<StdPairRng>
137 operator|( const StdPairRng& r, map_values_forwarder )
140 boost::adaptors::transformed( select_second_const<StdPairRng>() ) );
145 using range_detail::select_first_range;
146 using range_detail::select_second_mutable_range;
147 using range_detail::select_second_const_range;
153 const range_detail::map_keys_forwarder map_keys =
154 range_detail::map_keys_forwarder();
156 const range_detail::map_values_forwarder map_values =
157 range_detail::map_values_forwarder();
160 template<class StdPairRange>
161 inline select_first_range<StdPairRange>
162 keys(const StdPairRange& rng)
164 return select_first_range<StdPairRange>(
165 range_detail::select_first<StdPairRange>(), rng );
168 template<class StdPairRange>
169 inline select_second_const_range<StdPairRange>
170 values(const StdPairRange& rng)
172 return select_second_const_range<StdPairRange>(
173 range_detail::select_second_const<StdPairRange>(), rng );
176 template<class StdPairRange>
177 inline select_second_mutable_range<StdPairRange>
178 values(StdPairRange& rng)
180 return select_second_mutable_range<StdPairRange>(
181 range_detail::select_second_mutable<StdPairRange>(), rng );