// -*- C++ -*- //===-- test_generate.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. // //===----------------------------------------------------------------------===// // Tests for generate #include #include "pstl/execution" #include "pstl/algorithm" #include "utils.h" using namespace TestUtils; template struct Generator_count { const T def_val = T(-1); T operator()() { return def_val; } T default_value() const { return def_val; } }; struct test_generate { template void operator()(Policy&& exec, Iterator first, Iterator last, Size n) { using namespace std; typedef typename std::iterator_traits::value_type T; // Try random-access iterator { Generator_count g; generate(exec, first, last, g); EXPECT_TRUE(std::count(first, last, g.default_value()) == n, "generate wrong result for generate"); std::fill(first, last, T(0)); } { Generator_count g; const auto m = n / 2; auto last = generate_n(exec, first, m, g); EXPECT_TRUE(std::count(first, last, g.default_value()) == m && last == std::next(first, m), "generate_n wrong result for generate_n"); std::fill(first, last, T(0)); } } }; template void test_generate_by_type() { for (size_t n = 0; n <= 100000; n = n < 16 ? n + 1 : size_t(3.1415 * n)) { Sequence in(n, [](size_t v) -> T { return T(0); }); //fill by zero invoke_on_all_policies(test_generate(), in.begin(), in.end(), in.size()); } } template struct test_non_const { template void operator()(Policy&& exec, Iterator iter) { auto gen = []() { return T(0); }; generate(exec, iter, iter, non_const(gen)); generate_n(exec, iter, 0, non_const(gen)); } }; int32_t main() { test_generate_by_type(); test_generate_by_type(); test_algo_basic_single(run_for_rnd_fw>()); std::cout << done() << std::endl; return 0; }