template<class InIter, class OutIter, class InSent = InIter> void test() { using ranges::partial_sum; using ranges::make_subrange; { // iterator int ir[] = {1, 3, 6, 10, 15}; const unsigned s = sizeof(ir) / sizeof(ir[0]); int ia[] = {1, 2, 3, 4, 5}; int ib[s] = {0}; auto r = partial_sum(InIter(ia), InSent(ia + s), OutIter(ib)); CHECK(base(r.in) == ia + s); CHECK(base(r.out) == ib + s); for(unsigned i = 0; i < s; ++i) { CHECK(ib[i] == ir[i]); } } { // range + output iterator int ir[] = {1, 3, 6, 10, 15}; const unsigned s = sizeof(ir) / sizeof(ir[0]); int ia[] = {1, 2, 3, 4, 5}; int ib[s] = {0}; auto rng = make_subrange(InIter(ia), InSent(ia + s)); auto r = partial_sum(rng, OutIter(ib)); CHECK(base(r.in) == ia + s); CHECK(base(r.out) == ib + s); for(unsigned i = 0; i < s; ++i) { CHECK(ib[i] == ir[i]); } } { // range + output range int ir[] = {1, 3, 6, 10, 15}; const unsigned s = sizeof(ir) / sizeof(ir[0]); int ia[] = {1, 2, 3, 4, 5}; int ib[s] = {0}; auto rng = make_subrange(InIter(ia), InSent(ia + s)); auto orng = make_subrange(OutIter(ib), OutIter(ib + s)); auto r = partial_sum(rng, orng); CHECK(base(r.in) == ia + s); CHECK(base(r.out) == ib + s); for(unsigned i = 0; i < s; ++i) { CHECK(ib[i] == ir[i]); } } { int ia[] = {1, 2, 3, 4, 5}; int ir[] = {1, -1, -4, -8, -13}; const unsigned s = sizeof(ia) / sizeof(ia[0]); int ib[s] = {0}; auto rng = make_subrange(InIter(ia), InSent(ia + s)); auto orng = make_subrange(OutIter(ib), OutIter(ib + s)); auto r = partial_sum(rng, orng, std::minus<int>()); CHECK(base(r.in) == ia + s); CHECK(base(r.out) == ib + s); for(unsigned i = 0; i < s; ++i) { CHECK(ib[i] == ir[i]); } } }
template<class InIter, class OutIter, class InSent = InIter> void test() { using ranges::adjacent_difference; using ranges::make_subrange; { // 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(r.in) == ia + s); CHECK(base(r.out) == 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_subrange(InIter(ia), InSent(ia + s)); auto r = adjacent_difference(rng, OutIter(ib)); CHECK(base(r.in) == ia + s); CHECK(base(r.out) == 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_subrange(InIter(ia), InSent(ia + s)); auto orng = make_subrange(OutIter(ib), OutIter(ib + s)); auto r = adjacent_difference(rng, orng); CHECK(base(r.in) == ia + s); CHECK(base(r.out) == 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_subrange(InIter(ia), InSent(ia + s)); auto orng = make_subrange(OutIter(ib), OutIter(ib + s)); auto r = adjacent_difference(rng, orng, std::plus<int>()); CHECK(base(r.in) == ia + s); CHECK(base(r.out) == ib + s); for(unsigned i = 0; i < s; ++i) { CHECK(ib[i] == ir[i]); } } }