197 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			197 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // Boost.Range library | ||
|  | // | ||
|  | //  Copyright Neil Groves 2010. 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_TYPE_ERASED_HPP_INCLUDED | ||
|  | #define BOOST_RANGE_ADAPTOR_TYPE_ERASED_HPP_INCLUDED | ||
|  | 
 | ||
|  | #include <boost/range/reference.hpp> | ||
|  | #include <boost/range/value_type.hpp> | ||
|  | #include <boost/range/iterator_range_core.hpp> | ||
|  | #include <boost/range/any_range.hpp> | ||
|  | #include <boost/range/concepts.hpp> | ||
|  | 
 | ||
|  | namespace boost | ||
|  | { | ||
|  |     namespace adaptors | ||
|  |     { | ||
|  |         template< | ||
|  |             class Value = use_default | ||
|  |           , class Traversal = use_default | ||
|  |           , class Reference = use_default | ||
|  |           , class Difference = use_default | ||
|  |           , class Buffer = use_default | ||
|  |         > | ||
|  |         struct type_erased | ||
|  |         { | ||
|  |         }; | ||
|  | 
 | ||
|  |         template< | ||
|  |             class SinglePassRange | ||
|  |           , class Value | ||
|  |           , class Traversal | ||
|  |           , class Reference | ||
|  |           , class Difference | ||
|  |           , class Buffer | ||
|  |         > | ||
|  |         typename any_range_type_generator< | ||
|  |             SinglePassRange | ||
|  |           , Value | ||
|  |           , Traversal | ||
|  |           , Reference | ||
|  |           , Difference | ||
|  |           , Buffer | ||
|  |         >::type | ||
|  |         operator|(SinglePassRange& rng, | ||
|  |                   type_erased< | ||
|  |                         Value | ||
|  |                       , Traversal | ||
|  |                       , Reference | ||
|  |                       , Difference | ||
|  |                       , Buffer | ||
|  |                     >) | ||
|  |         { | ||
|  |             BOOST_RANGE_CONCEPT_ASSERT(( | ||
|  |                 SinglePassRangeConcept<SinglePassRange>)); | ||
|  | 
 | ||
|  |             typedef typename any_range_type_generator< | ||
|  |                 SinglePassRange | ||
|  |               , Value | ||
|  |               , Traversal | ||
|  |               , Reference | ||
|  |               , Difference | ||
|  |               , Buffer | ||
|  |             >::type range_type; | ||
|  |             return range_type(boost::begin(rng), boost::end(rng)); | ||
|  |         } | ||
|  | 
 | ||
|  |         template< | ||
|  |             class SinglePassRange | ||
|  |           , class Value | ||
|  |           , class Traversal | ||
|  |           , class Reference | ||
|  |           , class Difference | ||
|  |           , class Buffer | ||
|  |         > | ||
|  |         typename any_range_type_generator< | ||
|  |             const SinglePassRange | ||
|  |           , Value | ||
|  |           , Traversal | ||
|  |           , Reference | ||
|  |           , Difference | ||
|  |           , Buffer | ||
|  |         >::type | ||
|  |         operator|(const SinglePassRange& rng, | ||
|  |                   type_erased< | ||
|  |                             Value | ||
|  |                           , Traversal | ||
|  |                           , Reference | ||
|  |                           , Difference | ||
|  |                           , Buffer | ||
|  |                     >) | ||
|  |         { | ||
|  |             BOOST_RANGE_CONCEPT_ASSERT(( | ||
|  |                 SinglePassRangeConcept<const SinglePassRange>)); | ||
|  | 
 | ||
|  |             typedef typename any_range_type_generator< | ||
|  |                 const SinglePassRange | ||
|  |               , Value | ||
|  |               , Traversal | ||
|  |               , Reference | ||
|  |               , Difference | ||
|  |               , Buffer | ||
|  |             >::type range_type; | ||
|  |             return range_type(boost::begin(rng), boost::end(rng)); | ||
|  |         } | ||
|  | 
 | ||
|  |         template< | ||
|  |             class SinglePassRange | ||
|  |           , class Value | ||
|  |           , class Traversal | ||
|  |           , class Reference | ||
|  |           , class Difference | ||
|  |           , class Buffer | ||
|  |         > | ||
|  |         typename any_range_type_generator< | ||
|  |             SinglePassRange | ||
|  |           , Value | ||
|  |           , Traversal | ||
|  |           , Reference | ||
|  |           , Difference | ||
|  |           , Buffer | ||
|  |         >::type | ||
|  |         type_erase(SinglePassRange& rng | ||
|  |                  , type_erased< | ||
|  |                             Value | ||
|  |                           , Traversal | ||
|  |                           , Reference | ||
|  |                           , Difference | ||
|  |                           , Buffer | ||
|  |                     > = type_erased<>() | ||
|  |                 ) | ||
|  |         { | ||
|  |             BOOST_RANGE_CONCEPT_ASSERT(( | ||
|  |                 SinglePassRangeConcept<SinglePassRange>)); | ||
|  | 
 | ||
|  |             typedef typename any_range_type_generator< | ||
|  |                 SinglePassRange | ||
|  |               , Value | ||
|  |               , Traversal | ||
|  |               , Reference | ||
|  |               , Difference | ||
|  |               , Buffer | ||
|  |             >::type range_type; | ||
|  | 
 | ||
|  |             return range_type(boost::begin(rng), boost::end(rng)); | ||
|  |         } | ||
|  | 
 | ||
|  |         template< | ||
|  |             class SinglePassRange | ||
|  |           , class Value | ||
|  |           , class Traversal | ||
|  |           , class Reference | ||
|  |           , class Difference | ||
|  |           , class Buffer | ||
|  |         > | ||
|  |         typename any_range_type_generator< | ||
|  |             const SinglePassRange | ||
|  |           , Value | ||
|  |           , Traversal | ||
|  |           , Reference | ||
|  |           , Difference | ||
|  |           , Buffer | ||
|  |         >::type | ||
|  |         type_erase(const SinglePassRange& rng | ||
|  |                  , type_erased< | ||
|  |                             Value | ||
|  |                           , Traversal | ||
|  |                           , Reference | ||
|  |                           , Difference | ||
|  |                           , Buffer | ||
|  |                     > = type_erased<>() | ||
|  |                 ) | ||
|  |         { | ||
|  |             BOOST_RANGE_CONCEPT_ASSERT(( | ||
|  |                 SinglePassRangeConcept<const SinglePassRange>)); | ||
|  | 
 | ||
|  |             typedef typename any_range_type_generator< | ||
|  |                 const SinglePassRange | ||
|  |               , Value | ||
|  |               , Traversal | ||
|  |               , Reference | ||
|  |               , Difference | ||
|  |               , Buffer | ||
|  |             >::type range_type; | ||
|  | 
 | ||
|  |             return range_type(boost::begin(rng), boost::end(rng)); | ||
|  |         } | ||
|  |     } | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | #endif // include guard |