205 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			205 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								// 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 <boost/range/adaptor/transformed.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/range/iterator_range.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/range/value_type.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/range/reference.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/range/concepts.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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<const Map>::type argument_type;
							 | 
						||
| 
								 | 
							
								            typedef const BOOST_DEDUCED_TYPENAME range_value<const Map>::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<Map>::type argument_type;
							 | 
						||
| 
								 | 
							
								            typedef BOOST_DEDUCED_TYPENAME range_value<Map>::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<const Map>::type argument_type;
							 | 
						||
| 
								 | 
							
								            typedef const BOOST_DEDUCED_TYPENAME range_value<const Map>::type::second_type& result_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            result_type operator()( argument_type r ) const
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return r.second;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template<class StdPairRng>
							 | 
						||
| 
								 | 
							
								        class select_first_range
							 | 
						||
| 
								 | 
							
								            : public transformed_range<
							 | 
						||
| 
								 | 
							
								                        select_first<StdPairRng>,
							 | 
						||
| 
								 | 
							
								                        const StdPairRng>
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            typedef transformed_range<select_first<StdPairRng>, const StdPairRng> base;
							 | 
						||
| 
								 | 
							
								        public:
							 | 
						||
| 
								 | 
							
								            typedef select_first<StdPairRng> 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 StdPairRng>
							 | 
						||
| 
								 | 
							
								        class select_second_mutable_range
							 | 
						||
| 
								 | 
							
								            : public transformed_range<
							 | 
						||
| 
								 | 
							
								                        select_second_mutable<StdPairRng>,
							 | 
						||
| 
								 | 
							
								                        StdPairRng>
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            typedef transformed_range<select_second_mutable<StdPairRng>, StdPairRng> base;
							 | 
						||
| 
								 | 
							
								        public:
							 | 
						||
| 
								 | 
							
								            typedef select_second_mutable<StdPairRng> 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 StdPairRng>
							 | 
						||
| 
								 | 
							
								        class select_second_const_range
							 | 
						||
| 
								 | 
							
								            : public transformed_range<
							 | 
						||
| 
								 | 
							
								                        select_second_const<StdPairRng>,
							 | 
						||
| 
								 | 
							
								                        const StdPairRng>
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            typedef transformed_range<select_second_const<StdPairRng>, const StdPairRng> base;
							 | 
						||
| 
								 | 
							
								        public:
							 | 
						||
| 
								 | 
							
								            typedef select_second_const<StdPairRng> 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<StdPairRng>
							 | 
						||
| 
								 | 
							
								        operator|( const StdPairRng& r, map_keys_forwarder )
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            BOOST_RANGE_CONCEPT_ASSERT((
							 | 
						||
| 
								 | 
							
								                SinglePassRangeConcept<const StdPairRng>));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return operator|( r,
							 | 
						||
| 
								 | 
							
								                boost::adaptors::transformed( select_first<StdPairRng>() ) );
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template< class StdPairRng >
							 | 
						||
| 
								 | 
							
								        inline select_second_mutable_range<StdPairRng>
							 | 
						||
| 
								 | 
							
								        operator|( StdPairRng& r, map_values_forwarder )
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            BOOST_RANGE_CONCEPT_ASSERT((SinglePassRangeConcept<StdPairRng>));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return operator|( r,
							 | 
						||
| 
								 | 
							
								                boost::adaptors::transformed( select_second_mutable<StdPairRng>() ) );
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template< class StdPairRng >
							 | 
						||
| 
								 | 
							
								        inline select_second_const_range<StdPairRng>
							 | 
						||
| 
								 | 
							
								        operator|( const StdPairRng& r, map_values_forwarder )
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            BOOST_RANGE_CONCEPT_ASSERT((
							 | 
						||
| 
								 | 
							
								                SinglePassRangeConcept<const StdPairRng>));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return operator|( r,
							 | 
						||
| 
								 | 
							
								                boost::adaptors::transformed( select_second_const<StdPairRng>() ) );
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    } // '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<class StdPairRange>
							 | 
						||
| 
								 | 
							
								        inline select_first_range<StdPairRange>
							 | 
						||
| 
								 | 
							
								        keys(const StdPairRange& rng)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            BOOST_RANGE_CONCEPT_ASSERT((
							 | 
						||
| 
								 | 
							
								                SinglePassRangeConcept<const StdPairRange>));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return select_first_range<StdPairRange>(
							 | 
						||
| 
								 | 
							
								                range_detail::select_first<StdPairRange>(), rng );
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template<class StdPairRange>
							 | 
						||
| 
								 | 
							
								        inline select_second_const_range<StdPairRange>
							 | 
						||
| 
								 | 
							
								        values(const StdPairRange& rng)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            BOOST_RANGE_CONCEPT_ASSERT((
							 | 
						||
| 
								 | 
							
								                SinglePassRangeConcept<const StdPairRange>));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return select_second_const_range<StdPairRange>(
							 | 
						||
| 
								 | 
							
								                range_detail::select_second_const<StdPairRange>(), rng );
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        template<class StdPairRange>
							 | 
						||
| 
								 | 
							
								        inline select_second_mutable_range<StdPairRange>
							 | 
						||
| 
								 | 
							
								        values(StdPairRange& rng)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            BOOST_RANGE_CONCEPT_ASSERT((SinglePassRangeConcept<StdPairRange>));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return select_second_mutable_range<StdPairRange>(
							 | 
						||
| 
								 | 
							
								                range_detail::select_second_mutable<StdPairRange>(), rng );
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    } // 'adaptors'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 |