xref: /llvm-project/libcxx/test/std/algorithms/alg.modifying.operations/alg.fill/pstl.fill.pass.cpp (revision aade74675c15d3bae5fdfa67f7b4b6ed9dac3d20)
1ade9c3bdSNikolas Klauser //===----------------------------------------------------------------------===//
2ade9c3bdSNikolas Klauser //
3ade9c3bdSNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4ade9c3bdSNikolas Klauser // See https://llvm.org/LICENSE.txt for license information.
5ade9c3bdSNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ade9c3bdSNikolas Klauser //
7ade9c3bdSNikolas Klauser //===----------------------------------------------------------------------===//
8ade9c3bdSNikolas Klauser 
9ade9c3bdSNikolas Klauser // <algorithm>
10ade9c3bdSNikolas Klauser 
11ade9c3bdSNikolas Klauser // UNSUPPORTED: c++03, c++11, c++14
12ade9c3bdSNikolas Klauser 
13*e7e37118SNikolas Klauser // UNSUPPORTED: libcpp-has-no-incomplete-pstl
14ade9c3bdSNikolas Klauser 
15ade9c3bdSNikolas Klauser // template<class ExecutionPolicy, class ForwardIterator, class T>
16ade9c3bdSNikolas Klauser //   void fill(ExecutionPolicy&& exec,
17ade9c3bdSNikolas Klauser //             ForwardIterator first, ForwardIterator last, const T& value);
18ade9c3bdSNikolas Klauser 
19ade9c3bdSNikolas Klauser #include <algorithm>
20ade9c3bdSNikolas Klauser #include <cassert>
21ade9c3bdSNikolas Klauser #include <vector>
22ade9c3bdSNikolas Klauser 
23ade9c3bdSNikolas Klauser #include "test_macros.h"
24ade9c3bdSNikolas Klauser #include "test_execution_policies.h"
25ade9c3bdSNikolas Klauser #include "test_iterators.h"
26ade9c3bdSNikolas Klauser 
27ade9c3bdSNikolas Klauser EXECUTION_POLICY_SFINAE_TEST(fill);
28ade9c3bdSNikolas Klauser 
29ade9c3bdSNikolas Klauser static_assert(sfinae_test_fill<int, int*, int*, bool (*)(int)>);
30ade9c3bdSNikolas Klauser static_assert(!sfinae_test_fill<std::execution::parallel_policy, int*, int*, int>);
31ade9c3bdSNikolas Klauser 
32ade9c3bdSNikolas Klauser template <class Iter>
33ade9c3bdSNikolas Klauser struct Test {
34ade9c3bdSNikolas Klauser   template <class Policy>
operator ()Test35ade9c3bdSNikolas Klauser   void operator()(Policy&& policy) {
36ade9c3bdSNikolas Klauser     { // simple test
37ade9c3bdSNikolas Klauser       int a[4];
38ade9c3bdSNikolas Klauser       std::fill(policy, Iter(std::begin(a)), Iter(std::end(a)), 33);
39ade9c3bdSNikolas Klauser       assert(std::all_of(std::begin(a), std::end(a), [](int i) { return i == 33; }));
40ade9c3bdSNikolas Klauser     }
41ade9c3bdSNikolas Klauser     { // check that an empty range works
42ade9c3bdSNikolas Klauser       int a[1] = {2};
43ade9c3bdSNikolas Klauser       std::fill(policy, Iter(std::begin(a)), Iter(std::begin(a)), 33);
44ade9c3bdSNikolas Klauser       assert(a[0] == 2);
45ade9c3bdSNikolas Klauser     }
46ade9c3bdSNikolas Klauser     { // check that a one-element range works
47ade9c3bdSNikolas Klauser       int a[1];
48ade9c3bdSNikolas Klauser       std::fill(policy, Iter(std::begin(a)), Iter(std::end(a)), 33);
49ade9c3bdSNikolas Klauser       assert(std::all_of(std::begin(a), std::end(a), [](int i) { return i == 33; }));
50ade9c3bdSNikolas Klauser     }
51ade9c3bdSNikolas Klauser     { // check that a two-element range works
52ade9c3bdSNikolas Klauser       int a[2];
53ade9c3bdSNikolas Klauser       std::fill(policy, Iter(std::begin(a)), Iter(std::end(a)), 33);
54ade9c3bdSNikolas Klauser       assert(std::all_of(std::begin(a), std::end(a), [](int i) { return i == 33; }));
55ade9c3bdSNikolas Klauser     }
56ade9c3bdSNikolas Klauser     { // check that a large range works
57ade9c3bdSNikolas Klauser       std::vector<int> a(234, 2);
58ade9c3bdSNikolas Klauser       std::fill(policy, Iter(std::data(a)), Iter(std::data(a) + std::size(a)), 33);
59ade9c3bdSNikolas Klauser       assert(std::all_of(std::begin(a), std::end(a), [](int i) { return i == 33; }));
60ade9c3bdSNikolas Klauser     }
61ade9c3bdSNikolas Klauser   }
62ade9c3bdSNikolas Klauser };
63ade9c3bdSNikolas Klauser 
main(int,char **)64ade9c3bdSNikolas Klauser int main(int, char**) {
65ade9c3bdSNikolas Klauser   types::for_each(types::forward_iterator_list<int*>{}, TestIteratorWithPolicies<Test>{});
66ade9c3bdSNikolas Klauser 
67ade9c3bdSNikolas Klauser   return 0;
68ade9c3bdSNikolas Klauser }
69