diff --git a/include/boost/range/adaptor/sliced.hpp b/include/boost/range/adaptor/sliced.hpp index eb506e0..5134a4c 100755 --- a/include/boost/range/adaptor/sliced.hpp +++ b/include/boost/range/adaptor/sliced.hpp @@ -38,17 +38,6 @@ namespace boost return boost::make_iterator_range( rng, t, u - boost::size(rng) ); } - template< class RandomAccessRange > - inline iterator_range< BOOST_DEDUCED_TYPENAME range_iterator::type > - slice( const 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) ); - } - template< class RandomAccessRange > inline iterator_range< BOOST_DEDUCED_TYPENAME range_iterator::type > @@ -57,14 +46,6 @@ namespace boost return adaptors::slice( r, f.t, f.u ); } - template< class RandomAccessRange > - inline iterator_range< - BOOST_DEDUCED_TYPENAME range_iterator::type > - operator|( const RandomAccessRange& r, const sliced& f ) - { - return adaptors::slice( r, f.t, f.u ); - } - } // namespace adaptors } // namespace boost diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index e555e7c..2b2466f 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -42,6 +42,7 @@ test-suite range : [ range-test adaptor_test/reversed ] [ range-test adaptor_test/sliced ] [ range-test adaptor_test/strided ] + [ range-test adaptor_test/strided2 ] [ range-test adaptor_test/tokenized ] [ range-test adaptor_test/transformed ] [ range-test adaptor_test/uniqued ] diff --git a/test/adaptor_test/strided2.cpp b/test/adaptor_test/strided2.cpp new file mode 100644 index 0000000..4ac91f5 --- /dev/null +++ b/test/adaptor_test/strided2.cpp @@ -0,0 +1,67 @@ +// Boost.Range library +// +// Copyright Neil Groves 2010. Use, modification and +// distribution is subject to the Boost Software License, Version +// 1.0. (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +// +// For more information, see http://www.boost.org/libs/range/ +// + +// This test was added due to a report that the Range Adaptors: +// 1. Caused havoc when using namespace boost::adaptors was used +// 2. Did not work with non-member functions +// 3. The strided adaptor could not be composed with sliced +// +// None of these issues could be reproduced on GCC 4.4, but this +// work makes for useful additional test coverage since this +// uses chaining of adaptors and non-member functions whereas +// most of the tests avoid this use case. + +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include + +namespace boost +{ + namespace + { + int times_two(int x) { return x * 2; } + + void strided_test2() + { + using namespace boost::adaptors; + using namespace boost::assign; + std::vector v; + boost::push_back(v, boost::irange(0,10)); + std::vector z; + boost::push_back(z, v | sliced(2,6) | strided(2) | transformed(×_two)); + std::vector reference; + reference += 4,8; + BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), + z.begin(), z.end() ); + } + } +} + +boost::unit_test::test_suite* +init_unit_test_suite(int argc, char* argv[]) +{ + boost::unit_test::test_suite* test + = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.strided2" ); + + test->add( BOOST_TEST_CASE( &boost::strided_test2 ) ); + + return test; +}