Chris@16: // Boost.Range library Chris@16: // Chris@16: // Copyright Neil Groves 2009. Chris@16: // Copyright Thorsten Ottosen 2003-2004. Use, modification and Chris@16: // distribution is subject to the Boost Software License, Version Chris@16: // 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: // For more information, see http://www.boost.org/libs/range/ Chris@16: // Chris@16: Chris@16: #ifndef BOOST_RANGE_SUB_RANGE_HPP Chris@16: #define BOOST_RANGE_SUB_RANGE_HPP Chris@16: Chris@16: #include Chris@16: Chris@16: #if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1500)) Chris@16: #pragma warning( push ) Chris@16: #pragma warning( disable : 4996 ) Chris@16: #endif Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@101: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost Chris@16: { Chris@101: namespace range_detail Chris@16: { Chris@101: Chris@101: template Chris@101: class sub_range_base Chris@101: : public iterator_range< Chris@101: BOOST_DEDUCED_TYPENAME range_iterator::type Chris@101: > Chris@101: { Chris@101: typedef iterator_range< Chris@101: BOOST_DEDUCED_TYPENAME range_iterator::type Chris@101: > base; Chris@101: Chris@101: protected: Chris@101: typedef BOOST_DEDUCED_TYPENAME base::iterator_range_ iterator_range_; Chris@101: Chris@101: public: Chris@101: typedef BOOST_DEDUCED_TYPENAME range_value::type value_type; Chris@101: typedef BOOST_DEDUCED_TYPENAME range_iterator::type iterator; Chris@101: typedef BOOST_DEDUCED_TYPENAME range_iterator::type const_iterator; Chris@101: typedef BOOST_DEDUCED_TYPENAME range_difference::type difference_type; Chris@101: typedef BOOST_DEDUCED_TYPENAME range_size::type size_type; Chris@101: typedef BOOST_DEDUCED_TYPENAME range_reference::type reference; Chris@101: typedef BOOST_DEDUCED_TYPENAME range_reference::type const_reference; Chris@101: Chris@101: sub_range_base() Chris@101: { Chris@101: } Chris@101: Chris@101: template Chris@101: sub_range_base(Iterator first, Iterator last) Chris@101: : base(first, last) Chris@101: { Chris@101: } Chris@101: Chris@101: reference front() Chris@101: { Chris@101: return base::front(); Chris@101: } Chris@101: Chris@101: const_reference front() const Chris@101: { Chris@101: return base::front(); Chris@101: } Chris@101: }; Chris@101: Chris@101: template Chris@101: class sub_range_base Chris@101: : public sub_range_base Chris@101: { Chris@101: typedef sub_range_base base; Chris@101: public: Chris@101: sub_range_base() Chris@101: { Chris@101: } Chris@101: Chris@101: template Chris@101: sub_range_base(Iterator first, Iterator last) Chris@101: : base(first, last) Chris@101: { Chris@101: } Chris@101: Chris@101: BOOST_DEDUCED_TYPENAME base::reference back() Chris@101: { Chris@101: return base::back(); Chris@101: } Chris@101: Chris@101: BOOST_DEDUCED_TYPENAME base::const_reference back() const Chris@101: { Chris@101: return base::back(); Chris@101: } Chris@101: }; Chris@101: Chris@101: template Chris@101: class sub_range_base Chris@101: : public sub_range_base Chris@101: { Chris@101: typedef sub_range_base base; Chris@101: Chris@101: public: Chris@101: sub_range_base() Chris@101: { Chris@101: } Chris@101: Chris@101: template Chris@101: sub_range_base(Iterator first, Iterator last) Chris@101: : base(first, last) Chris@101: { Chris@101: } Chris@101: Chris@101: BOOST_DEDUCED_TYPENAME base::reference Chris@101: operator[](BOOST_DEDUCED_TYPENAME base::difference_type n) Chris@101: { Chris@101: return this->begin()[n]; Chris@101: } Chris@101: Chris@101: BOOST_DEDUCED_TYPENAME base::const_reference Chris@101: operator[](BOOST_DEDUCED_TYPENAME base::difference_type n) const Chris@101: { Chris@101: return this->begin()[n]; Chris@101: } Chris@101: }; Chris@101: Chris@101: } // namespace range_detail Chris@101: Chris@101: template Chris@101: class sub_range Chris@101: : public range_detail::sub_range_base< Chris@101: ForwardRange, Chris@101: BOOST_DEDUCED_TYPENAME iterator_traversal< Chris@101: BOOST_DEDUCED_TYPENAME range_iterator::type Chris@101: >::type Chris@101: > Chris@101: { Chris@101: typedef BOOST_DEDUCED_TYPENAME range_iterator< Chris@101: ForwardRange Chris@101: >::type iterator_t; Chris@101: Chris@101: typedef range_detail::sub_range_base< Chris@101: ForwardRange, Chris@101: BOOST_DEDUCED_TYPENAME iterator_traversal< Chris@101: BOOST_DEDUCED_TYPENAME range_iterator::type Chris@101: >::type Chris@101: > base; Chris@16: Chris@16: typedef BOOST_DEDUCED_TYPENAME base::impl impl; Chris@101: Chris@101: protected: Chris@101: typedef BOOST_DEDUCED_TYPENAME base::iterator_range_ iterator_range_; Chris@101: Chris@101: private: Chris@101: template Chris@101: struct is_compatible_range Chris@101: : is_convertible< Chris@101: BOOST_DEDUCED_TYPENAME mpl::eval_if< Chris@101: has_range_iterator, Chris@101: range_iterator, Chris@101: mpl::identity Chris@101: >::type, Chris@101: BOOST_DEDUCED_TYPENAME base::iterator Chris@101: > Chris@101: { Chris@101: }; Chris@16: Chris@16: public: Chris@101: sub_range() Chris@16: { } Chris@101: Chris@16: #if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1500) ) Chris@101: sub_range(const sub_range& r) Chris@101: : base(impl::adl_begin(static_cast(r)), Chris@101: impl::adl_end(static_cast(r))) Chris@16: { } Chris@16: #endif Chris@16: Chris@16: template< class ForwardRange2 > Chris@101: sub_range( Chris@101: ForwardRange2& r, Chris@101: BOOST_DEDUCED_TYPENAME ::boost::enable_if< Chris@101: is_compatible_range Chris@101: >::type* = 0 Chris@101: ) Chris@101: : base(impl::adl_begin(r), impl::adl_end(r)) Chris@101: { Chris@101: } Chris@101: Chris@16: template< class ForwardRange2 > Chris@101: sub_range( Chris@101: const ForwardRange2& r, Chris@101: BOOST_DEDUCED_TYPENAME ::boost::enable_if< Chris@101: is_compatible_range Chris@101: >::type* = 0 Chris@101: ) Chris@101: : base(impl::adl_begin(r), impl::adl_end(r)) Chris@101: { Chris@101: } Chris@16: Chris@101: BOOST_DEDUCED_TYPENAME base::const_iterator begin() const Chris@101: { Chris@101: return base::begin(); Chris@101: } Chris@101: Chris@101: BOOST_DEDUCED_TYPENAME base::iterator begin() Chris@101: { Chris@101: return base::begin(); Chris@101: } Chris@101: Chris@101: BOOST_DEDUCED_TYPENAME base::const_iterator end() const Chris@101: { Chris@101: return base::end(); Chris@101: } Chris@101: Chris@101: BOOST_DEDUCED_TYPENAME base::iterator end() Chris@101: { Chris@101: return base::end(); Chris@101: } Chris@16: Chris@16: template< class Iter > Chris@16: sub_range( Iter first, Iter last ) : Chris@16: base( first, last ) Chris@16: { } Chris@101: Chris@101: template Chris@101: BOOST_DEDUCED_TYPENAME ::boost::enable_if< Chris@101: is_compatible_range, Chris@101: sub_range& Chris@101: >::type Chris@101: operator=(ForwardRange2& r) Chris@16: { Chris@101: iterator_range_::operator=( r ); Chris@16: return *this; Chris@16: } Chris@16: Chris@101: template Chris@101: BOOST_DEDUCED_TYPENAME ::boost::enable_if< Chris@101: is_compatible_range, Chris@101: sub_range& Chris@101: >::type Chris@101: operator=( const ForwardRange2& r ) Chris@16: { Chris@101: iterator_range_::operator=( r ); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: sub_range& operator=( const sub_range& r ) Chris@16: { Chris@101: iterator_range_::operator=( static_cast(r) ); Chris@16: return *this; Chris@16: } Chris@16: Chris@101: sub_range& advance_begin( Chris@101: BOOST_DEDUCED_TYPENAME base::difference_type n) Chris@101: { Chris@101: std::advance(this->m_Begin, n); Chris@101: return *this; Chris@101: } Chris@16: Chris@101: sub_range& advance_end( Chris@101: BOOST_DEDUCED_TYPENAME base::difference_type n) Chris@16: { Chris@101: std::advance(this->m_End, n); Chris@101: return *this; Chris@16: } Chris@16: }; Chris@16: Chris@16: } // namespace 'boost' Chris@16: Chris@16: #if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1500)) Chris@16: #pragma warning( pop ) Chris@16: #endif Chris@16: Chris@16: #endif Chris@16: