205 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			205 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| //  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_ANY_RANGE_HPP_INCLUDED
 | |
| #define BOOST_RANGE_ANY_RANGE_HPP_INCLUDED
 | |
| 
 | |
| #include <boost/config.hpp>
 | |
| #include <boost/iterator/iterator_categories.hpp>
 | |
| #include <boost/iterator/iterator_traits.hpp>
 | |
| #include <boost/iterator/iterator_facade.hpp>
 | |
| #include <boost/iterator/iterator_adaptor.hpp>
 | |
| #include <boost/range/detail/any_iterator.hpp>
 | |
| #include <boost/range/concepts.hpp>
 | |
| #include <boost/range/reference.hpp>
 | |
| #include <boost/range/value_type.hpp>
 | |
| #include <boost/range/iterator_range_core.hpp>
 | |
| 
 | |
| namespace boost
 | |
| {
 | |
|     namespace range_detail
 | |
|     {
 | |
|         // If T is use_default, return the result of Default, otherwise
 | |
|         // return T.
 | |
|         //
 | |
|         // This is an implementation artifact used to pick intelligent default
 | |
|         // values when the user specified boost::use_default as a template
 | |
|         // parameter.
 | |
|         template<
 | |
|             class T,
 | |
|             class Default
 | |
|         >
 | |
|         struct any_range_default_help
 | |
|             : mpl::eval_if<
 | |
|                 is_same<T, use_default>
 | |
|               , Default
 | |
|               , mpl::identity<T>
 | |
|             >
 | |
|         {
 | |
|         };
 | |
| 
 | |
|         template<
 | |
|             class WrappedRange
 | |
|           , class Value
 | |
|           , class Reference
 | |
|         >
 | |
|         struct any_range_value_type
 | |
|         {
 | |
| # ifdef BOOST_ITERATOR_REF_CONSTNESS_KILLS_WRITABILITY
 | |
|             typedef typename any_range_default_help<
 | |
|                     Value
 | |
|                   , mpl::eval_if<
 | |
|                         is_same<Reference, use_default>
 | |
|                       , range_value<
 | |
|                             typename remove_const<WrappedRange>
 | |
|                         ::type>
 | |
|                       , remove_reference<Reference>
 | |
|                     >
 | |
|                 >::type type;
 | |
| # else
 | |
|             typedef typename any_range_default_help<
 | |
|                 Value
 | |
|               , range_value<
 | |
|                     typename remove_const<WrappedRange>
 | |
|                 ::type>
 | |
|             >::type type;
 | |
| # endif
 | |
|         };
 | |
| 
 | |
|         template<
 | |
|             class Value
 | |
|           , class Traversal
 | |
|           , class Reference = Value&
 | |
|           , class Difference = std::ptrdiff_t
 | |
|           , class Buffer = use_default
 | |
|         >
 | |
|         class any_range
 | |
|             : public iterator_range<
 | |
|                         any_iterator<
 | |
|                             Value
 | |
|                           , Traversal
 | |
|                           , Reference
 | |
|                           , Difference
 | |
|                           , typename any_range_default_help<
 | |
|                                 Buffer
 | |
|                               , mpl::identity<any_iterator_default_buffer>
 | |
|                             >::type
 | |
|                         >
 | |
|                     >
 | |
|         {
 | |
|             typedef iterator_range<
 | |
|                         any_iterator<
 | |
|                             Value
 | |
|                           , Traversal
 | |
|                           , Reference
 | |
|                           , Difference
 | |
|                           , typename any_range_default_help<
 | |
|                                 Buffer
 | |
|                               , mpl::identity<any_iterator_default_buffer>
 | |
|                             >::type
 | |
|                         >
 | |
|                     > base_type;
 | |
| 
 | |
|             struct enabler {};
 | |
|             struct disabler {};
 | |
|         public:
 | |
|             any_range()
 | |
|             {
 | |
|             }
 | |
| 
 | |
|             any_range(const any_range& other)
 | |
|                 : base_type(other)
 | |
|             {
 | |
|             }
 | |
| 
 | |
|             template<class WrappedRange>
 | |
|             any_range(WrappedRange& wrapped_range)
 | |
|             : base_type(boost::begin(wrapped_range),
 | |
|                         boost::end(wrapped_range))
 | |
|             {
 | |
|             }
 | |
| 
 | |
|             template<class WrappedRange>
 | |
|             any_range(const WrappedRange& wrapped_range)
 | |
|             : base_type(boost::begin(wrapped_range),
 | |
|                         boost::end(wrapped_range))
 | |
|             {
 | |
|             }
 | |
| 
 | |
|             template<
 | |
|                 class OtherValue
 | |
|               , class OtherTraversal
 | |
|               , class OtherReference
 | |
|               , class OtherDifference
 | |
|             >
 | |
|             any_range(const any_range<
 | |
|                                 OtherValue
 | |
|                               , OtherTraversal
 | |
|                               , OtherReference
 | |
|                               , OtherDifference
 | |
|                               , Buffer
 | |
|                             >& other)
 | |
|             : base_type(boost::begin(other), boost::end(other))
 | |
|             {
 | |
|             }
 | |
| 
 | |
|             template<class Iterator>
 | |
|             any_range(Iterator first, Iterator last)
 | |
|                 : base_type(first, last)
 | |
|             {
 | |
|             }
 | |
|         };
 | |
| 
 | |
|         template<
 | |
|             class WrappedRange
 | |
|           , class Value = use_default
 | |
|           , class Traversal = use_default
 | |
|           , class Reference = use_default
 | |
|           , class Difference = use_default
 | |
|           , class Buffer = use_default
 | |
|         >
 | |
|         struct any_range_type_generator
 | |
|         {
 | |
|             BOOST_RANGE_CONCEPT_ASSERT(( SinglePassRangeConcept<WrappedRange> ));
 | |
|             typedef any_range<
 | |
|                 typename any_range_value_type<
 | |
|                     WrappedRange
 | |
|                   , Value
 | |
|                   , typename any_range_default_help<
 | |
|                         Reference
 | |
|                       , range_reference<WrappedRange>
 | |
|                     >::type
 | |
|                 >::type
 | |
|               , typename any_range_default_help<
 | |
|                             Traversal
 | |
|                           , iterator_traversal<
 | |
|                                 typename range_iterator<WrappedRange>::type
 | |
|                             >
 | |
|                         >::type
 | |
|               , typename any_range_default_help<
 | |
|                     Reference
 | |
|                   , range_reference<WrappedRange>
 | |
|                 >::type
 | |
|               , typename any_range_default_help<
 | |
|                     Difference
 | |
|                   , range_difference<WrappedRange>
 | |
|                 >::type
 | |
|               , typename any_range_default_help<
 | |
|                     Buffer
 | |
|                   , mpl::identity<any_iterator_default_buffer>
 | |
|                 >::type
 | |
|             > type;
 | |
|         };
 | |
|     } // namespace range_detail
 | |
| 
 | |
|     using range_detail::any_range;
 | |
|     using range_detail::any_range_type_generator;
 | |
| } // namespace boost
 | |
| 
 | |
| #endif // include guard
 | 
