xref: /llvm-project/libcxx/include/__algorithm/pstl.h (revision 24e70e3930724ce499ad05d669bfbc4423c542e0)
1e406d5edSLouis Dionne //===----------------------------------------------------------------------===//
2e406d5edSLouis Dionne //
3e406d5edSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e406d5edSLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5e406d5edSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e406d5edSLouis Dionne //
7e406d5edSLouis Dionne //===----------------------------------------------------------------------===//
8e406d5edSLouis Dionne 
9e406d5edSLouis Dionne #ifndef _LIBCPP___ALGORITHM_PSTL_H
10e406d5edSLouis Dionne #define _LIBCPP___ALGORITHM_PSTL_H
11e406d5edSLouis Dionne 
12e406d5edSLouis Dionne #include <__config>
13acb896a3SLouis Dionne 
14acb896a3SLouis Dionne #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
15acb896a3SLouis Dionne #  pragma GCC system_header
16acb896a3SLouis Dionne #endif
17acb896a3SLouis Dionne 
18acb896a3SLouis Dionne _LIBCPP_PUSH_MACROS
19acb896a3SLouis Dionne #include <__undef_macros>
20acb896a3SLouis Dionne 
21*24e70e39SNikolas Klauser #if _LIBCPP_HAS_EXPERIMENTAL_PSTL && _LIBCPP_STD_VER >= 17
22acb896a3SLouis Dionne 
23e406d5edSLouis Dionne #  include <__functional/operations.h>
24e406d5edSLouis Dionne #  include <__iterator/cpp17_iterator_concepts.h>
25e406d5edSLouis Dionne #  include <__iterator/iterator_traits.h>
269540950aSLouis Dionne #  include <__pstl/backend.h>
279540950aSLouis Dionne #  include <__pstl/dispatch.h>
289540950aSLouis Dionne #  include <__pstl/handle_exception.h>
29e406d5edSLouis Dionne #  include <__type_traits/enable_if.h>
30e406d5edSLouis Dionne #  include <__type_traits/is_execution_policy.h>
31e406d5edSLouis Dionne #  include <__type_traits/remove_cvref.h>
329540950aSLouis Dionne #  include <__utility/forward.h>
33e406d5edSLouis Dionne #  include <__utility/move.h>
34e406d5edSLouis Dionne 
35e406d5edSLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD
36e406d5edSLouis Dionne 
37e406d5edSLouis Dionne template <class _ExecutionPolicy,
38e406d5edSLouis Dionne           class _ForwardIterator,
39e406d5edSLouis Dionne           class _Predicate,
40e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
41e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
42e406d5edSLouis Dionne [[nodiscard]] _LIBCPP_HIDE_FROM_ABI bool
43e406d5edSLouis Dionne any_of(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) {
44e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "any_of requires a ForwardIterator");
459540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__any_of, __pstl::__current_configuration, _RawPolicy>;
469540950aSLouis Dionne   return __pstl::__handle_exception<_Implementation>(
479540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred));
48e406d5edSLouis Dionne }
49e406d5edSLouis Dionne 
50e406d5edSLouis Dionne template <class _ExecutionPolicy,
51e406d5edSLouis Dionne           class _ForwardIterator,
52e406d5edSLouis Dionne           class _Pred,
53e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
54e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
55e406d5edSLouis Dionne [[nodiscard]] _LIBCPP_HIDE_FROM_ABI bool
56e406d5edSLouis Dionne all_of(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Pred __pred) {
57e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "all_of requires a ForwardIterator");
589540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__all_of, __pstl::__current_configuration, _RawPolicy>;
599540950aSLouis Dionne   return __pstl::__handle_exception<_Implementation>(
609540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred));
61e406d5edSLouis Dionne }
62e406d5edSLouis Dionne 
63e406d5edSLouis Dionne template <class _ExecutionPolicy,
64e406d5edSLouis Dionne           class _ForwardIterator,
65e406d5edSLouis Dionne           class _Pred,
66e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
67e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
68e406d5edSLouis Dionne [[nodiscard]] _LIBCPP_HIDE_FROM_ABI bool
69e406d5edSLouis Dionne none_of(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Pred __pred) {
70e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "none_of requires a ForwardIterator");
719540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__none_of, __pstl::__current_configuration, _RawPolicy>;
729540950aSLouis Dionne   return __pstl::__handle_exception<_Implementation>(
739540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred));
74e406d5edSLouis Dionne }
75e406d5edSLouis Dionne 
76e406d5edSLouis Dionne template <class _ExecutionPolicy,
77e406d5edSLouis Dionne           class _ForwardIterator,
78e406d5edSLouis Dionne           class _ForwardOutIterator,
79e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
80e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
81e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator
82e406d5edSLouis Dionne copy(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _ForwardOutIterator __result) {
83e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(
84e406d5edSLouis Dionne       _ForwardIterator, "copy(first, last, result) requires [first, last) to be ForwardIterators");
85e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(
86e406d5edSLouis Dionne       _ForwardOutIterator, "copy(first, last, result) requires result to be a ForwardIterator");
87e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
88e406d5edSLouis Dionne       _ForwardOutIterator, decltype(*__first), "copy(first, last, result) requires result to be an OutputIterator");
899540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__copy, __pstl::__current_configuration, _RawPolicy>;
909540950aSLouis Dionne   return __pstl::__handle_exception<_Implementation>(
919540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__result));
92e406d5edSLouis Dionne }
93e406d5edSLouis Dionne 
94e406d5edSLouis Dionne template <class _ExecutionPolicy,
95e406d5edSLouis Dionne           class _ForwardIterator,
96e406d5edSLouis Dionne           class _ForwardOutIterator,
97e406d5edSLouis Dionne           class _Size,
98e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
99e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
100e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator
101e406d5edSLouis Dionne copy_n(_ExecutionPolicy&& __policy, _ForwardIterator __first, _Size __n, _ForwardOutIterator __result) {
102e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(
103e406d5edSLouis Dionne       _ForwardIterator, "copy_n(first, n, result) requires first to be a ForwardIterator");
104e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(
105e406d5edSLouis Dionne       _ForwardOutIterator, "copy_n(first, n, result) requires result to be a ForwardIterator");
106e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
107e406d5edSLouis Dionne       _ForwardOutIterator, decltype(*__first), "copy_n(first, n, result) requires result to be an OutputIterator");
1089540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__copy_n, __pstl::__current_configuration, _RawPolicy>;
1099540950aSLouis Dionne   return __pstl::__handle_exception<_Implementation>(
1109540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__n), std::move(__result));
111e406d5edSLouis Dionne }
112e406d5edSLouis Dionne 
113e406d5edSLouis Dionne template <class _ExecutionPolicy,
114e406d5edSLouis Dionne           class _ForwardIterator,
115e406d5edSLouis Dionne           class _Predicate,
116e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
117e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
118e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI __iter_diff_t<_ForwardIterator>
119e406d5edSLouis Dionne count_if(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) {
120e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(
121e406d5edSLouis Dionne       _ForwardIterator, "count_if(first, last, pred) requires [first, last) to be ForwardIterators");
1229540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__count_if, __pstl::__current_configuration, _RawPolicy>;
1239540950aSLouis Dionne   return __pstl::__handle_exception<_Implementation>(
1249540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred));
125e406d5edSLouis Dionne }
126e406d5edSLouis Dionne 
127e406d5edSLouis Dionne template <class _ExecutionPolicy,
128e406d5edSLouis Dionne           class _ForwardIterator,
129e406d5edSLouis Dionne           class _Tp,
130e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
131e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
132e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI __iter_diff_t<_ForwardIterator>
133e406d5edSLouis Dionne count(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) {
134e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(
135e406d5edSLouis Dionne       _ForwardIterator, "count(first, last, val) requires [first, last) to be ForwardIterators");
1369540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__count, __pstl::__current_configuration, _RawPolicy>;
1379540950aSLouis Dionne   return __pstl::__handle_exception<_Implementation>(
1389540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), __value);
139e406d5edSLouis Dionne }
140e406d5edSLouis Dionne 
141e406d5edSLouis Dionne template <class _ExecutionPolicy,
142e406d5edSLouis Dionne           class _ForwardIterator1,
143e406d5edSLouis Dionne           class _ForwardIterator2,
144e406d5edSLouis Dionne           class _Pred,
145e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
146e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
147e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI bool
148e406d5edSLouis Dionne equal(_ExecutionPolicy&& __policy,
149e406d5edSLouis Dionne       _ForwardIterator1 __first1,
150e406d5edSLouis Dionne       _ForwardIterator1 __last1,
151e406d5edSLouis Dionne       _ForwardIterator2 __first2,
152e406d5edSLouis Dionne       _Pred __pred) {
153e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "equal requires ForwardIterators");
154e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "equal requires ForwardIterators");
1559540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__equal_3leg, __pstl::__current_configuration, _RawPolicy>;
1569540950aSLouis Dionne   return __pstl::__handle_exception<_Implementation>(
1579540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy),
1589540950aSLouis Dionne       std::move(__first1),
1599540950aSLouis Dionne       std::move(__last1),
1609540950aSLouis Dionne       std::move(__first2),
1619540950aSLouis Dionne       std::move(__pred));
162e406d5edSLouis Dionne }
163e406d5edSLouis Dionne 
164e406d5edSLouis Dionne template <class _ExecutionPolicy,
165e406d5edSLouis Dionne           class _ForwardIterator1,
166e406d5edSLouis Dionne           class _ForwardIterator2,
1679540950aSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
1689540950aSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
169e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI bool
170e406d5edSLouis Dionne equal(_ExecutionPolicy&& __policy, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2) {
171e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "equal requires ForwardIterators");
172e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "equal requires ForwardIterators");
1739540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__equal_3leg, __pstl::__current_configuration, _RawPolicy>;
1749540950aSLouis Dionne   return __pstl::__handle_exception<_Implementation>(
1759540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy),
176e406d5edSLouis Dionne       std::move(__first1),
177e406d5edSLouis Dionne       std::move(__last1),
178e406d5edSLouis Dionne       std::move(__first2),
1799540950aSLouis Dionne       equal_to{});
180e406d5edSLouis Dionne }
181e406d5edSLouis Dionne 
182e406d5edSLouis Dionne template <class _ExecutionPolicy,
183e406d5edSLouis Dionne           class _ForwardIterator1,
184e406d5edSLouis Dionne           class _ForwardIterator2,
185e406d5edSLouis Dionne           class _Pred,
186e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
187e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
188e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI bool
189e406d5edSLouis Dionne equal(_ExecutionPolicy&& __policy,
190e406d5edSLouis Dionne       _ForwardIterator1 __first1,
191e406d5edSLouis Dionne       _ForwardIterator1 __last1,
192e406d5edSLouis Dionne       _ForwardIterator2 __first2,
193e406d5edSLouis Dionne       _ForwardIterator2 __last2,
194e406d5edSLouis Dionne       _Pred __pred) {
195e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "equal requires ForwardIterators");
196e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "equal requires ForwardIterators");
1979540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__equal, __pstl::__current_configuration, _RawPolicy>;
1989540950aSLouis Dionne   return __pstl::__handle_exception<_Implementation>(
1999540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy),
2009540950aSLouis Dionne       std::move(__first1),
2019540950aSLouis Dionne       std::move(__last1),
2029540950aSLouis Dionne       std::move(__first2),
2039540950aSLouis Dionne       std::move(__last2),
2049540950aSLouis Dionne       std::move(__pred));
205e406d5edSLouis Dionne }
206e406d5edSLouis Dionne 
207e406d5edSLouis Dionne template <class _ExecutionPolicy,
208e406d5edSLouis Dionne           class _ForwardIterator1,
209e406d5edSLouis Dionne           class _ForwardIterator2,
2109540950aSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
2119540950aSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
212e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI bool
213e406d5edSLouis Dionne equal(_ExecutionPolicy&& __policy,
214e406d5edSLouis Dionne       _ForwardIterator1 __first1,
215e406d5edSLouis Dionne       _ForwardIterator1 __last1,
216e406d5edSLouis Dionne       _ForwardIterator2 __first2,
217e406d5edSLouis Dionne       _ForwardIterator2 __last2) {
218e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "equal requires ForwardIterators");
219e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "equal requires ForwardIterators");
2209540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__equal, __pstl::__current_configuration, _RawPolicy>;
2219540950aSLouis Dionne   return __pstl::__handle_exception<_Implementation>(
2229540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy),
2239540950aSLouis Dionne       std::move(__first1),
2249540950aSLouis Dionne       std::move(__last1),
2259540950aSLouis Dionne       std::move(__first2),
2269540950aSLouis Dionne       std::move(__last2),
2279540950aSLouis Dionne       equal_to{});
228e406d5edSLouis Dionne }
229e406d5edSLouis Dionne 
230e406d5edSLouis Dionne template <class _ExecutionPolicy,
231e406d5edSLouis Dionne           class _ForwardIterator,
232e406d5edSLouis Dionne           class _Tp,
233e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
234e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
235e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI void
236e406d5edSLouis Dionne fill(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) {
237e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "fill requires ForwardIterators");
2389540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__fill, __pstl::__current_configuration, _RawPolicy>;
2399540950aSLouis Dionne   __pstl::__handle_exception<_Implementation>(
2409540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), __value);
241e406d5edSLouis Dionne }
242e406d5edSLouis Dionne 
243e406d5edSLouis Dionne template <class _ExecutionPolicy,
244e406d5edSLouis Dionne           class _ForwardIterator,
2459540950aSLouis Dionne           class _Size,
246e406d5edSLouis Dionne           class _Tp,
247e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
248e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
249e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI void
2509540950aSLouis Dionne fill_n(_ExecutionPolicy&& __policy, _ForwardIterator __first, _Size __n, const _Tp& __value) {
251fe4cd104SLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "fill_n requires a ForwardIterator");
2529540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__fill_n, __pstl::__current_configuration, _RawPolicy>;
2539540950aSLouis Dionne   __pstl::__handle_exception<_Implementation>(
2549540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__n), __value);
255e406d5edSLouis Dionne }
256e406d5edSLouis Dionne 
257e406d5edSLouis Dionne template <class _ExecutionPolicy,
258e406d5edSLouis Dionne           class _ForwardIterator,
259e406d5edSLouis Dionne           class _Predicate,
260e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
261e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
2629540950aSLouis Dionne _LIBCPP_HIDE_FROM_ABI _ForwardIterator
2639540950aSLouis Dionne find_if(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) {
2649540950aSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "find_if requires ForwardIterators");
2659540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__find_if, __pstl::__current_configuration, _RawPolicy>;
2669540950aSLouis Dionne   return __pstl::__handle_exception<_Implementation>(
2679540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred));
268e406d5edSLouis Dionne }
269e406d5edSLouis Dionne 
270e406d5edSLouis Dionne template <class _ExecutionPolicy,
271e406d5edSLouis Dionne           class _ForwardIterator,
272e406d5edSLouis Dionne           class _Predicate,
273e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
274e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
275e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI _ForwardIterator
276e406d5edSLouis Dionne find_if_not(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) {
277e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "find_if_not requires ForwardIterators");
2789540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__find_if_not, __pstl::__current_configuration, _RawPolicy>;
2799540950aSLouis Dionne   return __pstl::__handle_exception<_Implementation>(
2809540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred));
281e406d5edSLouis Dionne }
282e406d5edSLouis Dionne 
283e406d5edSLouis Dionne template <class _ExecutionPolicy,
284e406d5edSLouis Dionne           class _ForwardIterator,
285e406d5edSLouis Dionne           class _Tp,
286e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
287e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
288e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI _ForwardIterator
289e406d5edSLouis Dionne find(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) {
290e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "find requires ForwardIterators");
2919540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__find, __pstl::__current_configuration, _RawPolicy>;
2929540950aSLouis Dionne   return __pstl::__handle_exception<_Implementation>(
2939540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), __value);
294e406d5edSLouis Dionne }
295e406d5edSLouis Dionne 
296e406d5edSLouis Dionne template <class _ExecutionPolicy,
297e406d5edSLouis Dionne           class _ForwardIterator,
298e406d5edSLouis Dionne           class _Function,
299e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
300e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
3019540950aSLouis Dionne _LIBCPP_HIDE_FROM_ABI void
3029540950aSLouis Dionne for_each(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Function __func) {
3039540950aSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "for_each requires ForwardIterators");
3049540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__for_each, __pstl::__current_configuration, _RawPolicy>;
3059540950aSLouis Dionne   __pstl::__handle_exception<_Implementation>(
3069540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__func));
307e406d5edSLouis Dionne }
308e406d5edSLouis Dionne 
309e406d5edSLouis Dionne template <class _ExecutionPolicy,
310e406d5edSLouis Dionne           class _ForwardIterator,
311e406d5edSLouis Dionne           class _Size,
312e406d5edSLouis Dionne           class _Function,
313e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
314e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
315e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI void
316e406d5edSLouis Dionne for_each_n(_ExecutionPolicy&& __policy, _ForwardIterator __first, _Size __size, _Function __func) {
317e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "for_each_n requires a ForwardIterator");
3189540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__for_each_n, __pstl::__current_configuration, _RawPolicy>;
3199540950aSLouis Dionne   __pstl::__handle_exception<_Implementation>(
3209540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__size), std::move(__func));
321e406d5edSLouis Dionne }
322e406d5edSLouis Dionne 
323e406d5edSLouis Dionne template <class _ExecutionPolicy,
324e406d5edSLouis Dionne           class _ForwardIterator,
325e406d5edSLouis Dionne           class _Generator,
326e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
327e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
328e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI void
329e406d5edSLouis Dionne generate(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Generator __gen) {
330e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "generate requires ForwardIterators");
3319540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__generate, __pstl::__current_configuration, _RawPolicy>;
3329540950aSLouis Dionne   __pstl::__handle_exception<_Implementation>(
3339540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__gen));
334e406d5edSLouis Dionne }
335e406d5edSLouis Dionne 
336e406d5edSLouis Dionne template <class _ExecutionPolicy,
337e406d5edSLouis Dionne           class _ForwardIterator,
338e406d5edSLouis Dionne           class _Size,
339e406d5edSLouis Dionne           class _Generator,
340e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
341e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
342e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI void
343e406d5edSLouis Dionne generate_n(_ExecutionPolicy&& __policy, _ForwardIterator __first, _Size __n, _Generator __gen) {
344e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "generate_n requires a ForwardIterator");
3459540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__generate_n, __pstl::__current_configuration, _RawPolicy>;
3469540950aSLouis Dionne   __pstl::__handle_exception<_Implementation>(
3479540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__n), std::move(__gen));
348e406d5edSLouis Dionne }
349e406d5edSLouis Dionne 
350e406d5edSLouis Dionne template <class _ExecutionPolicy,
351e406d5edSLouis Dionne           class _ForwardIterator,
352e406d5edSLouis Dionne           class _Predicate,
353e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
354e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
35517e0686aSNikolas Klauser [[nodiscard]] _LIBCPP_HIDE_FROM_ABI bool
356e406d5edSLouis Dionne is_partitioned(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) {
357e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "is_partitioned requires ForwardIterators");
3589540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__is_partitioned, __pstl::__current_configuration, _RawPolicy>;
3599540950aSLouis Dionne   return __pstl::__handle_exception<_Implementation>(
3609540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred));
361e406d5edSLouis Dionne }
362e406d5edSLouis Dionne 
363e406d5edSLouis Dionne template <class _ExecutionPolicy,
364e406d5edSLouis Dionne           class _ForwardIterator1,
365e406d5edSLouis Dionne           class _ForwardIterator2,
366e406d5edSLouis Dionne           class _ForwardOutIterator,
367e406d5edSLouis Dionne           class _Comp,
368e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
369e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
3709540950aSLouis Dionne _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator
3719540950aSLouis Dionne merge(_ExecutionPolicy&& __policy,
3729540950aSLouis Dionne       _ForwardIterator1 __first1,
3739540950aSLouis Dionne       _ForwardIterator1 __last1,
3749540950aSLouis Dionne       _ForwardIterator2 __first2,
3759540950aSLouis Dionne       _ForwardIterator2 __last2,
3769540950aSLouis Dionne       _ForwardOutIterator __result,
3779540950aSLouis Dionne       _Comp __comp) {
3789540950aSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "merge requires ForwardIterators");
3799540950aSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "merge requires ForwardIterators");
3809540950aSLouis Dionne   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(_ForwardOutIterator, decltype(*__first1), "merge requires an OutputIterator");
3819540950aSLouis Dionne   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(_ForwardOutIterator, decltype(*__first2), "merge requires an OutputIterator");
3829540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__merge, __pstl::__current_configuration, _RawPolicy>;
3839540950aSLouis Dionne   return __pstl::__handle_exception<_Implementation>(
3849540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy),
3859540950aSLouis Dionne       std::move(__first1),
3869540950aSLouis Dionne       std::move(__last1),
3879540950aSLouis Dionne       std::move(__first2),
3889540950aSLouis Dionne       std::move(__last2),
3899540950aSLouis Dionne       std::move(__result),
3909540950aSLouis Dionne       std::move(__comp));
391e406d5edSLouis Dionne }
392e406d5edSLouis Dionne 
393e406d5edSLouis Dionne template <class _ExecutionPolicy,
394e406d5edSLouis Dionne           class _ForwardIterator1,
395e406d5edSLouis Dionne           class _ForwardIterator2,
396e406d5edSLouis Dionne           class _ForwardOutIterator,
397e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
398e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
399e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator
400e406d5edSLouis Dionne merge(_ExecutionPolicy&& __policy,
401e406d5edSLouis Dionne       _ForwardIterator1 __first1,
402e406d5edSLouis Dionne       _ForwardIterator1 __last1,
403e406d5edSLouis Dionne       _ForwardIterator2 __first2,
404e406d5edSLouis Dionne       _ForwardIterator2 __last2,
4059540950aSLouis Dionne       _ForwardOutIterator __result) {
406e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "merge requires ForwardIterators");
407e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "merge requires ForwardIterators");
408e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(_ForwardOutIterator, decltype(*__first1), "merge requires an OutputIterator");
409e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(_ForwardOutIterator, decltype(*__first2), "merge requires an OutputIterator");
4109540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__merge, __pstl::__current_configuration, _RawPolicy>;
4119540950aSLouis Dionne   return __pstl::__handle_exception<_Implementation>(
4129540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy),
413e406d5edSLouis Dionne       std::move(__first1),
414e406d5edSLouis Dionne       std::move(__last1),
415e406d5edSLouis Dionne       std::move(__first2),
416e406d5edSLouis Dionne       std::move(__last2),
417e406d5edSLouis Dionne       std::move(__result),
4189540950aSLouis Dionne       less{});
419e406d5edSLouis Dionne }
420e406d5edSLouis Dionne 
421e406d5edSLouis Dionne template <class _ExecutionPolicy,
422e406d5edSLouis Dionne           class _ForwardIterator,
423e406d5edSLouis Dionne           class _ForwardOutIterator,
424e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
425e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
426e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator
427e406d5edSLouis Dionne move(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _ForwardOutIterator __result) {
428e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "move requires ForwardIterators");
429e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardOutIterator, "move requires an OutputIterator");
430e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
431e406d5edSLouis Dionne       _ForwardOutIterator, decltype(std::move(*__first)), "move requires an OutputIterator");
4329540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__move, __pstl::__current_configuration, _RawPolicy>;
4339540950aSLouis Dionne   return __pstl::__handle_exception<_Implementation>(
4349540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__result));
435e406d5edSLouis Dionne }
436e406d5edSLouis Dionne 
437e406d5edSLouis Dionne template <class _ExecutionPolicy,
438e406d5edSLouis Dionne           class _ForwardIterator,
439e406d5edSLouis Dionne           class _Pred,
440e406d5edSLouis Dionne           class _Tp,
441e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
442e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
443e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI void
444e406d5edSLouis Dionne replace_if(_ExecutionPolicy&& __policy,
445e406d5edSLouis Dionne            _ForwardIterator __first,
446e406d5edSLouis Dionne            _ForwardIterator __last,
447e406d5edSLouis Dionne            _Pred __pred,
448e406d5edSLouis Dionne            const _Tp& __new_value) {
449e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "replace_if requires ForwardIterators");
4509540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__replace_if, __pstl::__current_configuration, _RawPolicy>;
4519540950aSLouis Dionne   __pstl::__handle_exception<_Implementation>(
4529540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred), __new_value);
453e406d5edSLouis Dionne }
454e406d5edSLouis Dionne 
455e406d5edSLouis Dionne template <class _ExecutionPolicy,
456e406d5edSLouis Dionne           class _ForwardIterator,
457e406d5edSLouis Dionne           class _Tp,
458e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
459e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
460e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI void
461e406d5edSLouis Dionne replace(_ExecutionPolicy&& __policy,
462e406d5edSLouis Dionne         _ForwardIterator __first,
463e406d5edSLouis Dionne         _ForwardIterator __last,
464e406d5edSLouis Dionne         const _Tp& __old_value,
465e406d5edSLouis Dionne         const _Tp& __new_value) {
466e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "replace requires ForwardIterators");
4679540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__replace, __pstl::__current_configuration, _RawPolicy>;
4689540950aSLouis Dionne   __pstl::__handle_exception<_Implementation>(
4699540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), __old_value, __new_value);
470e406d5edSLouis Dionne }
471e406d5edSLouis Dionne 
472e406d5edSLouis Dionne template <class _ExecutionPolicy,
473e406d5edSLouis Dionne           class _ForwardIterator,
474e406d5edSLouis Dionne           class _ForwardOutIterator,
475e406d5edSLouis Dionne           class _Pred,
476e406d5edSLouis Dionne           class _Tp,
477e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
478e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
479e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI void replace_copy_if(
480e406d5edSLouis Dionne     _ExecutionPolicy&& __policy,
481e406d5edSLouis Dionne     _ForwardIterator __first,
482e406d5edSLouis Dionne     _ForwardIterator __last,
483e406d5edSLouis Dionne     _ForwardOutIterator __result,
484e406d5edSLouis Dionne     _Pred __pred,
485e406d5edSLouis Dionne     const _Tp& __new_value) {
486e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "replace_copy_if requires ForwardIterators");
487e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardOutIterator, "replace_copy_if requires ForwardIterators");
488e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
489e406d5edSLouis Dionne       _ForwardOutIterator, decltype(*__first), "replace_copy_if requires an OutputIterator");
490e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(_ForwardOutIterator, const _Tp&, "replace_copy requires an OutputIterator");
4919540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__replace_copy_if, __pstl::__current_configuration, _RawPolicy>;
4929540950aSLouis Dionne   __pstl::__handle_exception<_Implementation>(
4939540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy),
494e406d5edSLouis Dionne       std::move(__first),
495e406d5edSLouis Dionne       std::move(__last),
496e406d5edSLouis Dionne       std::move(__result),
4979540950aSLouis Dionne       std::move(__pred),
498e406d5edSLouis Dionne       __new_value);
499e406d5edSLouis Dionne }
500e406d5edSLouis Dionne 
501e406d5edSLouis Dionne template <class _ExecutionPolicy,
502e406d5edSLouis Dionne           class _ForwardIterator,
503e406d5edSLouis Dionne           class _ForwardOutIterator,
504e406d5edSLouis Dionne           class _Tp,
505e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
506e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
507e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI void replace_copy(
508e406d5edSLouis Dionne     _ExecutionPolicy&& __policy,
509e406d5edSLouis Dionne     _ForwardIterator __first,
510e406d5edSLouis Dionne     _ForwardIterator __last,
511e406d5edSLouis Dionne     _ForwardOutIterator __result,
512e406d5edSLouis Dionne     const _Tp& __old_value,
513e406d5edSLouis Dionne     const _Tp& __new_value) {
514e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "replace_copy requires ForwardIterators");
515e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardOutIterator, "replace_copy requires ForwardIterators");
516e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
517e406d5edSLouis Dionne       _ForwardOutIterator, decltype(*__first), "replace_copy requires an OutputIterator");
518e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(_ForwardOutIterator, const _Tp&, "replace_copy requires an OutputIterator");
5199540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__replace_copy, __pstl::__current_configuration, _RawPolicy>;
5209540950aSLouis Dionne   __pstl::__handle_exception<_Implementation>(
5219540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy),
522e406d5edSLouis Dionne       std::move(__first),
523e406d5edSLouis Dionne       std::move(__last),
5249540950aSLouis Dionne       std::move(__result),
5259540950aSLouis Dionne       __old_value,
5269540950aSLouis Dionne       __new_value);
527e406d5edSLouis Dionne }
528e406d5edSLouis Dionne 
529e406d5edSLouis Dionne template <class _ExecutionPolicy,
530e406d5edSLouis Dionne           class _ForwardIterator,
531e406d5edSLouis Dionne           class _ForwardOutIterator,
532e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
533e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
534e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator rotate_copy(
535e406d5edSLouis Dionne     _ExecutionPolicy&& __policy,
536e406d5edSLouis Dionne     _ForwardIterator __first,
537e406d5edSLouis Dionne     _ForwardIterator __middle,
538e406d5edSLouis Dionne     _ForwardIterator __last,
539e406d5edSLouis Dionne     _ForwardOutIterator __result) {
540e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "rotate_copy requires ForwardIterators");
541e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardOutIterator, "rotate_copy requires ForwardIterators");
542e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
543e406d5edSLouis Dionne       _ForwardOutIterator, decltype(*__first), "rotate_copy requires an OutputIterator");
5449540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__rotate_copy, __pstl::__current_configuration, _RawPolicy>;
5459540950aSLouis Dionne   return __pstl::__handle_exception<_Implementation>(
5469540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy),
5479540950aSLouis Dionne       std::move(__first),
5489540950aSLouis Dionne       std::move(__middle),
5499540950aSLouis Dionne       std::move(__last),
5509540950aSLouis Dionne       std::move(__result));
551e406d5edSLouis Dionne }
552e406d5edSLouis Dionne 
553e406d5edSLouis Dionne template <class _ExecutionPolicy,
554e406d5edSLouis Dionne           class _RandomAccessIterator,
555e406d5edSLouis Dionne           class _Comp,
556e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
557e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
558e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI void
559e406d5edSLouis Dionne sort(_ExecutionPolicy&& __policy, _RandomAccessIterator __first, _RandomAccessIterator __last, _Comp __comp) {
560e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_RANDOM_ACCESS_ITERATOR(_RandomAccessIterator, "sort requires RandomAccessIterators");
5619540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__sort, __pstl::__current_configuration, _RawPolicy>;
5629540950aSLouis Dionne   __pstl::__handle_exception<_Implementation>(
5639540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__comp));
564e406d5edSLouis Dionne }
565e406d5edSLouis Dionne 
566e406d5edSLouis Dionne template <class _ExecutionPolicy,
567e406d5edSLouis Dionne           class _RandomAccessIterator,
568e406d5edSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
569e406d5edSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
570e406d5edSLouis Dionne _LIBCPP_HIDE_FROM_ABI void
571e406d5edSLouis Dionne sort(_ExecutionPolicy&& __policy, _RandomAccessIterator __first, _RandomAccessIterator __last) {
572e406d5edSLouis Dionne   _LIBCPP_REQUIRE_CPP17_RANDOM_ACCESS_ITERATOR(_RandomAccessIterator, "sort requires RandomAccessIterators");
5739540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__sort, __pstl::__current_configuration, _RawPolicy>;
5749540950aSLouis Dionne   __pstl::__handle_exception<_Implementation>(
5759540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), less{});
5769540950aSLouis Dionne }
5779540950aSLouis Dionne 
5789540950aSLouis Dionne template <class _ExecutionPolicy,
5799540950aSLouis Dionne           class _RandomAccessIterator,
5809540950aSLouis Dionne           class _Comp,
5819540950aSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
5829540950aSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
5839540950aSLouis Dionne _LIBCPP_HIDE_FROM_ABI void
5849540950aSLouis Dionne stable_sort(_ExecutionPolicy&& __policy, _RandomAccessIterator __first, _RandomAccessIterator __last, _Comp __comp) {
5859540950aSLouis Dionne   _LIBCPP_REQUIRE_CPP17_RANDOM_ACCESS_ITERATOR(_RandomAccessIterator, "stable_sort requires RandomAccessIterators");
5869540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__stable_sort, __pstl::__current_configuration, _RawPolicy>;
5879540950aSLouis Dionne   __pstl::__handle_exception<_Implementation>(
5889540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__comp));
5899540950aSLouis Dionne }
5909540950aSLouis Dionne 
5919540950aSLouis Dionne template <class _ExecutionPolicy,
5929540950aSLouis Dionne           class _RandomAccessIterator,
5939540950aSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
5949540950aSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
5959540950aSLouis Dionne _LIBCPP_HIDE_FROM_ABI void
5969540950aSLouis Dionne stable_sort(_ExecutionPolicy&& __policy, _RandomAccessIterator __first, _RandomAccessIterator __last) {
5979540950aSLouis Dionne   _LIBCPP_REQUIRE_CPP17_RANDOM_ACCESS_ITERATOR(_RandomAccessIterator, "stable_sort requires RandomAccessIterators");
5989540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__stable_sort, __pstl::__current_configuration, _RawPolicy>;
5999540950aSLouis Dionne   __pstl::__handle_exception<_Implementation>(
6009540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), less{});
6019540950aSLouis Dionne }
6029540950aSLouis Dionne 
6039540950aSLouis Dionne template <class _ExecutionPolicy,
6049540950aSLouis Dionne           class _ForwardIterator,
6059540950aSLouis Dionne           class _ForwardOutIterator,
6069540950aSLouis Dionne           class _UnaryOperation,
6079540950aSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
6089540950aSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
6099540950aSLouis Dionne _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator transform(
6109540950aSLouis Dionne     _ExecutionPolicy&& __policy,
6119540950aSLouis Dionne     _ForwardIterator __first,
6129540950aSLouis Dionne     _ForwardIterator __last,
6139540950aSLouis Dionne     _ForwardOutIterator __result,
6149540950aSLouis Dionne     _UnaryOperation __op) {
6159540950aSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "transform requires ForwardIterators");
6169540950aSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardOutIterator, "transform requires an OutputIterator");
6179540950aSLouis Dionne   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
6189540950aSLouis Dionne       _ForwardOutIterator, decltype(__op(*__first)), "transform requires an OutputIterator");
6199540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__transform, __pstl::__current_configuration, _RawPolicy>;
6209540950aSLouis Dionne   return __pstl::__handle_exception<_Implementation>(
6219540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy),
6229540950aSLouis Dionne       std::move(__first),
6239540950aSLouis Dionne       std::move(__last),
6249540950aSLouis Dionne       std::move(__result),
6259540950aSLouis Dionne       std::move(__op));
6269540950aSLouis Dionne }
6279540950aSLouis Dionne 
6289540950aSLouis Dionne template <class _ExecutionPolicy,
6299540950aSLouis Dionne           class _ForwardIterator1,
6309540950aSLouis Dionne           class _ForwardIterator2,
6319540950aSLouis Dionne           class _ForwardOutIterator,
6329540950aSLouis Dionne           class _BinaryOperation,
6339540950aSLouis Dionne           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
6349540950aSLouis Dionne           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
6359540950aSLouis Dionne _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator transform(
6369540950aSLouis Dionne     _ExecutionPolicy&& __policy,
6379540950aSLouis Dionne     _ForwardIterator1 __first1,
6389540950aSLouis Dionne     _ForwardIterator1 __last1,
6399540950aSLouis Dionne     _ForwardIterator2 __first2,
6409540950aSLouis Dionne     _ForwardOutIterator __result,
6419540950aSLouis Dionne     _BinaryOperation __op) {
6429540950aSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "transform requires ForwardIterators");
6439540950aSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "transform requires ForwardIterators");
6449540950aSLouis Dionne   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardOutIterator, "transform requires an OutputIterator");
6459540950aSLouis Dionne   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
6469540950aSLouis Dionne       _ForwardOutIterator, decltype(__op(*__first1, *__first2)), "transform requires an OutputIterator");
6479540950aSLouis Dionne   using _Implementation = __pstl::__dispatch<__pstl::__transform_binary, __pstl::__current_configuration, _RawPolicy>;
6489540950aSLouis Dionne   return __pstl::__handle_exception<_Implementation>(
6499540950aSLouis Dionne       std::forward<_ExecutionPolicy>(__policy),
6509540950aSLouis Dionne       std::move(__first1),
6519540950aSLouis Dionne       std::move(__last1),
6529540950aSLouis Dionne       std::move(__first2),
6539540950aSLouis Dionne       std::move(__result),
6549540950aSLouis Dionne       std::move(__op));
655e406d5edSLouis Dionne }
656e406d5edSLouis Dionne 
657e406d5edSLouis Dionne _LIBCPP_END_NAMESPACE_STD
658e406d5edSLouis Dionne 
659*24e70e39SNikolas Klauser #endif // _LIBCPP_HAS_EXPERIMENTAL_PSTL && _LIBCPP_STD_VER >= 17
660e406d5edSLouis Dionne 
661e406d5edSLouis Dionne _LIBCPP_POP_MACROS
662e406d5edSLouis Dionne 
663e406d5edSLouis Dionne #endif // _LIBCPP___ALGORITHM_PSTL_H
664