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@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: Chris@16: template< class ForwardRange > Chris@16: class sub_range : public iterator_range< BOOST_DEDUCED_TYPENAME range_iterator::type > Chris@16: { Chris@16: typedef BOOST_DEDUCED_TYPENAME range_iterator::type iterator_t; Chris@16: typedef iterator_range< iterator_t > base; Chris@16: Chris@16: typedef BOOST_DEDUCED_TYPENAME base::impl impl; Chris@16: public: Chris@16: typedef BOOST_DEDUCED_TYPENAME range_value::type value_type; Chris@16: typedef BOOST_DEDUCED_TYPENAME range_iterator::type iterator; Chris@16: typedef BOOST_DEDUCED_TYPENAME range_iterator::type const_iterator; Chris@16: typedef BOOST_DEDUCED_TYPENAME range_difference::type difference_type; Chris@16: typedef BOOST_DEDUCED_TYPENAME range_size::type size_type; Chris@16: typedef BOOST_DEDUCED_TYPENAME base::reference reference; Chris@16: Chris@16: public: // for return value of front/back Chris@16: typedef BOOST_DEDUCED_TYPENAME Chris@16: boost::mpl::if_< boost::is_reference, Chris@16: const BOOST_DEDUCED_TYPENAME boost::remove_reference::type&, Chris@16: reference >::type const_reference; Chris@16: Chris@16: public: Chris@16: sub_range() : base() Chris@16: { } Chris@16: Chris@16: #if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1500) ) Chris@16: sub_range( const sub_range& r ) Chris@16: : base( static_cast( r ) ) Chris@16: { } Chris@16: #endif Chris@16: Chris@16: template< class ForwardRange2 > Chris@16: sub_range( ForwardRange2& r ) : Chris@16: Chris@16: #if BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, <= 800 ) Chris@16: base( impl::adl_begin( r ), impl::adl_end( r ) ) Chris@16: #else Chris@16: base( r ) Chris@16: #endif Chris@16: { } Chris@16: Chris@16: template< class ForwardRange2 > Chris@16: sub_range( const ForwardRange2& r ) : Chris@16: Chris@16: #if BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, <= 800 ) Chris@16: base( impl::adl_begin( r ), impl::adl_end( r ) ) Chris@16: #else Chris@16: base( r ) Chris@16: #endif Chris@16: { } Chris@16: Chris@16: template< class Iter > Chris@16: sub_range( Iter first, Iter last ) : Chris@16: base( first, last ) Chris@16: { } Chris@16: Chris@16: template< class ForwardRange2 > Chris@16: sub_range& operator=( ForwardRange2& r ) Chris@16: { Chris@16: base::operator=( r ); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: template< class ForwardRange2 > Chris@16: sub_range& operator=( const ForwardRange2& r ) Chris@16: { Chris@16: base::operator=( r ); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: sub_range& operator=( const sub_range& r ) Chris@16: { Chris@16: base::operator=( static_cast(r) ); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: public: Chris@16: Chris@16: iterator begin() { return base::begin(); } Chris@16: const_iterator begin() const { return base::begin(); } Chris@16: iterator end() { return base::end(); } Chris@16: const_iterator end() const { return base::end(); } Chris@16: difference_type size() const { return base::size(); } Chris@16: Chris@16: Chris@16: public: // convenience Chris@16: reference front() Chris@16: { Chris@16: return base::front(); Chris@16: } Chris@16: Chris@16: const_reference front() const Chris@16: { Chris@16: return base::front(); Chris@16: } Chris@16: Chris@16: reference back() Chris@16: { Chris@16: return base::back(); Chris@16: } Chris@16: Chris@16: const_reference back() const Chris@16: { Chris@16: return base::back(); Chris@16: } Chris@16: Chris@16: reference operator[]( difference_type sz ) Chris@16: { Chris@16: return base::operator[](sz); Chris@16: } Chris@16: Chris@16: const_reference operator[]( difference_type sz ) const Chris@16: { Chris@16: return base::operator[](sz); Chris@16: } Chris@16: Chris@16: }; Chris@16: Chris@16: template< class ForwardRange, class ForwardRange2 > Chris@16: inline bool operator==( const sub_range& l, Chris@16: const sub_range& r ) Chris@16: { Chris@16: return boost::equal( l, r ); Chris@16: } Chris@16: Chris@16: template< class ForwardRange, class ForwardRange2 > Chris@16: inline bool operator!=( const sub_range& l, Chris@16: const sub_range& r ) Chris@16: { Chris@16: return !boost::equal( l, r ); Chris@16: } Chris@16: Chris@16: template< class ForwardRange, class ForwardRange2 > Chris@16: inline bool operator<( const sub_range& l, Chris@16: const sub_range& r ) Chris@16: { Chris@16: return iterator_range_detail::less_than( l, r ); 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: