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