Chris@16: // Boost.Range library Chris@16: // Chris@16: // Copyright Thorsten Ottosen, Neil Groves 2006 - 2008. 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_ADAPTOR_SLICED_HPP Chris@16: #define BOOST_RANGE_ADAPTOR_SLICED_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@101: #include Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: namespace adaptors Chris@16: { Chris@16: struct sliced Chris@16: { Chris@16: sliced(std::size_t t_, std::size_t u_) Chris@16: : t(t_), u(u_) {} Chris@16: std::size_t t; Chris@16: std::size_t u; Chris@16: }; Chris@16: Chris@16: template< class RandomAccessRange > Chris@16: class sliced_range : public boost::iterator_range< BOOST_DEDUCED_TYPENAME range_iterator::type > Chris@16: { Chris@16: typedef boost::iterator_range< BOOST_DEDUCED_TYPENAME range_iterator::type > base_t; Chris@16: public: Chris@16: template Chris@16: sliced_range(Rng& rng, T t, U u) Chris@101: : base_t(boost::next(boost::begin(rng), t), Chris@101: boost::next(boost::begin(rng), u)) Chris@16: { Chris@16: } Chris@16: }; Chris@16: Chris@16: template< class RandomAccessRange > Chris@16: inline sliced_range Chris@16: slice( RandomAccessRange& rng, std::size_t t, std::size_t u ) Chris@16: { Chris@101: BOOST_RANGE_CONCEPT_ASSERT(( Chris@101: RandomAccessRangeConcept)); Chris@101: Chris@16: BOOST_ASSERT( t <= u && "error in slice indices" ); Chris@16: BOOST_ASSERT( static_cast(boost::size(rng)) >= u && Chris@16: "second slice index out of bounds" ); Chris@16: Chris@16: return sliced_range(rng, t, u); Chris@16: } Chris@16: Chris@16: template< class RandomAccessRange > Chris@16: inline iterator_range< BOOST_DEDUCED_TYPENAME range_iterator::type > Chris@16: slice( const RandomAccessRange& rng, std::size_t t, std::size_t u ) Chris@16: { Chris@101: BOOST_RANGE_CONCEPT_ASSERT(( Chris@101: RandomAccessRangeConcept)); Chris@101: Chris@16: BOOST_ASSERT( t <= u && "error in slice indices" ); Chris@16: BOOST_ASSERT( static_cast(boost::size(rng)) >= u && Chris@16: "second slice index out of bounds" ); Chris@16: Chris@16: return sliced_range(rng, t, u); Chris@16: } Chris@16: Chris@16: template< class RandomAccessRange > Chris@16: inline sliced_range Chris@16: operator|( RandomAccessRange& r, const sliced& f ) Chris@16: { Chris@101: BOOST_RANGE_CONCEPT_ASSERT(( Chris@101: RandomAccessRangeConcept)); Chris@101: Chris@16: return sliced_range( r, f.t, f.u ); Chris@16: } Chris@16: Chris@16: template< class RandomAccessRange > Chris@16: inline sliced_range Chris@16: operator|( const RandomAccessRange& r, const sliced& f ) Chris@16: { Chris@101: BOOST_RANGE_CONCEPT_ASSERT(( Chris@101: RandomAccessRangeConcept)); Chris@101: Chris@16: return sliced_range( r, f.t, f.u ); Chris@16: } Chris@16: Chris@16: } // namespace adaptors Chris@16: using adaptors::sliced_range; Chris@16: } // namespace boost Chris@16: Chris@16: #endif