// -*- C++ -*- //===-- transform_unary.pass.cpp ------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03, c++11, c++14 #include "support/pstl_test_config.h" #include #include #include "support/utils.h" using namespace TestUtils; template void check_and_reset(InputIterator first, InputIterator last, OutputIterator out_first) { typedef typename std::iterator_traits::value_type Out; typename std::iterator_traits::difference_type k = 0; for (; first != last; ++first, ++out_first, ++k) { // check Out expected = 1 - *first; Out actual = *out_first; EXPECT_EQ(expected, actual, "wrong value in output sequence"); // reset *out_first = k % 7 != 4 ? 7 * k - 5 : 0; } } struct test_one_policy { template void operator()(Policy&& exec, InputIterator first, InputIterator last, OutputIterator out_first, OutputIterator out_last, UnaryOp op) { auto orr = std::transform(exec, first, last, out_first, op); EXPECT_TRUE(out_last == orr, "transform returned wrong iterator"); check_and_reset(first, last, out_first); } }; template void test() { for (size_t n = 0; n <= 100000; n = n <= 16 ? n + 1 : size_t(3.1415 * n)) { Sequence in(n, [](int32_t k) { return k % 5 != 1 ? 3 * k - 7 : 0; }); Sequence out(n); const auto flip = Complement(1); invoke_on_all_policies(test_one_policy(), in.begin(), in.end(), out.begin(), out.end(), flip); invoke_on_all_policies(test_one_policy(), in.cbegin(), in.cend(), out.begin(), out.end(), flip); } } template struct test_non_const { template void operator()(Policy&& exec, InputIterator input_iter, OutputInterator out_iter) { invoke_if(exec, [&]() { transform(exec, input_iter, input_iter, out_iter, non_const(std::negate())); }); } }; int main() { test(); test(); test(); test(); test(); test_algo_basic_double(run_for_rnd_fw>()); std::cout << done() << std::endl; return 0; }