// Copyright (C) 2017 Michel Morin. // // Distributed under 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) #include #include #include #include #include #include int twice(int x) { return x + x; } template void test_advance(Iterator it_from, Iterator it_to, int n) { boost::advance(it_from, n); BOOST_TEST(it_from == it_to); } // Definitely not an iterator struct Foo { int x = 0; // Don't use type "int" for "n", otherwise it matches literal int exactly // and doesn't demonstrate the effect of enable_if. friend void advance(Foo &value, long n) { value.x += 10 * n; } }; int main() { int array[3] = {1, 2, 3}; int* ptr1 = array; int* ptr2 = array + 3; { test_advance(ptr1, ptr2, 3); test_advance(ptr2, ptr1, -3); test_advance( boost::make_transform_iterator(ptr1, twice) , boost::make_transform_iterator(ptr2, twice) , 3 ); test_advance( boost::make_transform_iterator(ptr2, twice) , boost::make_transform_iterator(ptr1, twice) , -3 ); } { std::vector ints(ptr1, ptr2); test_advance(ints.begin(), ints.end(), 3); test_advance(ints.end(), ints.begin(), -3); test_advance( boost::make_transform_iterator(ints.begin(), twice) , boost::make_transform_iterator(ints.end(), twice) , 3 ); test_advance( boost::make_transform_iterator(ints.end(), twice) , boost::make_transform_iterator(ints.begin(), twice) , -3 ); } { std::list ints(ptr1, ptr2); test_advance(ints.begin(), ints.end(), 3); test_advance(ints.end(), ints.begin(), -3); test_advance( boost::make_transform_iterator(ints.begin(), twice) , boost::make_transform_iterator(ints.end(), twice) , 3 ); test_advance( boost::make_transform_iterator(ints.end(), twice) , boost::make_transform_iterator(ints.begin(), twice) , -3 ); } { boost::container::slist ints(ptr1, ptr2); test_advance(ints.begin(), ints.end(), 3); test_advance( boost::make_transform_iterator(ints.begin(), twice) , boost::make_transform_iterator(ints.end(), twice) , 3 ); } { using boost::advance; Foo bar; advance(bar, 3); BOOST_TEST(bar.x == 30); } return boost::report_errors(); }