// -*- C++ -*- //===-- test_transform_unary.cpp ------------------------------------------===// // // 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 "pstl/execution" #include "pstl/algorithm" #include "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())); }); } }; int32_t main() { test(); test(); test(); test(); test(); test_algo_basic_double(run_for_rnd_fw>()); std::cout << done() << std::endl; return 0; }