map.hpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. // Boost.Range library
  2. //
  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)
  7. //
  8. // For more information, see http://www.boost.org/libs/range/
  9. //
  10. #ifndef BOOST_RANGE_ADAPTOR_MAP_HPP
  11. #define BOOST_RANGE_ADAPTOR_MAP_HPP
  12. #include <boost/range/adaptor/transformed.hpp>
  13. #include <boost/range/iterator_range.hpp>
  14. #include <boost/range/value_type.hpp>
  15. #include <boost/range/reference.hpp>
  16. namespace boost
  17. {
  18. namespace range_detail
  19. {
  20. struct map_keys_forwarder {};
  21. struct map_values_forwarder {};
  22. template< class Map >
  23. struct select_first
  24. {
  25. typedef BOOST_DEDUCED_TYPENAME range_reference<const Map>::type argument_type;
  26. typedef const BOOST_DEDUCED_TYPENAME range_value<const Map>::type::first_type& result_type;
  27. result_type operator()( argument_type r ) const
  28. {
  29. return r.first;
  30. }
  31. };
  32. template< class Map >
  33. struct select_second_mutable
  34. {
  35. typedef BOOST_DEDUCED_TYPENAME range_reference<Map>::type argument_type;
  36. typedef BOOST_DEDUCED_TYPENAME range_value<Map>::type::second_type& result_type;
  37. result_type operator()( argument_type r ) const
  38. {
  39. return r.second;
  40. }
  41. };
  42. template< class Map >
  43. struct select_second_const
  44. {
  45. typedef BOOST_DEDUCED_TYPENAME range_reference<const Map>::type argument_type;
  46. typedef const BOOST_DEDUCED_TYPENAME range_value<const Map>::type::second_type& result_type;
  47. result_type operator()( argument_type r ) const
  48. {
  49. return r.second;
  50. }
  51. };
  52. template<class StdPairRng>
  53. class select_first_range
  54. : public transformed_range<
  55. select_first<StdPairRng>,
  56. const StdPairRng>
  57. {
  58. typedef transformed_range<select_first<StdPairRng>, const StdPairRng> base;
  59. public:
  60. typedef select_first<StdPairRng> transform_fn_type;
  61. typedef const StdPairRng source_range_type;
  62. select_first_range(transform_fn_type fn, source_range_type& rng)
  63. : base(fn, rng)
  64. {
  65. }
  66. select_first_range(const base& other) : base(other) {}
  67. };
  68. template<class StdPairRng>
  69. class select_second_mutable_range
  70. : public transformed_range<
  71. select_second_mutable<StdPairRng>,
  72. StdPairRng>
  73. {
  74. typedef transformed_range<select_second_mutable<StdPairRng>, StdPairRng> base;
  75. public:
  76. typedef select_second_mutable<StdPairRng> transform_fn_type;
  77. typedef StdPairRng source_range_type;
  78. select_second_mutable_range(transform_fn_type fn, source_range_type& rng)
  79. : base(fn, rng)
  80. {
  81. }
  82. select_second_mutable_range(const base& other) : base(other) {}
  83. };
  84. template<class StdPairRng>
  85. class select_second_const_range
  86. : public transformed_range<
  87. select_second_const<StdPairRng>,
  88. const StdPairRng>
  89. {
  90. typedef transformed_range<select_second_const<StdPairRng>, const StdPairRng> base;
  91. public:
  92. typedef select_second_const<StdPairRng> transform_fn_type;
  93. typedef const StdPairRng source_range_type;
  94. select_second_const_range(transform_fn_type fn, source_range_type& rng)
  95. : base(fn, rng)
  96. {
  97. }
  98. select_second_const_range(const base& other) : base(other) {}
  99. };
  100. template< class StdPairRng >
  101. inline select_first_range<StdPairRng>
  102. operator|( const StdPairRng& r, map_keys_forwarder )
  103. {
  104. return operator|( r,
  105. boost::adaptors::transformed( select_first<StdPairRng>() ) );
  106. }
  107. template< class StdPairRng >
  108. inline select_second_mutable_range<StdPairRng>
  109. operator|( StdPairRng& r, map_values_forwarder )
  110. {
  111. return operator|( r,
  112. boost::adaptors::transformed( select_second_mutable<StdPairRng>() ) );
  113. }
  114. template< class StdPairRng >
  115. inline select_second_const_range<StdPairRng>
  116. operator|( const StdPairRng& r, map_values_forwarder )
  117. {
  118. return operator|( r,
  119. boost::adaptors::transformed( select_second_const<StdPairRng>() ) );
  120. }
  121. } // 'range_detail'
  122. using range_detail::select_first_range;
  123. using range_detail::select_second_mutable_range;
  124. using range_detail::select_second_const_range;
  125. namespace adaptors
  126. {
  127. namespace
  128. {
  129. const range_detail::map_keys_forwarder map_keys =
  130. range_detail::map_keys_forwarder();
  131. const range_detail::map_values_forwarder map_values =
  132. range_detail::map_values_forwarder();
  133. }
  134. template<class StdPairRange>
  135. inline select_first_range<StdPairRange>
  136. keys(const StdPairRange& rng)
  137. {
  138. return select_first_range<StdPairRange>(
  139. range_detail::select_first<StdPairRange>(), rng );
  140. }
  141. template<class StdPairRange>
  142. inline select_second_const_range<StdPairRange>
  143. values(const StdPairRange& rng)
  144. {
  145. return select_second_const_range<StdPairRange>(
  146. range_detail::select_second_const<StdPairRange>(), rng );
  147. }
  148. template<class StdPairRange>
  149. inline select_second_mutable_range<StdPairRange>
  150. values(StdPairRange& rng)
  151. {
  152. return select_second_mutable_range<StdPairRange>(
  153. range_detail::select_second_mutable<StdPairRange>(), rng );
  154. }
  155. } // 'adaptors'
  156. }
  157. #endif