// Boost test program for next() and prior() utilities. // Copyright 2003 Daniel Walker. Use, modification, and distribution // are subject to the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or a copy at // http://www.boost.org/LICENSE_1_0.txt.) // See http://www.boost.org/libs/utility for documentation. // Revision History 13 Dec 2003 Initial Version (Daniel Walker) // next() and prior() are replacements for operator+ and operator- for // non-random-access iterators. The semantics of these operators are // such that after executing j = i + n, std::distance(i, j) equals // n. Tests are provided to ensure next() has the same // result. Parallel tests are provided for prior(). The tests call // next() and prior() several times. next() and prior() are very // simple functions, though, and it would be very strange if these // tests were to fail. #define BOOST_INCLUDE_MAIN #include #include #include #include template bool plus_one_test(RandomAccessIterator first, RandomAccessIterator last, ForwardIterator first2) { RandomAccessIterator i = first; ForwardIterator j = first2; while(i != last) i = i + 1, j = boost::next(j); return std::distance(first, i) == std::distance(first2, j); } template bool plus_n_test(RandomAccessIterator first, RandomAccessIterator last, ForwardIterator first2) { RandomAccessIterator i = first; ForwardIterator j = first2; for(int n = 0; i != last; ++n) i = first + n, j = boost::next(first2, n); return std::distance(first, i) == std::distance(first2, j); } template bool minus_one_test(RandomAccessIterator first, RandomAccessIterator last, BidirectionalIterator last2) { RandomAccessIterator i = last; BidirectionalIterator j = last2; while(i != first) i = i - 1, j = boost::prior(j); return std::distance(i, last) == std::distance(j, last2); } template bool minus_n_test(RandomAccessIterator first, RandomAccessIterator last, BidirectionalIterator last2) { RandomAccessIterator i = last; BidirectionalIterator j = last2; for(int n = 0; i != first; ++n) i = last - n, j = boost::prior(last2, n); return std::distance(i, last) == std::distance(j, last2); } int test_main(int, char*[]) { std::vector x(8); std::list y(x.begin(), x.end()); BOOST_REQUIRE(plus_one_test(x.begin(), x.end(), y.begin())); BOOST_REQUIRE(plus_n_test(x.begin(), x.end(), y.begin())); BOOST_REQUIRE(minus_one_test(x.begin(), x.end(), y.end())); BOOST_REQUIRE(minus_n_test(x.begin(), x.end(), y.end())); return 0; }