annotate DEPENDENCIES/generic/include/boost/range/adaptor/map.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
rev   line source
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