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 |