288 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			288 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // Boost.Range library | ||
|  | // | ||
|  | //  Copyright Neil Groves 2009. | ||
|  | //  Copyright Thorsten Ottosen 2003-2004. 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_SUB_RANGE_HPP | ||
|  | #define BOOST_RANGE_SUB_RANGE_HPP | ||
|  | 
 | ||
|  | #include <boost/detail/workaround.hpp> | ||
|  | 
 | ||
|  | #if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1500))  | ||
|  |     #pragma warning( push ) | ||
|  |     #pragma warning( disable : 4996 ) | ||
|  | #endif | ||
|  | 
 | ||
|  | #include <boost/range/config.hpp> | ||
|  | #include <boost/range/iterator_range.hpp> | ||
|  | #include <boost/range/value_type.hpp> | ||
|  | #include <boost/range/size_type.hpp> | ||
|  | #include <boost/range/difference_type.hpp> | ||
|  | #include <boost/range/reference.hpp> | ||
|  | #include <boost/range/algorithm/equal.hpp> | ||
|  | #include <boost/assert.hpp> | ||
|  | #include <boost/type_traits/is_reference.hpp> | ||
|  | #include <boost/type_traits/remove_reference.hpp> | ||
|  | 
 | ||
|  | namespace boost | ||
|  | { | ||
|  |     namespace range_detail | ||
|  |     { | ||
|  | 
 | ||
|  | template<class ForwardRange, class TraversalTag> | ||
|  | class sub_range_base | ||
|  |         : public iterator_range< | ||
|  |             BOOST_DEDUCED_TYPENAME range_iterator<ForwardRange>::type | ||
|  |         > | ||
|  | { | ||
|  |     typedef iterator_range< | ||
|  |         BOOST_DEDUCED_TYPENAME range_iterator<ForwardRange>::type | ||
|  |     > base; | ||
|  | 
 | ||
|  | protected: | ||
|  |     typedef BOOST_DEDUCED_TYPENAME base::iterator_range_ iterator_range_; | ||
|  | 
 | ||
|  | public: | ||
|  |     typedef BOOST_DEDUCED_TYPENAME range_value<ForwardRange>::type value_type; | ||
|  |     typedef BOOST_DEDUCED_TYPENAME range_iterator<ForwardRange>::type iterator; | ||
|  |     typedef BOOST_DEDUCED_TYPENAME range_iterator<const ForwardRange>::type const_iterator; | ||
|  |     typedef BOOST_DEDUCED_TYPENAME range_difference<ForwardRange>::type difference_type; | ||
|  |     typedef BOOST_DEDUCED_TYPENAME range_size<ForwardRange>::type size_type; | ||
|  |     typedef BOOST_DEDUCED_TYPENAME range_reference<ForwardRange>::type reference; | ||
|  |     typedef BOOST_DEDUCED_TYPENAME range_reference<const ForwardRange>::type const_reference; | ||
|  | 
 | ||
|  |     sub_range_base() | ||
|  |     { | ||
|  |     } | ||
|  | 
 | ||
|  |     template<class Iterator> | ||
|  |     sub_range_base(Iterator first, Iterator last) | ||
|  |         : base(first, last) | ||
|  |     { | ||
|  |     } | ||
|  | 
 | ||
|  |     reference front() | ||
|  |     { | ||
|  |         return base::front(); | ||
|  |     } | ||
|  | 
 | ||
|  |     const_reference front() const | ||
|  |     { | ||
|  |         return base::front(); | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | template<class ForwardRange> | ||
|  | class sub_range_base<ForwardRange, bidirectional_traversal_tag> | ||
|  |         : public sub_range_base<ForwardRange, forward_traversal_tag> | ||
|  | { | ||
|  |     typedef sub_range_base<ForwardRange, forward_traversal_tag> base; | ||
|  | public: | ||
|  |     sub_range_base() | ||
|  |     { | ||
|  |     } | ||
|  | 
 | ||
|  |     template<class Iterator> | ||
|  |     sub_range_base(Iterator first, Iterator last) | ||
|  |         : base(first, last) | ||
|  |     { | ||
|  |     } | ||
|  | 
 | ||
|  |     BOOST_DEDUCED_TYPENAME base::reference back() | ||
|  |     { | ||
|  |         return base::back(); | ||
|  |     } | ||
|  | 
 | ||
|  |     BOOST_DEDUCED_TYPENAME base::const_reference back() const | ||
|  |     { | ||
|  |         return base::back(); | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | template<class ForwardRange> | ||
|  | class sub_range_base<ForwardRange, random_access_traversal_tag> | ||
|  |         : public sub_range_base<ForwardRange, bidirectional_traversal_tag> | ||
|  | { | ||
|  |     typedef sub_range_base<ForwardRange, bidirectional_traversal_tag> base; | ||
|  | 
 | ||
|  | public: | ||
|  |     sub_range_base() | ||
|  |     { | ||
|  |     } | ||
|  | 
 | ||
|  |     template<class Iterator> | ||
|  |     sub_range_base(Iterator first, Iterator last) | ||
|  |         : base(first, last) | ||
|  |     { | ||
|  |     } | ||
|  | 
 | ||
|  |     BOOST_DEDUCED_TYPENAME base::reference | ||
|  |     operator[](BOOST_DEDUCED_TYPENAME base::difference_type n) | ||
|  |     { | ||
|  |         return this->begin()[n]; | ||
|  |     } | ||
|  | 
 | ||
|  |     BOOST_DEDUCED_TYPENAME base::const_reference | ||
|  |     operator[](BOOST_DEDUCED_TYPENAME base::difference_type n) const | ||
|  |     { | ||
|  |         return this->begin()[n]; | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  |     } // namespace range_detail | ||
|  | 
 | ||
|  |     template<class ForwardRange> | ||
|  |     class sub_range | ||
|  |         : public range_detail::sub_range_base< | ||
|  |                 ForwardRange, | ||
|  |                 BOOST_DEDUCED_TYPENAME iterator_traversal< | ||
|  |                     BOOST_DEDUCED_TYPENAME range_iterator<ForwardRange>::type | ||
|  |                 >::type | ||
|  |             > | ||
|  |     { | ||
|  |         typedef BOOST_DEDUCED_TYPENAME range_iterator< | ||
|  |             ForwardRange | ||
|  |         >::type iterator_t; | ||
|  | 
 | ||
|  |         typedef range_detail::sub_range_base< | ||
|  |             ForwardRange, | ||
|  |             BOOST_DEDUCED_TYPENAME iterator_traversal< | ||
|  |                 BOOST_DEDUCED_TYPENAME range_iterator<ForwardRange>::type | ||
|  |             >::type | ||
|  |         > base; | ||
|  | 
 | ||
|  |         typedef BOOST_DEDUCED_TYPENAME base::impl impl; | ||
|  | 
 | ||
|  |     protected: | ||
|  |         typedef BOOST_DEDUCED_TYPENAME base::iterator_range_ iterator_range_; | ||
|  | 
 | ||
|  |     private: | ||
|  |         template<class Source> | ||
|  |         struct is_compatible_range | ||
|  |             : is_convertible< | ||
|  |                 BOOST_DEDUCED_TYPENAME mpl::eval_if< | ||
|  |                     has_range_iterator<Source>, | ||
|  |                     range_iterator<Source>, | ||
|  |                     mpl::identity<void> | ||
|  |                 >::type, | ||
|  |                 BOOST_DEDUCED_TYPENAME base::iterator | ||
|  |             > | ||
|  |         { | ||
|  |         }; | ||
|  | 
 | ||
|  |     public: | ||
|  |         sub_range() | ||
|  |         { } | ||
|  | 
 | ||
|  | #if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1500) )  | ||
|  |         sub_range(const sub_range& r) | ||
|  |             : base(impl::adl_begin(const_cast<base&>(static_cast<const base&>(r))), | ||
|  |                    impl::adl_end(const_cast<base&>(static_cast<const base&>(r)))) | ||
|  |         { }   | ||
|  | #endif | ||
|  | 
 | ||
|  |         template< class ForwardRange2 > | ||
|  |         sub_range( | ||
|  |             ForwardRange2& r, | ||
|  |             BOOST_DEDUCED_TYPENAME ::boost::enable_if< | ||
|  |                 is_compatible_range<ForwardRange2> | ||
|  |             >::type* = 0 | ||
|  |         ) | ||
|  |         : base(impl::adl_begin(r), impl::adl_end(r)) | ||
|  |         { | ||
|  |         } | ||
|  | 
 | ||
|  |         template< class ForwardRange2 > | ||
|  |         sub_range( | ||
|  |             const ForwardRange2& r, | ||
|  |             BOOST_DEDUCED_TYPENAME ::boost::enable_if< | ||
|  |                 is_compatible_range<const ForwardRange2> | ||
|  |             >::type* = 0 | ||
|  |         ) | ||
|  |         : base(impl::adl_begin(r), impl::adl_end(r)) | ||
|  |         { | ||
|  |         } | ||
|  | 
 | ||
|  |         BOOST_DEDUCED_TYPENAME base::const_iterator begin() const | ||
|  |         { | ||
|  |             return base::begin(); | ||
|  |         } | ||
|  | 
 | ||
|  |         BOOST_DEDUCED_TYPENAME base::iterator begin() | ||
|  |         { | ||
|  |             return base::begin(); | ||
|  |         } | ||
|  | 
 | ||
|  |         BOOST_DEDUCED_TYPENAME base::const_iterator end() const | ||
|  |         { | ||
|  |             return base::end(); | ||
|  |         } | ||
|  | 
 | ||
|  |         BOOST_DEDUCED_TYPENAME base::iterator end() | ||
|  |         { | ||
|  |             return base::end(); | ||
|  |         } | ||
|  | 
 | ||
|  |         template< class Iter > | ||
|  |         sub_range( Iter first, Iter last ) : | ||
|  |             base( first, last ) | ||
|  |         { } | ||
|  | 
 | ||
|  |         template<class ForwardRange2> | ||
|  |         BOOST_DEDUCED_TYPENAME ::boost::enable_if< | ||
|  |             is_compatible_range<ForwardRange2>, | ||
|  |             sub_range& | ||
|  |         >::type | ||
|  |         operator=(ForwardRange2& r) | ||
|  |         { | ||
|  |             iterator_range_::operator=( r ); | ||
|  |             return *this; | ||
|  |         } | ||
|  | 
 | ||
|  |         template<class ForwardRange2> | ||
|  |         BOOST_DEDUCED_TYPENAME ::boost::enable_if< | ||
|  |             is_compatible_range<const ForwardRange2>, | ||
|  |             sub_range& | ||
|  |         >::type | ||
|  |         operator=( const ForwardRange2& r ) | ||
|  |         { | ||
|  |             iterator_range_::operator=( r ); | ||
|  |             return *this; | ||
|  |         }    | ||
|  | 
 | ||
|  |         sub_range& operator=( const sub_range& r ) | ||
|  |         { | ||
|  |             iterator_range_::operator=( static_cast<const iterator_range_&>(r) ); | ||
|  |             return *this;             | ||
|  |         } | ||
|  |          | ||
|  |         sub_range& advance_begin( | ||
|  |             BOOST_DEDUCED_TYPENAME base::difference_type n) | ||
|  |         { | ||
|  |             std::advance(this->m_Begin, n); | ||
|  |             return *this; | ||
|  |         } | ||
|  |          | ||
|  |         sub_range& advance_end( | ||
|  |             BOOST_DEDUCED_TYPENAME base::difference_type n) | ||
|  |         { | ||
|  |             std::advance(this->m_End, n); | ||
|  |             return *this; | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  | } // namespace 'boost' | ||
|  | 
 | ||
|  | #if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1500))  | ||
|  |     #pragma warning( pop ) | ||
|  | #endif | ||
|  | 
 | ||
|  | #endif | ||
|  | 
 |