diff --git a/doc/reference/utilities.qbk b/doc/reference/utilities.qbk index b39904f..2a18f35 100644 --- a/doc/reference/utilities.qbk +++ b/doc/reference/utilities.qbk @@ -132,6 +132,12 @@ namespace boost make_iterator_range( ForwardTraversalIterator Begin, ForwardTraversalIterator End ); + // Make an iterator_range [first, boost::next(first, n) ) + template< class ForwardTraversalIterator, class Integer > + iterator_range< ForwardTraversalIterator > + make_iterator_range_n( ForwardTraversalIterator first, Integer n ); + + template< class ForwardRange > iterator_range< typename range_iterator::type > make_iterator_range( ForwardRange& r ); diff --git a/include/boost/range/iterator_range_core.hpp b/include/boost/range/iterator_range_core.hpp index ba842ab..e6c77f5 100644 --- a/include/boost/range/iterator_range_core.hpp +++ b/include/boost/range/iterator_range_core.hpp @@ -651,6 +651,13 @@ public: return iterator_range( Begin, End ); } + template + inline iterator_range + make_iterator_range_n(IteratorT first, IntegerT n) + { + return iterator_range(first, boost::next(first, n)); + } + #ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING template< typename Range > diff --git a/test/iterator_range.cpp b/test/iterator_range.cpp index c914f43..688116d 100644 --- a/test/iterator_range.cpp +++ b/test/iterator_range.cpp @@ -213,7 +213,30 @@ namespace iterator_range_test_detail BOOST_CHECK_EQUAL_COLLECTIONS( rng.begin(), rng.end(), source, source + 6 ); } - + + void check_make_iterator_range_n() + { + std::vector input; + for (uint32_t i = 0; i < 10u; ++i) + input.push_back(i); + + boost::iterator_range::iterator> rng = + boost::make_iterator_range_n(boost::begin(input), 8u); + + BOOST_CHECK(rng.begin() == input.begin()); + BOOST_CHECK(rng.end() == input.begin() + 8); + BOOST_CHECK_EQUAL(rng.size(), 8u); + + const std::vector& cinput = input; + + boost::iterator_range::const_iterator> crng = + boost::make_iterator_range_n(boost::begin(cinput), 8u); + + BOOST_CHECK(crng.begin() == cinput.begin()); + BOOST_CHECK(crng.end() == cinput.begin() + 8); + BOOST_CHECK_EQUAL(crng.size(), 8u); + } + } // namespace iterator_range_test_detail template @@ -234,6 +257,7 @@ boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) test->add(BOOST_TEST_CASE(&check_iterator_range_operator)); test->add(BOOST_TEST_CASE(&check_iterator_range_operator)); test->add(BOOST_TEST_CASE(&check_iterator_range_operator)); + test->add(BOOST_TEST_CASE(&iterator_range_test_detail::check_make_iterator_range_n)); return test; }