xref: /llvm-project/libcxx/include/__cxx03/__algorithm/pstl.h (revision ce7771902dc50d900de639d499a60486b83f70e0)
1e78f53d1SNikolas Klauser //===----------------------------------------------------------------------===//
2e78f53d1SNikolas Klauser //
3e78f53d1SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e78f53d1SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information.
5e78f53d1SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e78f53d1SNikolas Klauser //
7e78f53d1SNikolas Klauser //===----------------------------------------------------------------------===//
8e78f53d1SNikolas Klauser 
9*ce777190SNikolas Klauser #ifndef _LIBCPP___CXX03___ALGORITHM_PSTL_H
10*ce777190SNikolas Klauser #define _LIBCPP___CXX03___ALGORITHM_PSTL_H
11e78f53d1SNikolas Klauser 
1273fbae83SNikolas Klauser #include <__cxx03/__config>
13e78f53d1SNikolas Klauser 
14e78f53d1SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
15e78f53d1SNikolas Klauser #  pragma GCC system_header
16e78f53d1SNikolas Klauser #endif
17e78f53d1SNikolas Klauser 
18e78f53d1SNikolas Klauser _LIBCPP_PUSH_MACROS
1973fbae83SNikolas Klauser #include <__cxx03/__undef_macros>
20e78f53d1SNikolas Klauser 
21e78f53d1SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17
22e78f53d1SNikolas Klauser 
2373fbae83SNikolas Klauser #  include <__cxx03/__functional/operations.h>
2473fbae83SNikolas Klauser #  include <__cxx03/__iterator/cpp17_iterator_concepts.h>
2573fbae83SNikolas Klauser #  include <__cxx03/__iterator/iterator_traits.h>
2673fbae83SNikolas Klauser #  include <__cxx03/__pstl/backend.h>
2773fbae83SNikolas Klauser #  include <__cxx03/__pstl/dispatch.h>
2873fbae83SNikolas Klauser #  include <__cxx03/__pstl/handle_exception.h>
2973fbae83SNikolas Klauser #  include <__cxx03/__type_traits/enable_if.h>
3073fbae83SNikolas Klauser #  include <__cxx03/__type_traits/is_execution_policy.h>
3173fbae83SNikolas Klauser #  include <__cxx03/__type_traits/remove_cvref.h>
3273fbae83SNikolas Klauser #  include <__cxx03/__utility/forward.h>
3373fbae83SNikolas Klauser #  include <__cxx03/__utility/move.h>
34e78f53d1SNikolas Klauser 
35e78f53d1SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD
36e78f53d1SNikolas Klauser 
37e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
38e78f53d1SNikolas Klauser           class _ForwardIterator,
39e78f53d1SNikolas Klauser           class _Predicate,
40e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
41e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
42e78f53d1SNikolas Klauser [[nodiscard]] _LIBCPP_HIDE_FROM_ABI bool
43e78f53d1SNikolas Klauser any_of(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) {
44e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "any_of requires a ForwardIterator");
45e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__any_of, __pstl::__current_configuration, _RawPolicy>;
46e78f53d1SNikolas Klauser   return __pstl::__handle_exception<_Implementation>(
47e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred));
48e78f53d1SNikolas Klauser }
49e78f53d1SNikolas Klauser 
50e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
51e78f53d1SNikolas Klauser           class _ForwardIterator,
52e78f53d1SNikolas Klauser           class _Pred,
53e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
54e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
55e78f53d1SNikolas Klauser [[nodiscard]] _LIBCPP_HIDE_FROM_ABI bool
56e78f53d1SNikolas Klauser all_of(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Pred __pred) {
57e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "all_of requires a ForwardIterator");
58e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__all_of, __pstl::__current_configuration, _RawPolicy>;
59e78f53d1SNikolas Klauser   return __pstl::__handle_exception<_Implementation>(
60e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred));
61e78f53d1SNikolas Klauser }
62e78f53d1SNikolas Klauser 
63e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
64e78f53d1SNikolas Klauser           class _ForwardIterator,
65e78f53d1SNikolas Klauser           class _Pred,
66e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
67e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
68e78f53d1SNikolas Klauser [[nodiscard]] _LIBCPP_HIDE_FROM_ABI bool
69e78f53d1SNikolas Klauser none_of(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Pred __pred) {
70e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "none_of requires a ForwardIterator");
71e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__none_of, __pstl::__current_configuration, _RawPolicy>;
72e78f53d1SNikolas Klauser   return __pstl::__handle_exception<_Implementation>(
73e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred));
74e78f53d1SNikolas Klauser }
75e78f53d1SNikolas Klauser 
76e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
77e78f53d1SNikolas Klauser           class _ForwardIterator,
78e78f53d1SNikolas Klauser           class _ForwardOutIterator,
79e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
80e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
81e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator
82e78f53d1SNikolas Klauser copy(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _ForwardOutIterator __result) {
83e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(
84e78f53d1SNikolas Klauser       _ForwardIterator, "copy(first, last, result) requires [first, last) to be ForwardIterators");
85e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(
86e78f53d1SNikolas Klauser       _ForwardOutIterator, "copy(first, last, result) requires result to be a ForwardIterator");
87e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
88e78f53d1SNikolas Klauser       _ForwardOutIterator, decltype(*__first), "copy(first, last, result) requires result to be an OutputIterator");
89e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__copy, __pstl::__current_configuration, _RawPolicy>;
90e78f53d1SNikolas Klauser   return __pstl::__handle_exception<_Implementation>(
91e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__result));
92e78f53d1SNikolas Klauser }
93e78f53d1SNikolas Klauser 
94e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
95e78f53d1SNikolas Klauser           class _ForwardIterator,
96e78f53d1SNikolas Klauser           class _ForwardOutIterator,
97e78f53d1SNikolas Klauser           class _Size,
98e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
99e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
100e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator
101e78f53d1SNikolas Klauser copy_n(_ExecutionPolicy&& __policy, _ForwardIterator __first, _Size __n, _ForwardOutIterator __result) {
102e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(
103e78f53d1SNikolas Klauser       _ForwardIterator, "copy_n(first, n, result) requires first to be a ForwardIterator");
104e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(
105e78f53d1SNikolas Klauser       _ForwardOutIterator, "copy_n(first, n, result) requires result to be a ForwardIterator");
106e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
107e78f53d1SNikolas Klauser       _ForwardOutIterator, decltype(*__first), "copy_n(first, n, result) requires result to be an OutputIterator");
108e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__copy_n, __pstl::__current_configuration, _RawPolicy>;
109e78f53d1SNikolas Klauser   return __pstl::__handle_exception<_Implementation>(
110e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__n), std::move(__result));
111e78f53d1SNikolas Klauser }
112e78f53d1SNikolas Klauser 
113e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
114e78f53d1SNikolas Klauser           class _ForwardIterator,
115e78f53d1SNikolas Klauser           class _Predicate,
116e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
117e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
118e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI __iter_diff_t<_ForwardIterator>
119e78f53d1SNikolas Klauser count_if(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) {
120e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(
121e78f53d1SNikolas Klauser       _ForwardIterator, "count_if(first, last, pred) requires [first, last) to be ForwardIterators");
122e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__count_if, __pstl::__current_configuration, _RawPolicy>;
123e78f53d1SNikolas Klauser   return __pstl::__handle_exception<_Implementation>(
124e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred));
125e78f53d1SNikolas Klauser }
126e78f53d1SNikolas Klauser 
127e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
128e78f53d1SNikolas Klauser           class _ForwardIterator,
129e78f53d1SNikolas Klauser           class _Tp,
130e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
131e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
132e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI __iter_diff_t<_ForwardIterator>
133e78f53d1SNikolas Klauser count(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) {
134e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(
135e78f53d1SNikolas Klauser       _ForwardIterator, "count(first, last, val) requires [first, last) to be ForwardIterators");
136e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__count, __pstl::__current_configuration, _RawPolicy>;
137e78f53d1SNikolas Klauser   return __pstl::__handle_exception<_Implementation>(
138e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), __value);
139e78f53d1SNikolas Klauser }
140e78f53d1SNikolas Klauser 
141e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
142e78f53d1SNikolas Klauser           class _ForwardIterator1,
143e78f53d1SNikolas Klauser           class _ForwardIterator2,
144e78f53d1SNikolas Klauser           class _Pred,
145e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
146e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
147e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI bool
148e78f53d1SNikolas Klauser equal(_ExecutionPolicy&& __policy,
149e78f53d1SNikolas Klauser       _ForwardIterator1 __first1,
150e78f53d1SNikolas Klauser       _ForwardIterator1 __last1,
151e78f53d1SNikolas Klauser       _ForwardIterator2 __first2,
152e78f53d1SNikolas Klauser       _Pred __pred) {
153e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "equal requires ForwardIterators");
154e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "equal requires ForwardIterators");
155e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__equal_3leg, __pstl::__current_configuration, _RawPolicy>;
156e78f53d1SNikolas Klauser   return __pstl::__handle_exception<_Implementation>(
157e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy),
158e78f53d1SNikolas Klauser       std::move(__first1),
159e78f53d1SNikolas Klauser       std::move(__last1),
160e78f53d1SNikolas Klauser       std::move(__first2),
161e78f53d1SNikolas Klauser       std::move(__pred));
162e78f53d1SNikolas Klauser }
163e78f53d1SNikolas Klauser 
164e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
165e78f53d1SNikolas Klauser           class _ForwardIterator1,
166e78f53d1SNikolas Klauser           class _ForwardIterator2,
167e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
168e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
169e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI bool
170e78f53d1SNikolas Klauser equal(_ExecutionPolicy&& __policy, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2) {
171e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "equal requires ForwardIterators");
172e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "equal requires ForwardIterators");
173e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__equal_3leg, __pstl::__current_configuration, _RawPolicy>;
174e78f53d1SNikolas Klauser   return __pstl::__handle_exception<_Implementation>(
175e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy),
176e78f53d1SNikolas Klauser       std::move(__first1),
177e78f53d1SNikolas Klauser       std::move(__last1),
178e78f53d1SNikolas Klauser       std::move(__first2),
179e78f53d1SNikolas Klauser       equal_to{});
180e78f53d1SNikolas Klauser }
181e78f53d1SNikolas Klauser 
182e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
183e78f53d1SNikolas Klauser           class _ForwardIterator1,
184e78f53d1SNikolas Klauser           class _ForwardIterator2,
185e78f53d1SNikolas Klauser           class _Pred,
186e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
187e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
188e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI bool
189e78f53d1SNikolas Klauser equal(_ExecutionPolicy&& __policy,
190e78f53d1SNikolas Klauser       _ForwardIterator1 __first1,
191e78f53d1SNikolas Klauser       _ForwardIterator1 __last1,
192e78f53d1SNikolas Klauser       _ForwardIterator2 __first2,
193e78f53d1SNikolas Klauser       _ForwardIterator2 __last2,
194e78f53d1SNikolas Klauser       _Pred __pred) {
195e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "equal requires ForwardIterators");
196e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "equal requires ForwardIterators");
197e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__equal, __pstl::__current_configuration, _RawPolicy>;
198e78f53d1SNikolas Klauser   return __pstl::__handle_exception<_Implementation>(
199e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy),
200e78f53d1SNikolas Klauser       std::move(__first1),
201e78f53d1SNikolas Klauser       std::move(__last1),
202e78f53d1SNikolas Klauser       std::move(__first2),
203e78f53d1SNikolas Klauser       std::move(__last2),
204e78f53d1SNikolas Klauser       std::move(__pred));
205e78f53d1SNikolas Klauser }
206e78f53d1SNikolas Klauser 
207e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
208e78f53d1SNikolas Klauser           class _ForwardIterator1,
209e78f53d1SNikolas Klauser           class _ForwardIterator2,
210e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
211e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
212e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI bool
213e78f53d1SNikolas Klauser equal(_ExecutionPolicy&& __policy,
214e78f53d1SNikolas Klauser       _ForwardIterator1 __first1,
215e78f53d1SNikolas Klauser       _ForwardIterator1 __last1,
216e78f53d1SNikolas Klauser       _ForwardIterator2 __first2,
217e78f53d1SNikolas Klauser       _ForwardIterator2 __last2) {
218e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "equal requires ForwardIterators");
219e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "equal requires ForwardIterators");
220e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__equal, __pstl::__current_configuration, _RawPolicy>;
221e78f53d1SNikolas Klauser   return __pstl::__handle_exception<_Implementation>(
222e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy),
223e78f53d1SNikolas Klauser       std::move(__first1),
224e78f53d1SNikolas Klauser       std::move(__last1),
225e78f53d1SNikolas Klauser       std::move(__first2),
226e78f53d1SNikolas Klauser       std::move(__last2),
227e78f53d1SNikolas Klauser       equal_to{});
228e78f53d1SNikolas Klauser }
229e78f53d1SNikolas Klauser 
230e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
231e78f53d1SNikolas Klauser           class _ForwardIterator,
232e78f53d1SNikolas Klauser           class _Tp,
233e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
234e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
235e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void
236e78f53d1SNikolas Klauser fill(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) {
237e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "fill requires ForwardIterators");
238e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__fill, __pstl::__current_configuration, _RawPolicy>;
239e78f53d1SNikolas Klauser   __pstl::__handle_exception<_Implementation>(
240e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), __value);
241e78f53d1SNikolas Klauser }
242e78f53d1SNikolas Klauser 
243e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
244e78f53d1SNikolas Klauser           class _ForwardIterator,
245e78f53d1SNikolas Klauser           class _Size,
246e78f53d1SNikolas Klauser           class _Tp,
247e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
248e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
249e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void
250e78f53d1SNikolas Klauser fill_n(_ExecutionPolicy&& __policy, _ForwardIterator __first, _Size __n, const _Tp& __value) {
251e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "fill_n requires a ForwardIterator");
252e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__fill_n, __pstl::__current_configuration, _RawPolicy>;
253e78f53d1SNikolas Klauser   __pstl::__handle_exception<_Implementation>(
254e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__n), __value);
255e78f53d1SNikolas Klauser }
256e78f53d1SNikolas Klauser 
257e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
258e78f53d1SNikolas Klauser           class _ForwardIterator,
259e78f53d1SNikolas Klauser           class _Predicate,
260e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
261e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
262e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _ForwardIterator
263e78f53d1SNikolas Klauser find_if(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) {
264e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "find_if requires ForwardIterators");
265e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__find_if, __pstl::__current_configuration, _RawPolicy>;
266e78f53d1SNikolas Klauser   return __pstl::__handle_exception<_Implementation>(
267e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred));
268e78f53d1SNikolas Klauser }
269e78f53d1SNikolas Klauser 
270e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
271e78f53d1SNikolas Klauser           class _ForwardIterator,
272e78f53d1SNikolas Klauser           class _Predicate,
273e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
274e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
275e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _ForwardIterator
276e78f53d1SNikolas Klauser find_if_not(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) {
277e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "find_if_not requires ForwardIterators");
278e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__find_if_not, __pstl::__current_configuration, _RawPolicy>;
279e78f53d1SNikolas Klauser   return __pstl::__handle_exception<_Implementation>(
280e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred));
281e78f53d1SNikolas Klauser }
282e78f53d1SNikolas Klauser 
283e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
284e78f53d1SNikolas Klauser           class _ForwardIterator,
285e78f53d1SNikolas Klauser           class _Tp,
286e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
287e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
288e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _ForwardIterator
289e78f53d1SNikolas Klauser find(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) {
290e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "find requires ForwardIterators");
291e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__find, __pstl::__current_configuration, _RawPolicy>;
292e78f53d1SNikolas Klauser   return __pstl::__handle_exception<_Implementation>(
293e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), __value);
294e78f53d1SNikolas Klauser }
295e78f53d1SNikolas Klauser 
296e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
297e78f53d1SNikolas Klauser           class _ForwardIterator,
298e78f53d1SNikolas Klauser           class _Function,
299e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
300e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
301e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void
302e78f53d1SNikolas Klauser for_each(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Function __func) {
303e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "for_each requires ForwardIterators");
304e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__for_each, __pstl::__current_configuration, _RawPolicy>;
305e78f53d1SNikolas Klauser   __pstl::__handle_exception<_Implementation>(
306e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__func));
307e78f53d1SNikolas Klauser }
308e78f53d1SNikolas Klauser 
309e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
310e78f53d1SNikolas Klauser           class _ForwardIterator,
311e78f53d1SNikolas Klauser           class _Size,
312e78f53d1SNikolas Klauser           class _Function,
313e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
314e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
315e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void
316e78f53d1SNikolas Klauser for_each_n(_ExecutionPolicy&& __policy, _ForwardIterator __first, _Size __size, _Function __func) {
317e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "for_each_n requires a ForwardIterator");
318e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__for_each_n, __pstl::__current_configuration, _RawPolicy>;
319e78f53d1SNikolas Klauser   __pstl::__handle_exception<_Implementation>(
320e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__size), std::move(__func));
321e78f53d1SNikolas Klauser }
322e78f53d1SNikolas Klauser 
323e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
324e78f53d1SNikolas Klauser           class _ForwardIterator,
325e78f53d1SNikolas Klauser           class _Generator,
326e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
327e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
328e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void
329e78f53d1SNikolas Klauser generate(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Generator __gen) {
330e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "generate requires ForwardIterators");
331e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__generate, __pstl::__current_configuration, _RawPolicy>;
332e78f53d1SNikolas Klauser   __pstl::__handle_exception<_Implementation>(
333e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__gen));
334e78f53d1SNikolas Klauser }
335e78f53d1SNikolas Klauser 
336e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
337e78f53d1SNikolas Klauser           class _ForwardIterator,
338e78f53d1SNikolas Klauser           class _Size,
339e78f53d1SNikolas Klauser           class _Generator,
340e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
341e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
342e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void
343e78f53d1SNikolas Klauser generate_n(_ExecutionPolicy&& __policy, _ForwardIterator __first, _Size __n, _Generator __gen) {
344e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "generate_n requires a ForwardIterator");
345e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__generate_n, __pstl::__current_configuration, _RawPolicy>;
346e78f53d1SNikolas Klauser   __pstl::__handle_exception<_Implementation>(
347e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__n), std::move(__gen));
348e78f53d1SNikolas Klauser }
349e78f53d1SNikolas Klauser 
350e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
351e78f53d1SNikolas Klauser           class _ForwardIterator,
352e78f53d1SNikolas Klauser           class _Predicate,
353e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
354e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
355e78f53d1SNikolas Klauser _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI bool
356e78f53d1SNikolas Klauser is_partitioned(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) {
357e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "is_partitioned requires ForwardIterators");
358e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__is_partitioned, __pstl::__current_configuration, _RawPolicy>;
359e78f53d1SNikolas Klauser   return __pstl::__handle_exception<_Implementation>(
360e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred));
361e78f53d1SNikolas Klauser }
362e78f53d1SNikolas Klauser 
363e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
364e78f53d1SNikolas Klauser           class _ForwardIterator1,
365e78f53d1SNikolas Klauser           class _ForwardIterator2,
366e78f53d1SNikolas Klauser           class _ForwardOutIterator,
367e78f53d1SNikolas Klauser           class _Comp,
368e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
369e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
370e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator
371e78f53d1SNikolas Klauser merge(_ExecutionPolicy&& __policy,
372e78f53d1SNikolas Klauser       _ForwardIterator1 __first1,
373e78f53d1SNikolas Klauser       _ForwardIterator1 __last1,
374e78f53d1SNikolas Klauser       _ForwardIterator2 __first2,
375e78f53d1SNikolas Klauser       _ForwardIterator2 __last2,
376e78f53d1SNikolas Klauser       _ForwardOutIterator __result,
377e78f53d1SNikolas Klauser       _Comp __comp) {
378e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "merge requires ForwardIterators");
379e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "merge requires ForwardIterators");
380e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(_ForwardOutIterator, decltype(*__first1), "merge requires an OutputIterator");
381e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(_ForwardOutIterator, decltype(*__first2), "merge requires an OutputIterator");
382e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__merge, __pstl::__current_configuration, _RawPolicy>;
383e78f53d1SNikolas Klauser   return __pstl::__handle_exception<_Implementation>(
384e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy),
385e78f53d1SNikolas Klauser       std::move(__first1),
386e78f53d1SNikolas Klauser       std::move(__last1),
387e78f53d1SNikolas Klauser       std::move(__first2),
388e78f53d1SNikolas Klauser       std::move(__last2),
389e78f53d1SNikolas Klauser       std::move(__result),
390e78f53d1SNikolas Klauser       std::move(__comp));
391e78f53d1SNikolas Klauser }
392e78f53d1SNikolas Klauser 
393e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
394e78f53d1SNikolas Klauser           class _ForwardIterator1,
395e78f53d1SNikolas Klauser           class _ForwardIterator2,
396e78f53d1SNikolas Klauser           class _ForwardOutIterator,
397e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
398e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
399e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator
400e78f53d1SNikolas Klauser merge(_ExecutionPolicy&& __policy,
401e78f53d1SNikolas Klauser       _ForwardIterator1 __first1,
402e78f53d1SNikolas Klauser       _ForwardIterator1 __last1,
403e78f53d1SNikolas Klauser       _ForwardIterator2 __first2,
404e78f53d1SNikolas Klauser       _ForwardIterator2 __last2,
405e78f53d1SNikolas Klauser       _ForwardOutIterator __result) {
406e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "merge requires ForwardIterators");
407e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "merge requires ForwardIterators");
408e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(_ForwardOutIterator, decltype(*__first1), "merge requires an OutputIterator");
409e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(_ForwardOutIterator, decltype(*__first2), "merge requires an OutputIterator");
410e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__merge, __pstl::__current_configuration, _RawPolicy>;
411e78f53d1SNikolas Klauser   return __pstl::__handle_exception<_Implementation>(
412e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy),
413e78f53d1SNikolas Klauser       std::move(__first1),
414e78f53d1SNikolas Klauser       std::move(__last1),
415e78f53d1SNikolas Klauser       std::move(__first2),
416e78f53d1SNikolas Klauser       std::move(__last2),
417e78f53d1SNikolas Klauser       std::move(__result),
418e78f53d1SNikolas Klauser       less{});
419e78f53d1SNikolas Klauser }
420e78f53d1SNikolas Klauser 
421e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
422e78f53d1SNikolas Klauser           class _ForwardIterator,
423e78f53d1SNikolas Klauser           class _ForwardOutIterator,
424e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
425e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
426e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator
427e78f53d1SNikolas Klauser move(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _ForwardOutIterator __result) {
428e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "move requires ForwardIterators");
429e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardOutIterator, "move requires an OutputIterator");
430e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
431e78f53d1SNikolas Klauser       _ForwardOutIterator, decltype(std::move(*__first)), "move requires an OutputIterator");
432e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__move, __pstl::__current_configuration, _RawPolicy>;
433e78f53d1SNikolas Klauser   return __pstl::__handle_exception<_Implementation>(
434e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__result));
435e78f53d1SNikolas Klauser }
436e78f53d1SNikolas Klauser 
437e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
438e78f53d1SNikolas Klauser           class _ForwardIterator,
439e78f53d1SNikolas Klauser           class _Pred,
440e78f53d1SNikolas Klauser           class _Tp,
441e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
442e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
443e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void
444e78f53d1SNikolas Klauser replace_if(_ExecutionPolicy&& __policy,
445e78f53d1SNikolas Klauser            _ForwardIterator __first,
446e78f53d1SNikolas Klauser            _ForwardIterator __last,
447e78f53d1SNikolas Klauser            _Pred __pred,
448e78f53d1SNikolas Klauser            const _Tp& __new_value) {
449e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "replace_if requires ForwardIterators");
450e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__replace_if, __pstl::__current_configuration, _RawPolicy>;
451e78f53d1SNikolas Klauser   __pstl::__handle_exception<_Implementation>(
452e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred), __new_value);
453e78f53d1SNikolas Klauser }
454e78f53d1SNikolas Klauser 
455e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
456e78f53d1SNikolas Klauser           class _ForwardIterator,
457e78f53d1SNikolas Klauser           class _Tp,
458e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
459e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
460e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void
461e78f53d1SNikolas Klauser replace(_ExecutionPolicy&& __policy,
462e78f53d1SNikolas Klauser         _ForwardIterator __first,
463e78f53d1SNikolas Klauser         _ForwardIterator __last,
464e78f53d1SNikolas Klauser         const _Tp& __old_value,
465e78f53d1SNikolas Klauser         const _Tp& __new_value) {
466e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "replace requires ForwardIterators");
467e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__replace, __pstl::__current_configuration, _RawPolicy>;
468e78f53d1SNikolas Klauser   __pstl::__handle_exception<_Implementation>(
469e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), __old_value, __new_value);
470e78f53d1SNikolas Klauser }
471e78f53d1SNikolas Klauser 
472e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
473e78f53d1SNikolas Klauser           class _ForwardIterator,
474e78f53d1SNikolas Klauser           class _ForwardOutIterator,
475e78f53d1SNikolas Klauser           class _Pred,
476e78f53d1SNikolas Klauser           class _Tp,
477e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
478e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
479e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void replace_copy_if(
480e78f53d1SNikolas Klauser     _ExecutionPolicy&& __policy,
481e78f53d1SNikolas Klauser     _ForwardIterator __first,
482e78f53d1SNikolas Klauser     _ForwardIterator __last,
483e78f53d1SNikolas Klauser     _ForwardOutIterator __result,
484e78f53d1SNikolas Klauser     _Pred __pred,
485e78f53d1SNikolas Klauser     const _Tp& __new_value) {
486e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "replace_copy_if requires ForwardIterators");
487e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardOutIterator, "replace_copy_if requires ForwardIterators");
488e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
489e78f53d1SNikolas Klauser       _ForwardOutIterator, decltype(*__first), "replace_copy_if requires an OutputIterator");
490e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(_ForwardOutIterator, const _Tp&, "replace_copy requires an OutputIterator");
491e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__replace_copy_if, __pstl::__current_configuration, _RawPolicy>;
492e78f53d1SNikolas Klauser   __pstl::__handle_exception<_Implementation>(
493e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy),
494e78f53d1SNikolas Klauser       std::move(__first),
495e78f53d1SNikolas Klauser       std::move(__last),
496e78f53d1SNikolas Klauser       std::move(__result),
497e78f53d1SNikolas Klauser       std::move(__pred),
498e78f53d1SNikolas Klauser       __new_value);
499e78f53d1SNikolas Klauser }
500e78f53d1SNikolas Klauser 
501e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
502e78f53d1SNikolas Klauser           class _ForwardIterator,
503e78f53d1SNikolas Klauser           class _ForwardOutIterator,
504e78f53d1SNikolas Klauser           class _Tp,
505e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
506e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
507e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void replace_copy(
508e78f53d1SNikolas Klauser     _ExecutionPolicy&& __policy,
509e78f53d1SNikolas Klauser     _ForwardIterator __first,
510e78f53d1SNikolas Klauser     _ForwardIterator __last,
511e78f53d1SNikolas Klauser     _ForwardOutIterator __result,
512e78f53d1SNikolas Klauser     const _Tp& __old_value,
513e78f53d1SNikolas Klauser     const _Tp& __new_value) {
514e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "replace_copy requires ForwardIterators");
515e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardOutIterator, "replace_copy requires ForwardIterators");
516e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
517e78f53d1SNikolas Klauser       _ForwardOutIterator, decltype(*__first), "replace_copy requires an OutputIterator");
518e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(_ForwardOutIterator, const _Tp&, "replace_copy requires an OutputIterator");
519e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__replace_copy, __pstl::__current_configuration, _RawPolicy>;
520e78f53d1SNikolas Klauser   __pstl::__handle_exception<_Implementation>(
521e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy),
522e78f53d1SNikolas Klauser       std::move(__first),
523e78f53d1SNikolas Klauser       std::move(__last),
524e78f53d1SNikolas Klauser       std::move(__result),
525e78f53d1SNikolas Klauser       __old_value,
526e78f53d1SNikolas Klauser       __new_value);
527e78f53d1SNikolas Klauser }
528e78f53d1SNikolas Klauser 
529e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
530e78f53d1SNikolas Klauser           class _ForwardIterator,
531e78f53d1SNikolas Klauser           class _ForwardOutIterator,
532e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
533e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
534e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator rotate_copy(
535e78f53d1SNikolas Klauser     _ExecutionPolicy&& __policy,
536e78f53d1SNikolas Klauser     _ForwardIterator __first,
537e78f53d1SNikolas Klauser     _ForwardIterator __middle,
538e78f53d1SNikolas Klauser     _ForwardIterator __last,
539e78f53d1SNikolas Klauser     _ForwardOutIterator __result) {
540e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "rotate_copy requires ForwardIterators");
541e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardOutIterator, "rotate_copy requires ForwardIterators");
542e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
543e78f53d1SNikolas Klauser       _ForwardOutIterator, decltype(*__first), "rotate_copy requires an OutputIterator");
544e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__rotate_copy, __pstl::__current_configuration, _RawPolicy>;
545e78f53d1SNikolas Klauser   return __pstl::__handle_exception<_Implementation>(
546e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy),
547e78f53d1SNikolas Klauser       std::move(__first),
548e78f53d1SNikolas Klauser       std::move(__middle),
549e78f53d1SNikolas Klauser       std::move(__last),
550e78f53d1SNikolas Klauser       std::move(__result));
551e78f53d1SNikolas Klauser }
552e78f53d1SNikolas Klauser 
553e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
554e78f53d1SNikolas Klauser           class _RandomAccessIterator,
555e78f53d1SNikolas Klauser           class _Comp,
556e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
557e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
558e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void
559e78f53d1SNikolas Klauser sort(_ExecutionPolicy&& __policy, _RandomAccessIterator __first, _RandomAccessIterator __last, _Comp __comp) {
560e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_RANDOM_ACCESS_ITERATOR(_RandomAccessIterator, "sort requires RandomAccessIterators");
561e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__sort, __pstl::__current_configuration, _RawPolicy>;
562e78f53d1SNikolas Klauser   __pstl::__handle_exception<_Implementation>(
563e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__comp));
564e78f53d1SNikolas Klauser }
565e78f53d1SNikolas Klauser 
566e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
567e78f53d1SNikolas Klauser           class _RandomAccessIterator,
568e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
569e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
570e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void
571e78f53d1SNikolas Klauser sort(_ExecutionPolicy&& __policy, _RandomAccessIterator __first, _RandomAccessIterator __last) {
572e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_RANDOM_ACCESS_ITERATOR(_RandomAccessIterator, "sort requires RandomAccessIterators");
573e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__sort, __pstl::__current_configuration, _RawPolicy>;
574e78f53d1SNikolas Klauser   __pstl::__handle_exception<_Implementation>(
575e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), less{});
576e78f53d1SNikolas Klauser }
577e78f53d1SNikolas Klauser 
578e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
579e78f53d1SNikolas Klauser           class _RandomAccessIterator,
580e78f53d1SNikolas Klauser           class _Comp,
581e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
582e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
583e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void
584e78f53d1SNikolas Klauser stable_sort(_ExecutionPolicy&& __policy, _RandomAccessIterator __first, _RandomAccessIterator __last, _Comp __comp) {
585e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_RANDOM_ACCESS_ITERATOR(_RandomAccessIterator, "stable_sort requires RandomAccessIterators");
586e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__stable_sort, __pstl::__current_configuration, _RawPolicy>;
587e78f53d1SNikolas Klauser   __pstl::__handle_exception<_Implementation>(
588e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__comp));
589e78f53d1SNikolas Klauser }
590e78f53d1SNikolas Klauser 
591e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
592e78f53d1SNikolas Klauser           class _RandomAccessIterator,
593e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
594e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
595e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void
596e78f53d1SNikolas Klauser stable_sort(_ExecutionPolicy&& __policy, _RandomAccessIterator __first, _RandomAccessIterator __last) {
597e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_RANDOM_ACCESS_ITERATOR(_RandomAccessIterator, "stable_sort requires RandomAccessIterators");
598e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__stable_sort, __pstl::__current_configuration, _RawPolicy>;
599e78f53d1SNikolas Klauser   __pstl::__handle_exception<_Implementation>(
600e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), less{});
601e78f53d1SNikolas Klauser }
602e78f53d1SNikolas Klauser 
603e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
604e78f53d1SNikolas Klauser           class _ForwardIterator,
605e78f53d1SNikolas Klauser           class _ForwardOutIterator,
606e78f53d1SNikolas Klauser           class _UnaryOperation,
607e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
608e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
609e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator transform(
610e78f53d1SNikolas Klauser     _ExecutionPolicy&& __policy,
611e78f53d1SNikolas Klauser     _ForwardIterator __first,
612e78f53d1SNikolas Klauser     _ForwardIterator __last,
613e78f53d1SNikolas Klauser     _ForwardOutIterator __result,
614e78f53d1SNikolas Klauser     _UnaryOperation __op) {
615e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "transform requires ForwardIterators");
616e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardOutIterator, "transform requires an OutputIterator");
617e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
618e78f53d1SNikolas Klauser       _ForwardOutIterator, decltype(__op(*__first)), "transform requires an OutputIterator");
619e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__transform, __pstl::__current_configuration, _RawPolicy>;
620e78f53d1SNikolas Klauser   return __pstl::__handle_exception<_Implementation>(
621e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy),
622e78f53d1SNikolas Klauser       std::move(__first),
623e78f53d1SNikolas Klauser       std::move(__last),
624e78f53d1SNikolas Klauser       std::move(__result),
625e78f53d1SNikolas Klauser       std::move(__op));
626e78f53d1SNikolas Klauser }
627e78f53d1SNikolas Klauser 
628e78f53d1SNikolas Klauser template <class _ExecutionPolicy,
629e78f53d1SNikolas Klauser           class _ForwardIterator1,
630e78f53d1SNikolas Klauser           class _ForwardIterator2,
631e78f53d1SNikolas Klauser           class _ForwardOutIterator,
632e78f53d1SNikolas Klauser           class _BinaryOperation,
633e78f53d1SNikolas Klauser           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
634e78f53d1SNikolas Klauser           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
635e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator transform(
636e78f53d1SNikolas Klauser     _ExecutionPolicy&& __policy,
637e78f53d1SNikolas Klauser     _ForwardIterator1 __first1,
638e78f53d1SNikolas Klauser     _ForwardIterator1 __last1,
639e78f53d1SNikolas Klauser     _ForwardIterator2 __first2,
640e78f53d1SNikolas Klauser     _ForwardOutIterator __result,
641e78f53d1SNikolas Klauser     _BinaryOperation __op) {
642e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "transform requires ForwardIterators");
643e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "transform requires ForwardIterators");
644e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardOutIterator, "transform requires an OutputIterator");
645e78f53d1SNikolas Klauser   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
646e78f53d1SNikolas Klauser       _ForwardOutIterator, decltype(__op(*__first1, *__first2)), "transform requires an OutputIterator");
647e78f53d1SNikolas Klauser   using _Implementation = __pstl::__dispatch<__pstl::__transform_binary, __pstl::__current_configuration, _RawPolicy>;
648e78f53d1SNikolas Klauser   return __pstl::__handle_exception<_Implementation>(
649e78f53d1SNikolas Klauser       std::forward<_ExecutionPolicy>(__policy),
650e78f53d1SNikolas Klauser       std::move(__first1),
651e78f53d1SNikolas Klauser       std::move(__last1),
652e78f53d1SNikolas Klauser       std::move(__first2),
653e78f53d1SNikolas Klauser       std::move(__result),
654e78f53d1SNikolas Klauser       std::move(__op));
655e78f53d1SNikolas Klauser }
656e78f53d1SNikolas Klauser 
657e78f53d1SNikolas Klauser _LIBCPP_END_NAMESPACE_STD
658e78f53d1SNikolas Klauser 
659e78f53d1SNikolas Klauser #endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17
660e78f53d1SNikolas Klauser 
661e78f53d1SNikolas Klauser _LIBCPP_POP_MACROS
662e78f53d1SNikolas Klauser 
663*ce777190SNikolas Klauser #endif // _LIBCPP___CXX03___ALGORITHM_PSTL_H
664