williamr@2: // Boost.Range library williamr@2: // williamr@2: // Copyright Thorsten Ottosen 2003-2004. Use, modification and williamr@2: // distribution is subject to the Boost Software License, Version williamr@2: // 1.0. (See accompanying file LICENSE_1_0.txt or copy at williamr@2: // http://www.boost.org/LICENSE_1_0.txt) williamr@2: // williamr@2: // For more information, see http://www.boost.org/libs/range/ williamr@2: // williamr@2: williamr@2: #ifndef BOOST_RANGE_SUB_RANGE_HPP williamr@2: #define BOOST_RANGE_SUB_RANGE_HPP williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: namespace boost williamr@2: { williamr@2: williamr@2: template< class ForwardRange > williamr@2: class sub_range : public iterator_range< BOOST_DEDUCED_TYPENAME range_result_iterator::type > williamr@2: { williamr@2: typedef BOOST_DEDUCED_TYPENAME range_result_iterator::type iterator_t; williamr@2: typedef iterator_range< iterator_t > base; williamr@2: williamr@2: typedef BOOST_DEDUCED_TYPENAME base::impl impl; williamr@2: public: williamr@2: typedef BOOST_DEDUCED_TYPENAME range_value::type value_type; williamr@2: typedef BOOST_DEDUCED_TYPENAME range_result_iterator::type iterator; williamr@2: typedef BOOST_DEDUCED_TYPENAME range_const_iterator::type const_iterator; williamr@2: typedef BOOST_DEDUCED_TYPENAME range_difference::type difference_type; williamr@2: typedef BOOST_DEDUCED_TYPENAME range_size::type size_type; williamr@2: typedef BOOST_DEDUCED_TYPENAME base::reference reference; williamr@2: typedef BOOST_DEDUCED_TYPENAME iterator_reference::type const_reference; williamr@2: williamr@2: public: williamr@2: sub_range() : base() williamr@2: { } williamr@2: williamr@2: /* williamr@2: template< class ForwardRange2 > williamr@2: sub_range( sub_range r ) : williamr@2: williamr@2: #if BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, <= 800 ) williamr@2: base( impl::adl_begin( r ), impl::adl_end( r ) ) williamr@2: #else williamr@2: base( r ) williamr@2: #endif */ williamr@2: williamr@2: template< class ForwardRange2 > williamr@2: sub_range( ForwardRange2& r ) : williamr@2: williamr@2: #if BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, <= 800 ) williamr@2: base( impl::adl_begin( r ), impl::adl_end( r ) ) williamr@2: #else williamr@2: base( r ) williamr@2: #endif williamr@2: { } williamr@2: williamr@2: template< class ForwardRange2 > williamr@2: sub_range( const ForwardRange2& r ) : williamr@2: williamr@2: #if BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, <= 800 ) williamr@2: base( impl::adl_begin( r ), impl::adl_end( r ) ) williamr@2: #else williamr@2: base( r ) williamr@2: #endif williamr@2: { } williamr@2: williamr@2: template< class Iter > williamr@2: sub_range( Iter first, Iter last ) : williamr@2: base( first, last ) williamr@2: { } williamr@2: williamr@2: template< class ForwardRange2 > williamr@2: sub_range& operator=( ForwardRange2& r ) williamr@2: { williamr@2: base::operator=( r ); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: template< class ForwardRange2 > williamr@2: sub_range& operator=( const ForwardRange2& r ) williamr@2: { williamr@2: base::operator=( r ); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: sub_range& operator=( sub_range r ) williamr@2: { williamr@2: // williamr@2: // argument passed by value to avoid williamr@2: // const_iterator to iterator conversion williamr@2: // williamr@2: base::operator=( r ); williamr@2: return *this; williamr@2: } williamr@2: williamr@2: public: williamr@2: williamr@2: iterator begin() { return base::begin(); } williamr@2: const_iterator begin() const { return base::begin(); } williamr@2: iterator end() { return base::end(); } williamr@2: const_iterator end() const { return base::end(); } williamr@2: size_type size() const { return base::size(); } williamr@2: williamr@2: williamr@2: public: // convenience williamr@2: reference front() williamr@2: { williamr@2: return base::front(); williamr@2: } williamr@2: williamr@2: const_reference front() const williamr@2: { williamr@2: return base::front(); williamr@2: } williamr@2: williamr@2: reference back() williamr@2: { williamr@2: return base::back(); williamr@2: } williamr@2: williamr@2: const_reference back() const williamr@2: { williamr@2: return base::back(); williamr@2: } williamr@2: williamr@2: reference operator[]( size_type sz ) williamr@2: { williamr@2: return base::operator[](sz); williamr@2: } williamr@2: williamr@2: const_reference operator[]( size_type sz ) const williamr@2: { williamr@2: return base::operator[](sz); williamr@2: } williamr@2: williamr@2: }; williamr@2: williamr@2: template< class ForwardRange, class ForwardRange2 > williamr@2: inline bool operator==( const sub_range& l, williamr@2: const sub_range& r ) williamr@2: { williamr@2: return iterator_range_detail::equal( l, r ); williamr@2: } williamr@2: williamr@2: template< class ForwardRange, class ForwardRange2 > williamr@2: inline bool operator!=( const sub_range& l, williamr@2: const sub_range& r ) williamr@2: { williamr@2: return !iterator_range_detail::equal( l, r ); williamr@2: } williamr@2: williamr@2: template< class ForwardRange, class ForwardRange2 > williamr@2: inline bool operator<( const sub_range& l, williamr@2: const sub_range& r ) williamr@2: { williamr@2: return iterator_range_detail::less_than( l, r ); williamr@2: } williamr@2: williamr@2: williamr@2: } // namespace 'boost' williamr@2: williamr@2: #endif