// 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 //===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include #include #include #include #include "../simple_test.hpp" #include "../test_iterators.hpp" using namespace std::placeholders; RANGES_DIAGNOSTIC_IGNORE_DEPRECATED_DECLARATIONS template void test1() { { int ia[] = {0, 1, 2, 3, 4}; constexpr auto sa = ranges::size(ia); int ib[sa] = {0}; ranges::unary_transform_result r = ranges::transform(InIter(ia), Sentinel(ia+sa), OutIter(ib), std::bind(std::plus(), _1, 1)); CHECK(base(r.in) == ia + sa); CHECK(base(r.out) == ib + sa); CHECK(ib[0] == 1); CHECK(ib[1] == 2); CHECK(ib[2] == 3); CHECK(ib[3] == 4); CHECK(ib[4] == 5); } { int ia[] = {0, 1, 2, 3, 4}; constexpr auto sa = ranges::size(ia); int ib[sa] = {0}; auto rng = ranges::make_subrange(InIter(ia), Sentinel(ia + sa)); ranges::unary_transform_result r = ranges::transform(rng, OutIter(ib), std::bind(std::plus(), _1, 1)); CHECK(base(r.in) == ia + sa); CHECK(base(r.out) == ib + sa); CHECK(ib[0] == 1); CHECK(ib[1] == 2); CHECK(ib[2] == 3); CHECK(ib[3] == 4); CHECK(ib[4] == 5); } { int ia[] = {0, 1, 2, 3, 4}; constexpr auto sa = ranges::size(ia); int ib[sa] = {0}; auto rng = ranges::make_subrange(InIter(ia), Sentinel(ia + sa)); auto r = ranges::transform(std::move(rng), OutIter(ib), std::bind(std::plus(), _1, 1)); CHECK(base(r.in) == ia + sa); CHECK(base(r.out) == ib + sa); CHECK(ib[0] == 1); CHECK(ib[1] == 2); CHECK(ib[2] == 3); CHECK(ib[3] == 4); CHECK(ib[4] == 5); } } template void test2() { { int ia[] = {0, 1, 2, 3, 4}; constexpr auto sa = ranges::size(ia); int ib[sa] = {1, 2, 3, 4, 5}; ranges::binary_transform_result r = ranges::transform(InIter1(ib), Sentinel(ib + sa), InIter2(ia), OutIter(ib), std::minus()); CHECK(base(r.in1) == ib + sa); CHECK(base(r.in2) == ia + sa); CHECK(base(r.out) == ib + sa); CHECK(ib[0] == 1); CHECK(ib[1] == 1); CHECK(ib[2] == 1); CHECK(ib[3] == 1); CHECK(ib[4] == 1); } { int ia[] = {0, 1, 2, 3, 4}; constexpr auto sa = ranges::size(ia); int ib[sa] = {1, 2, 3, 4, 5}; ranges::binary_transform_result r = ranges::transform(InIter1(ib), Sentinel(ib + sa), InIter2(ia), Sentinel(ia + sa), OutIter(ib), std::minus()); CHECK(base(r.in1) == ib + sa); CHECK(base(r.in2) == ia + sa); CHECK(base(r.out) == ib + sa); CHECK(ib[0] == 1); CHECK(ib[1] == 1); CHECK(ib[2] == 1); CHECK(ib[3] == 1); CHECK(ib[4] == 1); } { int ia[] = {0, 1, 2, 3, 4}; constexpr auto sa = ranges::size(ia); int ib[sa] = {1, 2, 3, 4, 5}; auto rng0 = ranges::make_subrange(InIter1(ib), Sentinel(ib + sa)); ranges::binary_transform_result r = ranges::transform(rng0, InIter2(ia), OutIter(ib), std::minus()); CHECK(base(r.in1) == ib + sa); CHECK(base(r.in2) == ia + sa); CHECK(base(r.out) == ib + sa); CHECK(ib[0] == 1); CHECK(ib[1] == 1); CHECK(ib[2] == 1); CHECK(ib[3] == 1); CHECK(ib[4] == 1); } { int ia[] = {0, 1, 2, 3, 4}; constexpr auto sa = ranges::size(ia); int ib[sa] = {1, 2, 3, 4, 5}; auto rng0 = ranges::make_subrange(InIter1(ib), Sentinel(ib + sa)); auto r = ranges::transform(std::move(rng0), InIter2(ia), OutIter(ib), std::minus()); CHECK(base(r.in1) == ib + sa); CHECK(base(r.in2) == ia + sa); CHECK(base(r.out) == ib + sa); CHECK(ib[0] == 1); CHECK(ib[1] == 1); CHECK(ib[2] == 1); CHECK(ib[3] == 1); CHECK(ib[4] == 1); } { int ia[] = {0, 1, 2, 3, 4}; constexpr auto sa = ranges::size(ia); int ib[sa] = {1, 2, 3, 4, 5}; auto rng0 = ranges::make_subrange(InIter1(ib), Sentinel(ib + sa)); auto rng1 = ranges::make_subrange(InIter2(ia), Sentinel(ia + sa)); ranges::binary_transform_result r = ranges::transform(rng0, rng1, OutIter(ib), std::minus()); CHECK(base(r.in1) == ib + sa); CHECK(base(r.in2) == ia + sa); CHECK(base(r.out) == ib + sa); CHECK(ib[0] == 1); CHECK(ib[1] == 1); CHECK(ib[2] == 1); CHECK(ib[3] == 1); CHECK(ib[4] == 1); } { int ia[] = {0, 1, 2, 3, 4}; constexpr auto sa = ranges::size(ia); int ib[sa] = {1, 2, 3, 4, 5}; auto rng0 = ranges::make_subrange(InIter1(ib), Sentinel(ib + sa)); auto rng1 = ranges::make_subrange(InIter2(ia), Sentinel(ia + sa)); auto r = ranges::transform(std::move(rng0), std::move(rng1), OutIter(ib), std::minus()); CHECK(base(r.in1) == ib + sa); CHECK(base(r.in2) == ia + sa); CHECK(base(r.out) == ib + sa); CHECK(ib[0] == 1); CHECK(ib[1] == 1); CHECK(ib[2] == 1); CHECK(ib[3] == 1); CHECK(ib[4] == 1); } } struct S { int i; }; constexpr int plus_one(int i) { return i + 1; } constexpr bool test_constexpr() { using namespace ranges; int ia[] = {0, 1, 2, 3, 4}; constexpr auto sa = ranges::size(ia); int ib[sa] = {0}; auto r = transform(ia, ib, plus_one); STATIC_CHECK_RETURN(r.in == ia + sa); STATIC_CHECK_RETURN(r.out == ib + sa); STATIC_CHECK_RETURN(ib[0] == 1); STATIC_CHECK_RETURN(ib[1] == 2); STATIC_CHECK_RETURN(ib[2] == 3); STATIC_CHECK_RETURN(ib[3] == 4); STATIC_CHECK_RETURN(ib[4] == 5); return true; } int main() { test1, OutputIterator >(); test1, InputIterator >(); test1, ForwardIterator >(); test1, BidirectionalIterator >(); test1, RandomAccessIterator >(); test1, int*>(); test1, OutputIterator >(); test1, InputIterator >(); test1, ForwardIterator >(); test1, BidirectionalIterator >(); test1, RandomAccessIterator >(); test1, int*>(); test1, OutputIterator >(); test1, InputIterator >(); test1, ForwardIterator >(); test1, BidirectionalIterator >(); test1, RandomAccessIterator >(); test1, int*>(); test1, OutputIterator >(); test1, InputIterator >(); test1, ForwardIterator >(); test1, BidirectionalIterator >(); test1, RandomAccessIterator >(); test1, int*>(); test1 >(); test1 >(); test1 >(); test1 >(); test1 >(); test1(); test2, InputIterator, OutputIterator >(); test2, InputIterator, InputIterator >(); test2, InputIterator, ForwardIterator >(); test2, InputIterator, BidirectionalIterator >(); test2, InputIterator, RandomAccessIterator >(); test2, InputIterator, int*>(); test2, ForwardIterator, OutputIterator >(); test2, ForwardIterator, InputIterator >(); test2, ForwardIterator, ForwardIterator >(); test2, ForwardIterator, BidirectionalIterator >(); test2, ForwardIterator, RandomAccessIterator >(); test2, ForwardIterator, int*>(); test2, BidirectionalIterator, OutputIterator >(); test2, BidirectionalIterator, InputIterator >(); test2, BidirectionalIterator, ForwardIterator >(); test2, BidirectionalIterator, BidirectionalIterator >(); test2, BidirectionalIterator, RandomAccessIterator >(); test2, BidirectionalIterator, int*>(); test2, RandomAccessIterator, OutputIterator >(); test2, RandomAccessIterator, InputIterator >(); test2, RandomAccessIterator, ForwardIterator >(); test2, RandomAccessIterator, BidirectionalIterator >(); test2, RandomAccessIterator, RandomAccessIterator >(); test2, RandomAccessIterator, int*>(); test2, const int*, OutputIterator >(); test2, const int*, InputIterator >(); test2, const int*, ForwardIterator >(); test2, const int*, BidirectionalIterator >(); test2, const int*, RandomAccessIterator >(); test2, const int*, int*>(); test2, InputIterator, OutputIterator >(); test2, InputIterator, InputIterator >(); test2, InputIterator, ForwardIterator >(); test2, InputIterator, BidirectionalIterator >(); test2, InputIterator, RandomAccessIterator >(); test2, InputIterator, int*>(); test2, ForwardIterator, OutputIterator >(); test2, ForwardIterator, InputIterator >(); test2, ForwardIterator, ForwardIterator >(); test2, ForwardIterator, BidirectionalIterator >(); test2, ForwardIterator, RandomAccessIterator >(); test2, ForwardIterator, int*>(); test2, BidirectionalIterator, OutputIterator >(); test2, BidirectionalIterator, InputIterator >(); test2, BidirectionalIterator, ForwardIterator >(); test2, BidirectionalIterator, BidirectionalIterator >(); test2, BidirectionalIterator, RandomAccessIterator >(); test2, BidirectionalIterator, int*>(); test2, RandomAccessIterator, OutputIterator >(); test2, RandomAccessIterator, InputIterator >(); test2, RandomAccessIterator, ForwardIterator >(); test2, RandomAccessIterator, BidirectionalIterator >(); test2, RandomAccessIterator, RandomAccessIterator >(); test2, RandomAccessIterator, int*>(); test2, const int*, OutputIterator >(); test2, const int*, InputIterator >(); test2, const int*, ForwardIterator >(); test2, const int*, BidirectionalIterator >(); test2, const int*, RandomAccessIterator >(); test2, const int*, int*>(); test2, InputIterator, OutputIterator >(); test2, InputIterator, InputIterator >(); test2, InputIterator, ForwardIterator >(); test2, InputIterator, BidirectionalIterator >(); test2, InputIterator, RandomAccessIterator >(); test2, InputIterator, int*>(); test2, ForwardIterator, OutputIterator >(); test2, ForwardIterator, InputIterator >(); test2, ForwardIterator, ForwardIterator >(); test2, ForwardIterator, BidirectionalIterator >(); test2, ForwardIterator, RandomAccessIterator >(); test2, ForwardIterator, int*>(); test2, BidirectionalIterator, OutputIterator >(); test2, BidirectionalIterator, InputIterator >(); test2, BidirectionalIterator, ForwardIterator >(); test2, BidirectionalIterator, BidirectionalIterator >(); test2, BidirectionalIterator, RandomAccessIterator >(); test2, BidirectionalIterator, int*>(); test2, RandomAccessIterator, OutputIterator >(); test2, RandomAccessIterator, InputIterator >(); test2, RandomAccessIterator, ForwardIterator >(); test2, RandomAccessIterator, BidirectionalIterator >(); test2, RandomAccessIterator, RandomAccessIterator >(); test2, RandomAccessIterator, int*>(); test2, const int*, OutputIterator >(); test2, const int*, InputIterator >(); test2, const int*, ForwardIterator >(); test2, const int*, BidirectionalIterator >(); test2, const int*, RandomAccessIterator >(); test2, const int*, int*>(); test2, InputIterator, OutputIterator >(); test2, InputIterator, InputIterator >(); test2, InputIterator, ForwardIterator >(); test2, InputIterator, BidirectionalIterator >(); test2, InputIterator, RandomAccessIterator >(); test2, InputIterator, int*>(); test2, ForwardIterator, OutputIterator >(); test2, ForwardIterator, InputIterator >(); test2, ForwardIterator, ForwardIterator >(); test2, ForwardIterator, BidirectionalIterator >(); test2, ForwardIterator, RandomAccessIterator >(); test2, ForwardIterator, int*>(); test2, BidirectionalIterator, OutputIterator >(); test2, BidirectionalIterator, InputIterator >(); test2, BidirectionalIterator, ForwardIterator >(); test2, BidirectionalIterator, BidirectionalIterator >(); test2, BidirectionalIterator, RandomAccessIterator >(); test2, BidirectionalIterator, int*>(); test2, RandomAccessIterator, OutputIterator >(); test2, RandomAccessIterator, InputIterator >(); test2, RandomAccessIterator, ForwardIterator >(); test2, RandomAccessIterator, BidirectionalIterator >(); test2, RandomAccessIterator, RandomAccessIterator >(); test2, RandomAccessIterator, int*>(); test2, const int*, OutputIterator >(); test2, const int*, InputIterator >(); test2, const int*, ForwardIterator >(); test2, const int*, BidirectionalIterator >(); test2, const int*, RandomAccessIterator >(); test2, const int*, int*>(); test2, OutputIterator >(); test2, InputIterator >(); test2, ForwardIterator >(); test2, BidirectionalIterator >(); test2, RandomAccessIterator >(); test2, int*>(); test2, OutputIterator >(); test2, InputIterator >(); test2, ForwardIterator >(); test2, BidirectionalIterator >(); test2, RandomAccessIterator >(); test2, int*>(); test2, OutputIterator >(); test2, InputIterator >(); test2, ForwardIterator >(); test2, BidirectionalIterator >(); test2, RandomAccessIterator >(); test2, int*>(); test2, OutputIterator >(); test2, InputIterator >(); test2, ForwardIterator >(); test2, BidirectionalIterator >(); test2, RandomAccessIterator >(); test2, int*>(); test2 >(); test2 >(); test2 >(); test2 >(); test2 >(); test2(); int *p = nullptr; auto unary = [](int i){return i + 1; }; auto binary = [](int i, int j){return i + j; }; S const s[] = {S{1}, S{2}, S{3}, S{4}}; int const i[] = {1, 2, 3, 4}; static_assert(std::is_same, decltype(ranges::transform(s, p, unary, &S::i))>::value, ""); static_assert(std::is_same, decltype(ranges::transform(s, i, p, binary, &S::i))>::value, ""); static_assert(std::is_same, decltype(ranges::transform(s, s, p, binary, &S::i, &S::i))>::value, ""); { STATIC_CHECK(test_constexpr()); } return ::test_result(); }