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