// Boost.Range library // // Copyright Thorsten Ottosen, Neil Groves 2006 - 2008. Use, modification and // distribution is subject to the Boost Software License, Version // 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // For more information, see http://www.boost.org/libs/range/ // #ifndef BOOST_RANGE_ADAPTOR_MAP_HPP #define BOOST_RANGE_ADAPTOR_MAP_HPP #include #include #include #include #include namespace boost { namespace range_detail { struct map_keys_forwarder {}; struct map_values_forwarder {}; template< class Map > struct select_first { typedef BOOST_DEDUCED_TYPENAME range_reference::type argument_type; typedef const BOOST_DEDUCED_TYPENAME range_value::type::first_type& result_type; result_type operator()( argument_type r ) const { return r.first; } }; template< class Map > struct select_second_mutable { typedef BOOST_DEDUCED_TYPENAME range_reference::type argument_type; typedef BOOST_DEDUCED_TYPENAME range_value::type::second_type& result_type; result_type operator()( argument_type r ) const { return r.second; } }; template< class Map > struct select_second_const { typedef BOOST_DEDUCED_TYPENAME range_reference::type argument_type; typedef const BOOST_DEDUCED_TYPENAME range_value::type::second_type& result_type; result_type operator()( argument_type r ) const { return r.second; } }; template class select_first_range : public transformed_range< select_first, const StdPairRng> { typedef transformed_range, const StdPairRng> base; public: typedef select_first transform_fn_type; typedef const StdPairRng source_range_type; select_first_range(transform_fn_type fn, source_range_type& rng) : base(fn, rng) { } select_first_range(const base& other) : base(other) {} }; template class select_second_mutable_range : public transformed_range< select_second_mutable, StdPairRng> { typedef transformed_range, StdPairRng> base; public: typedef select_second_mutable transform_fn_type; typedef StdPairRng source_range_type; select_second_mutable_range(transform_fn_type fn, source_range_type& rng) : base(fn, rng) { } select_second_mutable_range(const base& other) : base(other) {} }; template class select_second_const_range : public transformed_range< select_second_const, const StdPairRng> { typedef transformed_range, const StdPairRng> base; public: typedef select_second_const transform_fn_type; typedef const StdPairRng source_range_type; select_second_const_range(transform_fn_type fn, source_range_type& rng) : base(fn, rng) { } select_second_const_range(const base& other) : base(other) {} }; template< class StdPairRng > inline select_first_range operator|( const StdPairRng& r, map_keys_forwarder ) { BOOST_RANGE_CONCEPT_ASSERT(( SinglePassRangeConcept)); return operator|( r, boost::adaptors::transformed( select_first() ) ); } template< class StdPairRng > inline select_second_mutable_range operator|( StdPairRng& r, map_values_forwarder ) { BOOST_RANGE_CONCEPT_ASSERT((SinglePassRangeConcept)); return operator|( r, boost::adaptors::transformed( select_second_mutable() ) ); } template< class StdPairRng > inline select_second_const_range operator|( const StdPairRng& r, map_values_forwarder ) { BOOST_RANGE_CONCEPT_ASSERT(( SinglePassRangeConcept)); return operator|( r, boost::adaptors::transformed( select_second_const() ) ); } } // 'range_detail' using range_detail::select_first_range; using range_detail::select_second_mutable_range; using range_detail::select_second_const_range; namespace adaptors { namespace { const range_detail::map_keys_forwarder map_keys = range_detail::map_keys_forwarder(); const range_detail::map_values_forwarder map_values = range_detail::map_values_forwarder(); } template inline select_first_range keys(const StdPairRange& rng) { BOOST_RANGE_CONCEPT_ASSERT(( SinglePassRangeConcept)); return select_first_range( range_detail::select_first(), rng ); } template inline select_second_const_range values(const StdPairRange& rng) { BOOST_RANGE_CONCEPT_ASSERT(( SinglePassRangeConcept)); return select_second_const_range( range_detail::select_second_const(), rng ); } template inline select_second_mutable_range values(StdPairRange& rng) { BOOST_RANGE_CONCEPT_ASSERT((SinglePassRangeConcept)); return select_second_mutable_range( range_detail::select_second_mutable(), rng ); } } // 'adaptors' } #endif