// Range v3 library // // Copyright Eric Niebler 2014-present // // 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) // // Project home: https://github.com/ericniebler/range-v3 #include #include #include #include #include #include #include #include #include #include #include #include "../simple_test.hpp" #include "../test_utils.hpp" #include "../test_iterators.hpp" int main() { using namespace ranges; int const rgi[] = {1, 1, 1, 2, 3, 4, 4}; std::vector out; { auto rng = rgi | views::adjacent_remove_if(std::equal_to{}); has_type(*begin(rng)); CPP_assert(view_); CPP_assert(common_range); CPP_assert(!sized_range); CPP_assert(bidirectional_iterator); CPP_assert(!random_access_iterator); CPP_assert(output_iterator); CPP_assert(!equality_comparable); copy(rng, ranges::back_inserter(out)); ::check_equal(out, {1, 2, 3, 4}); } { auto rng2 = views::counted(rgi, 7) | views::adjacent_remove_if([&](int i, int j) { return i == j; }); has_type(*begin(rng2)); CPP_assert(view_); CPP_assert(forward_range); CPP_assert(common_range); CPP_assert(!sized_range); CPP_assert(bidirectional_iterator); CPP_assert(!random_access_iterator); ::check_equal(rng2, {1, 2, 3, 4}); } { auto rng3 = views::counted(ForwardIterator(rgi), 7) | views::adjacent_remove_if(std::equal_to{}); has_type(*begin(rng3)); CPP_assert(view_); CPP_assert(forward_range); CPP_assert(!common_range); CPP_assert(!sized_range); CPP_assert(forward_iterator); CPP_assert(!bidirectional_iterator); ::check_equal(rng3, {1, 2, 3, 4}); } { auto rng4 = views::counted(ForwardIterator(rgi), 7) | views::adjacent_remove_if([](int,int){return true;}); has_type(*begin(rng4)); CHECK(*begin(rng4) == 4); CPP_assert(view_); CPP_assert(forward_range); CPP_assert(!common_range); CPP_assert(!sized_range); CPP_assert(forward_iterator); CPP_assert(!bidirectional_iterator); ::check_equal(rng4, {4}); } { auto is_odd_then_even = [](int i, int j){return 1==i%2 && 0 == j%2;}; auto rng5 = views::iota(0, 11) | views::adjacent_remove_if(is_odd_then_even); has_type(*begin(rng5)); CPP_assert(view_); CPP_assert(forward_range); CPP_assert(common_range); CPP_assert(!sized_range); CPP_assert(bidirectional_iterator); CPP_assert(!random_access_iterator); ::check_equal(rng5, {0,2,4,6,8,10}); } { // Verify that forward and backward traversal both select the same elements. auto rng = views::adjacent_remove_if(rgi, std::equal_to{}); std::vector pointers; for(auto& i : rng) pointers.push_back(&i); auto pos = ranges::end(rng); for(auto i = pointers.size(); i != 0;) { CHECK(pos != ranges::begin(rng)); CHECK(&*--pos == pointers[--i]); } CHECK(pos == ranges::begin(rng)); } return test_result(); }