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
							 | 
						||
| 
								 | 
							
								
							 |