From 63acc5c633c648d51a4b6cf62b35a4fc86b97563 Mon Sep 17 00:00:00 2001 From: Neil Groves Date: Mon, 3 Mar 2014 00:10:08 +0000 Subject: [PATCH] trac 8676 sliced adaptor fixed. --- include/boost/range/adaptor/sliced.hpp | 3 +- include/boost/range/iterator_range_core.hpp | 3 - test/Jamfile.v2 | 1 + .../ticket_8676_sliced_transformed.cpp | 56 +++++++++++++++++++ 4 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 test/adaptor_test/ticket_8676_sliced_transformed.cpp diff --git a/include/boost/range/adaptor/sliced.hpp b/include/boost/range/adaptor/sliced.hpp index 14ad986..b88597d 100755 --- a/include/boost/range/adaptor/sliced.hpp +++ b/include/boost/range/adaptor/sliced.hpp @@ -34,7 +34,8 @@ namespace boost public: template sliced_range(Rng& rng, T t, U u) - : base_t(boost::make_iterator_range(rng, t, u - boost::size(rng))) + : base_t(boost::next(boost::begin(rng), t), + boost::next(boost::begin(rng), u)) { } }; diff --git a/include/boost/range/iterator_range_core.hpp b/include/boost/range/iterator_range_core.hpp index 59a7b8c..7bbae2a 100644 --- a/include/boost/range/iterator_range_core.hpp +++ b/include/boost/range/iterator_range_core.hpp @@ -708,7 +708,6 @@ public: BOOST_DEDUCED_TYPENAME range_difference::type advance_begin, BOOST_DEDUCED_TYPENAME range_difference::type advance_end ) { - //BOOST_ASSERT( advance_begin - advance_end <= size(r) && "creating invalid range" ); return iterator_range_detail::make_range_impl( r, advance_begin, advance_end ); } @@ -720,7 +719,6 @@ public: BOOST_DEDUCED_TYPENAME range_difference::type advance_begin, BOOST_DEDUCED_TYPENAME range_difference::type advance_end ) { - //BOOST_ASSERT( advance_begin - advance_end <= size(r) && "creating invalid range" ); return iterator_range_detail::make_range_impl( r, advance_begin, advance_end ); } @@ -730,7 +728,6 @@ public: BOOST_DEDUCED_TYPENAME range_difference::type advance_begin, BOOST_DEDUCED_TYPENAME range_difference::type advance_end ) { - //BOOST_ASSERT( advance_begin - advance_end <= size(r) && "creating invalid range" ); return iterator_range_detail::make_range_impl( r, advance_begin, advance_end ); } diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 3c57250..97b3d6d 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -44,6 +44,7 @@ test-suite range : [ range-test adaptor_test/sliced ] [ range-test adaptor_test/strided ] [ range-test adaptor_test/strided2 ] + [ range-test adaptor_test/ticket_8676_sliced_transformed ] [ range-test adaptor_test/ticket_9519_strided_reversed ] [ range-test adaptor_test/tokenized ] [ range-test adaptor_test/transformed ] diff --git a/test/adaptor_test/ticket_8676_sliced_transformed.cpp b/test/adaptor_test/ticket_8676_sliced_transformed.cpp new file mode 100644 index 0000000..da0125e --- /dev/null +++ b/test/adaptor_test/ticket_8676_sliced_transformed.cpp @@ -0,0 +1,56 @@ +// Boost.Range library +// +// Copyright Neil Groves 2014. 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/ +// +#include +#include +#include +#include +#include +#include + +namespace +{ + struct identity + { + typedef int result_type; + result_type operator()(int i) const { return i; } + }; + + void sliced_and_transformed() + { + using namespace boost::adaptors; + + std::vector input; + for (int i = 0; i < 10; ++i) + input.push_back(i); + + std::vector out1; + boost::push_back(out1, input | sliced(2, 8) + | transformed(identity())); + + std::vector out2; + boost::push_back(out2, input | transformed(identity()) + | sliced(2, 8)); + + BOOST_CHECK_EQUAL_COLLECTIONS(out1.begin(), out1.end(), + out2.begin(), out2.end()); + } +} // anonymous namespace + +boost::unit_test::test_suite* +init_unit_test_suite(int argc, char* argv[]) +{ + boost::unit_test::test_suite* test + = BOOST_TEST_SUITE( "Range adaptors - sliced and transformed" ); + + test->add(BOOST_TEST_CASE(&sliced_and_transformed)); + + return test; +}