From 8be23dd1aaa1ed4b54c49ea2e7af53e5de6283b1 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Sat, 8 Jun 2013 20:41:43 +0000 Subject: [PATCH] [range] Fix off-by-one error in implementation of irange() (refs #7731). [SVN r84701] --- include/boost/range/irange.hpp | 2 +- test/irange.cpp | 18 ++++++------------ 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/include/boost/range/irange.hpp b/include/boost/range/irange.hpp index 248124f..f35df47 100644 --- a/include/boost/range/irange.hpp +++ b/include/boost/range/irange.hpp @@ -217,7 +217,7 @@ namespace boost const std::ptrdiff_t sz = static_cast(step_size >= 0 ? step_size : -step_size); const Integer l = step_size >= 0 ? last : first; const Integer f = step_size >= 0 ? first : last; - const std::ptrdiff_t num_steps = (l + ((l-f) % sz) - f) / sz; + const std::ptrdiff_t num_steps = (l - f) / sz + ((l - f) % sz ? 1 : 0); BOOST_ASSERT(num_steps >= 0); return strided_integer_range( diff --git a/test/irange.cpp b/test/irange.cpp index 358a2b1..659401b 100644 --- a/test/irange.cpp +++ b/test/irange.cpp @@ -35,15 +35,6 @@ namespace boost reference.begin(), reference.end() ); } - template - std::ptrdiff_t test_irange_calculate_num_steps(Integer first, Integer last, int step) - { - const std::ptrdiff_t sz = static_cast(step >= 0 ? step : -step); - const std::ptrdiff_t l = static_cast(step >= 0 ? last : first); - const std::ptrdiff_t f = static_cast(step >= 0 ? first : last); - return (l + ((l-f) % sz) - f) / sz; - } - // Test an integer range with a runtime specified step size. template void test_irange_impl(IntegerInput first, IntegerInput last, int step) @@ -58,9 +49,12 @@ namespace boost std::vector reference; - const std::ptrdiff_t num_steps = test_irange_calculate_num_steps(first, last, step); - Integer current_value = first; - for (std::ptrdiff_t i = 0; i < num_steps; ++i, current_value += step) + const std::ptrdiff_t first_p = static_cast(first); + const std::ptrdiff_t last_p = static_cast(last); + const std::ptrdiff_t step_p = static_cast(step); + for (std::ptrdiff_t current_value = first_p; + step_p >= 0 ? current_value < last_p : current_value > last_p; + current_value += step_p) reference.push_back(current_value); std::vector test;