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
 | 
