void test() { int ia[] = {1, 2, 3, 4, 5, 6}; constexpr auto sc = ranges::size(ia); CHECK(ranges::accumulate(Iter(ia), Sent(ia), 0) == 0); CHECK(ranges::accumulate(Iter(ia), Sent(ia), 10) == 10); CHECK(ranges::accumulate(Iter(ia), Sent(ia+1), 0) == 1); CHECK(ranges::accumulate(Iter(ia), Sent(ia+1), 10) == 11); CHECK(ranges::accumulate(Iter(ia), Sent(ia+2), 0) == 3); CHECK(ranges::accumulate(Iter(ia), Sent(ia+2), 10) == 13); CHECK(ranges::accumulate(Iter(ia), Sent(ia+sc), 0) == 21); CHECK(ranges::accumulate(Iter(ia), Sent(ia+sc), 10) == 31); using ranges::make_iterator_range; CHECK(ranges::accumulate(make_iterator_range(Iter(ia), Sent(ia)), 0) == 0); CHECK(ranges::accumulate(make_iterator_range(Iter(ia), Sent(ia)), 10) == 10); CHECK(ranges::accumulate(make_iterator_range(Iter(ia), Sent(ia+1)), 0) == 1); CHECK(ranges::accumulate(make_iterator_range(Iter(ia), Sent(ia+1)), 10) == 11); CHECK(ranges::accumulate(make_iterator_range(Iter(ia), Sent(ia+2)), 0) == 3); CHECK(ranges::accumulate(make_iterator_range(Iter(ia), Sent(ia+2)), 10) == 13); CHECK(ranges::accumulate(make_iterator_range(Iter(ia), Sent(ia+sc)), 0) == 21); CHECK(ranges::accumulate(make_iterator_range(Iter(ia), Sent(ia+sc)), 10) == 31); }
template<class InIter, class OutIter, class InSent = InIter> void test() { using ranges::adjacent_difference; using ranges::make_iterator_range; { // iterator int ia[] = {15, 10, 6, 3, 1}; int ir[] = {15, -5, -4, -3, -2}; const unsigned s = sizeof(ia) / sizeof(ia[0]); int ib[s] = {0}; auto r = adjacent_difference(InIter(ia), InSent(ia + s), OutIter(ib)); CHECK(base(std::get<0>(r)) == ia + s); CHECK(base(std::get<1>(r)) == ib + s); for(unsigned i = 0; i < s; ++i) { CHECK(ib[i] == ir[i]); } } { // range + output iterator int ia[] = {15, 10, 6, 3, 1}; int ir[] = {15, -5, -4, -3, -2}; const unsigned s = sizeof(ia) / sizeof(ia[0]); int ib[s] = {0}; auto rng = make_iterator_range(InIter(ia), InSent(ia + s)); auto r = adjacent_difference(rng, OutIter(ib)); CHECK(base(std::get<0>(r)) == ia + s); CHECK(base(std::get<1>(r)) == ib + s); for(unsigned i = 0; i < s; ++i) { CHECK(ib[i] == ir[i]); } } { // range + output range int ia[] = {15, 10, 6, 3, 1}; int ir[] = {15, -5, -4, -3, -2}; const unsigned s = sizeof(ia) / sizeof(ia[0]); int ib[s] = {0}; auto rng = make_iterator_range(InIter(ia), InSent(ia + s)); auto orng = make_iterator_range(OutIter(ib), OutIter(ib + s)); auto r = adjacent_difference(rng, orng); CHECK(base(std::get<0>(r)) == ia + s); CHECK(base(std::get<1>(r)) == ib + s); for(unsigned i = 0; i < s; ++i) { CHECK(ib[i] == ir[i]); } } { int ia[] = {15, 10, 6, 3, 1}; int ir[] = {15, 25, 16, 9, 4}; const unsigned s = sizeof(ia) / sizeof(ia[0]); int ib[s] = {0}; auto rng = make_iterator_range(InIter(ia), InSent(ia + s)); auto orng = make_iterator_range(OutIter(ib), OutIter(ib + s)); auto r = adjacent_difference(rng, orng, std::plus<int>()); CHECK(base(std::get<0>(r)) == ia + s); CHECK(base(std::get<1>(r)) == ib + s); for(unsigned i = 0; i < s; ++i) { CHECK(ib[i] == ir[i]); } } }