diff --git a/include/boost/range/adaptor/sliced.hpp b/include/boost/range/adaptor/sliced.hpp index eb506e0..03c6894 100755 --- a/include/boost/range/adaptor/sliced.hpp +++ b/include/boost/range/adaptor/sliced.hpp @@ -28,14 +28,26 @@ namespace boost }; template< class RandomAccessRange > - inline iterator_range< BOOST_DEDUCED_TYPENAME range_iterator::type > + class sliced_range : public boost::iterator_range< BOOST_DEDUCED_TYPENAME range_iterator::type > + { + typedef boost::iterator_range< BOOST_DEDUCED_TYPENAME range_iterator::type > base_t; + public: + template + sliced_range(Rng& rng, T t, U u) + : base_t(boost::make_iterator_range(rng, t, u - boost::size(rng))) + { + } + }; + + template< class RandomAccessRange > + inline sliced_range slice( RandomAccessRange& rng, std::size_t t, std::size_t u ) { BOOST_ASSERT( t <= u && "error in slice indices" ); BOOST_ASSERT( static_cast(boost::size(rng)) >= u && "second slice index out of bounds" ); - return boost::make_iterator_range( rng, t, u - boost::size(rng) ); + return sliced_range(rng, t, u); } template< class RandomAccessRange > @@ -46,23 +58,21 @@ namespace boost BOOST_ASSERT( static_cast(boost::size(rng)) >= u && "second slice index out of bounds" ); - return boost::make_iterator_range( rng, t, u - boost::size(rng) ); + return sliced_range(rng, t, u); } template< class RandomAccessRange > - inline iterator_range< - BOOST_DEDUCED_TYPENAME range_iterator::type > + inline sliced_range operator|( RandomAccessRange& r, const sliced& f ) { - return adaptors::slice( r, f.t, f.u ); + return sliced_range( r, f.t, f.u ); } template< class RandomAccessRange > - inline iterator_range< - BOOST_DEDUCED_TYPENAME range_iterator::type > + inline sliced_range operator|( const RandomAccessRange& r, const sliced& f ) { - return adaptors::slice( r, f.t, f.u ); + return sliced_range( r, f.t, f.u ); } } // namespace adaptors