Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-03 08:13:09

0001 //===----------------------------------------------------------------------===//
0002 //
0003 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0004 // See https://llvm.org/LICENSE.txt for license information.
0005 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
0006 //
0007 //===----------------------------------------------------------------------===//
0008 
0009 #ifndef _LIBCPP___ALGORITHM_PSTL_H
0010 #define _LIBCPP___ALGORITHM_PSTL_H
0011 
0012 #include <__config>
0013 
0014 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
0015 #  pragma GCC system_header
0016 #endif
0017 
0018 _LIBCPP_PUSH_MACROS
0019 #include <__undef_macros>
0020 
0021 #if _LIBCPP_HAS_EXPERIMENTAL_PSTL && _LIBCPP_STD_VER >= 17
0022 
0023 #  include <__functional/operations.h>
0024 #  include <__iterator/cpp17_iterator_concepts.h>
0025 #  include <__iterator/iterator_traits.h>
0026 #  include <__pstl/backend.h>
0027 #  include <__pstl/dispatch.h>
0028 #  include <__pstl/handle_exception.h>
0029 #  include <__type_traits/enable_if.h>
0030 #  include <__type_traits/is_execution_policy.h>
0031 #  include <__type_traits/remove_cvref.h>
0032 #  include <__utility/forward.h>
0033 #  include <__utility/move.h>
0034 
0035 _LIBCPP_BEGIN_NAMESPACE_STD
0036 
0037 template <class _ExecutionPolicy,
0038           class _ForwardIterator,
0039           class _Predicate,
0040           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0041           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0042 [[nodiscard]] _LIBCPP_HIDE_FROM_ABI bool
0043 any_of(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) {
0044   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "any_of requires a ForwardIterator");
0045   using _Implementation = __pstl::__dispatch<__pstl::__any_of, __pstl::__current_configuration, _RawPolicy>;
0046   return __pstl::__handle_exception<_Implementation>(
0047       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred));
0048 }
0049 
0050 template <class _ExecutionPolicy,
0051           class _ForwardIterator,
0052           class _Pred,
0053           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0054           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0055 [[nodiscard]] _LIBCPP_HIDE_FROM_ABI bool
0056 all_of(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Pred __pred) {
0057   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "all_of requires a ForwardIterator");
0058   using _Implementation = __pstl::__dispatch<__pstl::__all_of, __pstl::__current_configuration, _RawPolicy>;
0059   return __pstl::__handle_exception<_Implementation>(
0060       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred));
0061 }
0062 
0063 template <class _ExecutionPolicy,
0064           class _ForwardIterator,
0065           class _Pred,
0066           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0067           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0068 [[nodiscard]] _LIBCPP_HIDE_FROM_ABI bool
0069 none_of(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Pred __pred) {
0070   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "none_of requires a ForwardIterator");
0071   using _Implementation = __pstl::__dispatch<__pstl::__none_of, __pstl::__current_configuration, _RawPolicy>;
0072   return __pstl::__handle_exception<_Implementation>(
0073       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred));
0074 }
0075 
0076 template <class _ExecutionPolicy,
0077           class _ForwardIterator,
0078           class _ForwardOutIterator,
0079           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0080           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0081 _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator
0082 copy(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _ForwardOutIterator __result) {
0083   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(
0084       _ForwardIterator, "copy(first, last, result) requires [first, last) to be ForwardIterators");
0085   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(
0086       _ForwardOutIterator, "copy(first, last, result) requires result to be a ForwardIterator");
0087   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
0088       _ForwardOutIterator, decltype(*__first), "copy(first, last, result) requires result to be an OutputIterator");
0089   using _Implementation = __pstl::__dispatch<__pstl::__copy, __pstl::__current_configuration, _RawPolicy>;
0090   return __pstl::__handle_exception<_Implementation>(
0091       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__result));
0092 }
0093 
0094 template <class _ExecutionPolicy,
0095           class _ForwardIterator,
0096           class _ForwardOutIterator,
0097           class _Size,
0098           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0099           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0100 _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator
0101 copy_n(_ExecutionPolicy&& __policy, _ForwardIterator __first, _Size __n, _ForwardOutIterator __result) {
0102   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(
0103       _ForwardIterator, "copy_n(first, n, result) requires first to be a ForwardIterator");
0104   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(
0105       _ForwardOutIterator, "copy_n(first, n, result) requires result to be a ForwardIterator");
0106   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
0107       _ForwardOutIterator, decltype(*__first), "copy_n(first, n, result) requires result to be an OutputIterator");
0108   using _Implementation = __pstl::__dispatch<__pstl::__copy_n, __pstl::__current_configuration, _RawPolicy>;
0109   return __pstl::__handle_exception<_Implementation>(
0110       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__n), std::move(__result));
0111 }
0112 
0113 template <class _ExecutionPolicy,
0114           class _ForwardIterator,
0115           class _Predicate,
0116           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0117           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0118 _LIBCPP_HIDE_FROM_ABI __iter_diff_t<_ForwardIterator>
0119 count_if(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) {
0120   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(
0121       _ForwardIterator, "count_if(first, last, pred) requires [first, last) to be ForwardIterators");
0122   using _Implementation = __pstl::__dispatch<__pstl::__count_if, __pstl::__current_configuration, _RawPolicy>;
0123   return __pstl::__handle_exception<_Implementation>(
0124       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred));
0125 }
0126 
0127 template <class _ExecutionPolicy,
0128           class _ForwardIterator,
0129           class _Tp,
0130           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0131           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0132 _LIBCPP_HIDE_FROM_ABI __iter_diff_t<_ForwardIterator>
0133 count(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) {
0134   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(
0135       _ForwardIterator, "count(first, last, val) requires [first, last) to be ForwardIterators");
0136   using _Implementation = __pstl::__dispatch<__pstl::__count, __pstl::__current_configuration, _RawPolicy>;
0137   return __pstl::__handle_exception<_Implementation>(
0138       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), __value);
0139 }
0140 
0141 template <class _ExecutionPolicy,
0142           class _ForwardIterator1,
0143           class _ForwardIterator2,
0144           class _Pred,
0145           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0146           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0147 _LIBCPP_HIDE_FROM_ABI bool
0148 equal(_ExecutionPolicy&& __policy,
0149       _ForwardIterator1 __first1,
0150       _ForwardIterator1 __last1,
0151       _ForwardIterator2 __first2,
0152       _Pred __pred) {
0153   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "equal requires ForwardIterators");
0154   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "equal requires ForwardIterators");
0155   using _Implementation = __pstl::__dispatch<__pstl::__equal_3leg, __pstl::__current_configuration, _RawPolicy>;
0156   return __pstl::__handle_exception<_Implementation>(
0157       std::forward<_ExecutionPolicy>(__policy),
0158       std::move(__first1),
0159       std::move(__last1),
0160       std::move(__first2),
0161       std::move(__pred));
0162 }
0163 
0164 template <class _ExecutionPolicy,
0165           class _ForwardIterator1,
0166           class _ForwardIterator2,
0167           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0168           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0169 _LIBCPP_HIDE_FROM_ABI bool
0170 equal(_ExecutionPolicy&& __policy, _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2) {
0171   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "equal requires ForwardIterators");
0172   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "equal requires ForwardIterators");
0173   using _Implementation = __pstl::__dispatch<__pstl::__equal_3leg, __pstl::__current_configuration, _RawPolicy>;
0174   return __pstl::__handle_exception<_Implementation>(
0175       std::forward<_ExecutionPolicy>(__policy),
0176       std::move(__first1),
0177       std::move(__last1),
0178       std::move(__first2),
0179       equal_to{});
0180 }
0181 
0182 template <class _ExecutionPolicy,
0183           class _ForwardIterator1,
0184           class _ForwardIterator2,
0185           class _Pred,
0186           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0187           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0188 _LIBCPP_HIDE_FROM_ABI bool
0189 equal(_ExecutionPolicy&& __policy,
0190       _ForwardIterator1 __first1,
0191       _ForwardIterator1 __last1,
0192       _ForwardIterator2 __first2,
0193       _ForwardIterator2 __last2,
0194       _Pred __pred) {
0195   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "equal requires ForwardIterators");
0196   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "equal requires ForwardIterators");
0197   using _Implementation = __pstl::__dispatch<__pstl::__equal, __pstl::__current_configuration, _RawPolicy>;
0198   return __pstl::__handle_exception<_Implementation>(
0199       std::forward<_ExecutionPolicy>(__policy),
0200       std::move(__first1),
0201       std::move(__last1),
0202       std::move(__first2),
0203       std::move(__last2),
0204       std::move(__pred));
0205 }
0206 
0207 template <class _ExecutionPolicy,
0208           class _ForwardIterator1,
0209           class _ForwardIterator2,
0210           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0211           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0212 _LIBCPP_HIDE_FROM_ABI bool
0213 equal(_ExecutionPolicy&& __policy,
0214       _ForwardIterator1 __first1,
0215       _ForwardIterator1 __last1,
0216       _ForwardIterator2 __first2,
0217       _ForwardIterator2 __last2) {
0218   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "equal requires ForwardIterators");
0219   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "equal requires ForwardIterators");
0220   using _Implementation = __pstl::__dispatch<__pstl::__equal, __pstl::__current_configuration, _RawPolicy>;
0221   return __pstl::__handle_exception<_Implementation>(
0222       std::forward<_ExecutionPolicy>(__policy),
0223       std::move(__first1),
0224       std::move(__last1),
0225       std::move(__first2),
0226       std::move(__last2),
0227       equal_to{});
0228 }
0229 
0230 template <class _ExecutionPolicy,
0231           class _ForwardIterator,
0232           class _Tp,
0233           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0234           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0235 _LIBCPP_HIDE_FROM_ABI void
0236 fill(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) {
0237   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "fill requires ForwardIterators");
0238   using _Implementation = __pstl::__dispatch<__pstl::__fill, __pstl::__current_configuration, _RawPolicy>;
0239   __pstl::__handle_exception<_Implementation>(
0240       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), __value);
0241 }
0242 
0243 template <class _ExecutionPolicy,
0244           class _ForwardIterator,
0245           class _Size,
0246           class _Tp,
0247           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0248           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0249 _LIBCPP_HIDE_FROM_ABI void
0250 fill_n(_ExecutionPolicy&& __policy, _ForwardIterator __first, _Size __n, const _Tp& __value) {
0251   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "fill_n requires a ForwardIterator");
0252   using _Implementation = __pstl::__dispatch<__pstl::__fill_n, __pstl::__current_configuration, _RawPolicy>;
0253   __pstl::__handle_exception<_Implementation>(
0254       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__n), __value);
0255 }
0256 
0257 template <class _ExecutionPolicy,
0258           class _ForwardIterator,
0259           class _Predicate,
0260           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0261           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0262 _LIBCPP_HIDE_FROM_ABI _ForwardIterator
0263 find_if(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) {
0264   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "find_if requires ForwardIterators");
0265   using _Implementation = __pstl::__dispatch<__pstl::__find_if, __pstl::__current_configuration, _RawPolicy>;
0266   return __pstl::__handle_exception<_Implementation>(
0267       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred));
0268 }
0269 
0270 template <class _ExecutionPolicy,
0271           class _ForwardIterator,
0272           class _Predicate,
0273           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0274           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0275 _LIBCPP_HIDE_FROM_ABI _ForwardIterator
0276 find_if_not(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) {
0277   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "find_if_not requires ForwardIterators");
0278   using _Implementation = __pstl::__dispatch<__pstl::__find_if_not, __pstl::__current_configuration, _RawPolicy>;
0279   return __pstl::__handle_exception<_Implementation>(
0280       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred));
0281 }
0282 
0283 template <class _ExecutionPolicy,
0284           class _ForwardIterator,
0285           class _Tp,
0286           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0287           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0288 _LIBCPP_HIDE_FROM_ABI _ForwardIterator
0289 find(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) {
0290   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "find requires ForwardIterators");
0291   using _Implementation = __pstl::__dispatch<__pstl::__find, __pstl::__current_configuration, _RawPolicy>;
0292   return __pstl::__handle_exception<_Implementation>(
0293       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), __value);
0294 }
0295 
0296 template <class _ExecutionPolicy,
0297           class _ForwardIterator,
0298           class _Function,
0299           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0300           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0301 _LIBCPP_HIDE_FROM_ABI void
0302 for_each(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Function __func) {
0303   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "for_each requires ForwardIterators");
0304   using _Implementation = __pstl::__dispatch<__pstl::__for_each, __pstl::__current_configuration, _RawPolicy>;
0305   __pstl::__handle_exception<_Implementation>(
0306       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__func));
0307 }
0308 
0309 template <class _ExecutionPolicy,
0310           class _ForwardIterator,
0311           class _Size,
0312           class _Function,
0313           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0314           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0315 _LIBCPP_HIDE_FROM_ABI void
0316 for_each_n(_ExecutionPolicy&& __policy, _ForwardIterator __first, _Size __size, _Function __func) {
0317   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "for_each_n requires a ForwardIterator");
0318   using _Implementation = __pstl::__dispatch<__pstl::__for_each_n, __pstl::__current_configuration, _RawPolicy>;
0319   __pstl::__handle_exception<_Implementation>(
0320       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__size), std::move(__func));
0321 }
0322 
0323 template <class _ExecutionPolicy,
0324           class _ForwardIterator,
0325           class _Generator,
0326           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0327           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0328 _LIBCPP_HIDE_FROM_ABI void
0329 generate(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Generator __gen) {
0330   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "generate requires ForwardIterators");
0331   using _Implementation = __pstl::__dispatch<__pstl::__generate, __pstl::__current_configuration, _RawPolicy>;
0332   __pstl::__handle_exception<_Implementation>(
0333       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__gen));
0334 }
0335 
0336 template <class _ExecutionPolicy,
0337           class _ForwardIterator,
0338           class _Size,
0339           class _Generator,
0340           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0341           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0342 _LIBCPP_HIDE_FROM_ABI void
0343 generate_n(_ExecutionPolicy&& __policy, _ForwardIterator __first, _Size __n, _Generator __gen) {
0344   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "generate_n requires a ForwardIterator");
0345   using _Implementation = __pstl::__dispatch<__pstl::__generate_n, __pstl::__current_configuration, _RawPolicy>;
0346   __pstl::__handle_exception<_Implementation>(
0347       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__n), std::move(__gen));
0348 }
0349 
0350 template <class _ExecutionPolicy,
0351           class _ForwardIterator,
0352           class _Predicate,
0353           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0354           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0355 [[nodiscard]] _LIBCPP_HIDE_FROM_ABI bool
0356 is_partitioned(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) {
0357   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "is_partitioned requires ForwardIterators");
0358   using _Implementation = __pstl::__dispatch<__pstl::__is_partitioned, __pstl::__current_configuration, _RawPolicy>;
0359   return __pstl::__handle_exception<_Implementation>(
0360       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred));
0361 }
0362 
0363 template <class _ExecutionPolicy,
0364           class _ForwardIterator1,
0365           class _ForwardIterator2,
0366           class _ForwardOutIterator,
0367           class _Comp,
0368           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0369           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0370 _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator
0371 merge(_ExecutionPolicy&& __policy,
0372       _ForwardIterator1 __first1,
0373       _ForwardIterator1 __last1,
0374       _ForwardIterator2 __first2,
0375       _ForwardIterator2 __last2,
0376       _ForwardOutIterator __result,
0377       _Comp __comp) {
0378   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "merge requires ForwardIterators");
0379   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "merge requires ForwardIterators");
0380   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(_ForwardOutIterator, decltype(*__first1), "merge requires an OutputIterator");
0381   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(_ForwardOutIterator, decltype(*__first2), "merge requires an OutputIterator");
0382   using _Implementation = __pstl::__dispatch<__pstl::__merge, __pstl::__current_configuration, _RawPolicy>;
0383   return __pstl::__handle_exception<_Implementation>(
0384       std::forward<_ExecutionPolicy>(__policy),
0385       std::move(__first1),
0386       std::move(__last1),
0387       std::move(__first2),
0388       std::move(__last2),
0389       std::move(__result),
0390       std::move(__comp));
0391 }
0392 
0393 template <class _ExecutionPolicy,
0394           class _ForwardIterator1,
0395           class _ForwardIterator2,
0396           class _ForwardOutIterator,
0397           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0398           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0399 _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator
0400 merge(_ExecutionPolicy&& __policy,
0401       _ForwardIterator1 __first1,
0402       _ForwardIterator1 __last1,
0403       _ForwardIterator2 __first2,
0404       _ForwardIterator2 __last2,
0405       _ForwardOutIterator __result) {
0406   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "merge requires ForwardIterators");
0407   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "merge requires ForwardIterators");
0408   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(_ForwardOutIterator, decltype(*__first1), "merge requires an OutputIterator");
0409   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(_ForwardOutIterator, decltype(*__first2), "merge requires an OutputIterator");
0410   using _Implementation = __pstl::__dispatch<__pstl::__merge, __pstl::__current_configuration, _RawPolicy>;
0411   return __pstl::__handle_exception<_Implementation>(
0412       std::forward<_ExecutionPolicy>(__policy),
0413       std::move(__first1),
0414       std::move(__last1),
0415       std::move(__first2),
0416       std::move(__last2),
0417       std::move(__result),
0418       less{});
0419 }
0420 
0421 template <class _ExecutionPolicy,
0422           class _ForwardIterator,
0423           class _ForwardOutIterator,
0424           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0425           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0426 _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator
0427 move(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _ForwardOutIterator __result) {
0428   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "move requires ForwardIterators");
0429   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardOutIterator, "move requires an OutputIterator");
0430   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
0431       _ForwardOutIterator, decltype(std::move(*__first)), "move requires an OutputIterator");
0432   using _Implementation = __pstl::__dispatch<__pstl::__move, __pstl::__current_configuration, _RawPolicy>;
0433   return __pstl::__handle_exception<_Implementation>(
0434       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__result));
0435 }
0436 
0437 template <class _ExecutionPolicy,
0438           class _ForwardIterator,
0439           class _Pred,
0440           class _Tp,
0441           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0442           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0443 _LIBCPP_HIDE_FROM_ABI void
0444 replace_if(_ExecutionPolicy&& __policy,
0445            _ForwardIterator __first,
0446            _ForwardIterator __last,
0447            _Pred __pred,
0448            const _Tp& __new_value) {
0449   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "replace_if requires ForwardIterators");
0450   using _Implementation = __pstl::__dispatch<__pstl::__replace_if, __pstl::__current_configuration, _RawPolicy>;
0451   __pstl::__handle_exception<_Implementation>(
0452       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__pred), __new_value);
0453 }
0454 
0455 template <class _ExecutionPolicy,
0456           class _ForwardIterator,
0457           class _Tp,
0458           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0459           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0460 _LIBCPP_HIDE_FROM_ABI void
0461 replace(_ExecutionPolicy&& __policy,
0462         _ForwardIterator __first,
0463         _ForwardIterator __last,
0464         const _Tp& __old_value,
0465         const _Tp& __new_value) {
0466   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "replace requires ForwardIterators");
0467   using _Implementation = __pstl::__dispatch<__pstl::__replace, __pstl::__current_configuration, _RawPolicy>;
0468   __pstl::__handle_exception<_Implementation>(
0469       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), __old_value, __new_value);
0470 }
0471 
0472 template <class _ExecutionPolicy,
0473           class _ForwardIterator,
0474           class _ForwardOutIterator,
0475           class _Pred,
0476           class _Tp,
0477           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0478           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0479 _LIBCPP_HIDE_FROM_ABI void replace_copy_if(
0480     _ExecutionPolicy&& __policy,
0481     _ForwardIterator __first,
0482     _ForwardIterator __last,
0483     _ForwardOutIterator __result,
0484     _Pred __pred,
0485     const _Tp& __new_value) {
0486   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "replace_copy_if requires ForwardIterators");
0487   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardOutIterator, "replace_copy_if requires ForwardIterators");
0488   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
0489       _ForwardOutIterator, decltype(*__first), "replace_copy_if requires an OutputIterator");
0490   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(_ForwardOutIterator, const _Tp&, "replace_copy requires an OutputIterator");
0491   using _Implementation = __pstl::__dispatch<__pstl::__replace_copy_if, __pstl::__current_configuration, _RawPolicy>;
0492   __pstl::__handle_exception<_Implementation>(
0493       std::forward<_ExecutionPolicy>(__policy),
0494       std::move(__first),
0495       std::move(__last),
0496       std::move(__result),
0497       std::move(__pred),
0498       __new_value);
0499 }
0500 
0501 template <class _ExecutionPolicy,
0502           class _ForwardIterator,
0503           class _ForwardOutIterator,
0504           class _Tp,
0505           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0506           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0507 _LIBCPP_HIDE_FROM_ABI void replace_copy(
0508     _ExecutionPolicy&& __policy,
0509     _ForwardIterator __first,
0510     _ForwardIterator __last,
0511     _ForwardOutIterator __result,
0512     const _Tp& __old_value,
0513     const _Tp& __new_value) {
0514   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "replace_copy requires ForwardIterators");
0515   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardOutIterator, "replace_copy requires ForwardIterators");
0516   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
0517       _ForwardOutIterator, decltype(*__first), "replace_copy requires an OutputIterator");
0518   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(_ForwardOutIterator, const _Tp&, "replace_copy requires an OutputIterator");
0519   using _Implementation = __pstl::__dispatch<__pstl::__replace_copy, __pstl::__current_configuration, _RawPolicy>;
0520   __pstl::__handle_exception<_Implementation>(
0521       std::forward<_ExecutionPolicy>(__policy),
0522       std::move(__first),
0523       std::move(__last),
0524       std::move(__result),
0525       __old_value,
0526       __new_value);
0527 }
0528 
0529 template <class _ExecutionPolicy,
0530           class _ForwardIterator,
0531           class _ForwardOutIterator,
0532           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0533           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0534 _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator rotate_copy(
0535     _ExecutionPolicy&& __policy,
0536     _ForwardIterator __first,
0537     _ForwardIterator __middle,
0538     _ForwardIterator __last,
0539     _ForwardOutIterator __result) {
0540   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "rotate_copy requires ForwardIterators");
0541   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardOutIterator, "rotate_copy requires ForwardIterators");
0542   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
0543       _ForwardOutIterator, decltype(*__first), "rotate_copy requires an OutputIterator");
0544   using _Implementation = __pstl::__dispatch<__pstl::__rotate_copy, __pstl::__current_configuration, _RawPolicy>;
0545   return __pstl::__handle_exception<_Implementation>(
0546       std::forward<_ExecutionPolicy>(__policy),
0547       std::move(__first),
0548       std::move(__middle),
0549       std::move(__last),
0550       std::move(__result));
0551 }
0552 
0553 template <class _ExecutionPolicy,
0554           class _RandomAccessIterator,
0555           class _Comp,
0556           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0557           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0558 _LIBCPP_HIDE_FROM_ABI void
0559 sort(_ExecutionPolicy&& __policy, _RandomAccessIterator __first, _RandomAccessIterator __last, _Comp __comp) {
0560   _LIBCPP_REQUIRE_CPP17_RANDOM_ACCESS_ITERATOR(_RandomAccessIterator, "sort requires RandomAccessIterators");
0561   using _Implementation = __pstl::__dispatch<__pstl::__sort, __pstl::__current_configuration, _RawPolicy>;
0562   __pstl::__handle_exception<_Implementation>(
0563       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__comp));
0564 }
0565 
0566 template <class _ExecutionPolicy,
0567           class _RandomAccessIterator,
0568           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0569           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0570 _LIBCPP_HIDE_FROM_ABI void
0571 sort(_ExecutionPolicy&& __policy, _RandomAccessIterator __first, _RandomAccessIterator __last) {
0572   _LIBCPP_REQUIRE_CPP17_RANDOM_ACCESS_ITERATOR(_RandomAccessIterator, "sort requires RandomAccessIterators");
0573   using _Implementation = __pstl::__dispatch<__pstl::__sort, __pstl::__current_configuration, _RawPolicy>;
0574   __pstl::__handle_exception<_Implementation>(
0575       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), less{});
0576 }
0577 
0578 template <class _ExecutionPolicy,
0579           class _RandomAccessIterator,
0580           class _Comp,
0581           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0582           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0583 _LIBCPP_HIDE_FROM_ABI void
0584 stable_sort(_ExecutionPolicy&& __policy, _RandomAccessIterator __first, _RandomAccessIterator __last, _Comp __comp) {
0585   _LIBCPP_REQUIRE_CPP17_RANDOM_ACCESS_ITERATOR(_RandomAccessIterator, "stable_sort requires RandomAccessIterators");
0586   using _Implementation = __pstl::__dispatch<__pstl::__stable_sort, __pstl::__current_configuration, _RawPolicy>;
0587   __pstl::__handle_exception<_Implementation>(
0588       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__comp));
0589 }
0590 
0591 template <class _ExecutionPolicy,
0592           class _RandomAccessIterator,
0593           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0594           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0595 _LIBCPP_HIDE_FROM_ABI void
0596 stable_sort(_ExecutionPolicy&& __policy, _RandomAccessIterator __first, _RandomAccessIterator __last) {
0597   _LIBCPP_REQUIRE_CPP17_RANDOM_ACCESS_ITERATOR(_RandomAccessIterator, "stable_sort requires RandomAccessIterators");
0598   using _Implementation = __pstl::__dispatch<__pstl::__stable_sort, __pstl::__current_configuration, _RawPolicy>;
0599   __pstl::__handle_exception<_Implementation>(
0600       std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), less{});
0601 }
0602 
0603 template <class _ExecutionPolicy,
0604           class _ForwardIterator,
0605           class _ForwardOutIterator,
0606           class _UnaryOperation,
0607           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0608           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0609 _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator transform(
0610     _ExecutionPolicy&& __policy,
0611     _ForwardIterator __first,
0612     _ForwardIterator __last,
0613     _ForwardOutIterator __result,
0614     _UnaryOperation __op) {
0615   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "transform requires ForwardIterators");
0616   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardOutIterator, "transform requires an OutputIterator");
0617   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
0618       _ForwardOutIterator, decltype(__op(*__first)), "transform requires an OutputIterator");
0619   using _Implementation = __pstl::__dispatch<__pstl::__transform, __pstl::__current_configuration, _RawPolicy>;
0620   return __pstl::__handle_exception<_Implementation>(
0621       std::forward<_ExecutionPolicy>(__policy),
0622       std::move(__first),
0623       std::move(__last),
0624       std::move(__result),
0625       std::move(__op));
0626 }
0627 
0628 template <class _ExecutionPolicy,
0629           class _ForwardIterator1,
0630           class _ForwardIterator2,
0631           class _ForwardOutIterator,
0632           class _BinaryOperation,
0633           class _RawPolicy                                    = __remove_cvref_t<_ExecutionPolicy>,
0634           enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0635 _LIBCPP_HIDE_FROM_ABI _ForwardOutIterator transform(
0636     _ExecutionPolicy&& __policy,
0637     _ForwardIterator1 __first1,
0638     _ForwardIterator1 __last1,
0639     _ForwardIterator2 __first2,
0640     _ForwardOutIterator __result,
0641     _BinaryOperation __op) {
0642   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "transform requires ForwardIterators");
0643   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "transform requires ForwardIterators");
0644   _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardOutIterator, "transform requires an OutputIterator");
0645   _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(
0646       _ForwardOutIterator, decltype(__op(*__first1, *__first2)), "transform requires an OutputIterator");
0647   using _Implementation = __pstl::__dispatch<__pstl::__transform_binary, __pstl::__current_configuration, _RawPolicy>;
0648   return __pstl::__handle_exception<_Implementation>(
0649       std::forward<_ExecutionPolicy>(__policy),
0650       std::move(__first1),
0651       std::move(__last1),
0652       std::move(__first2),
0653       std::move(__result),
0654       std::move(__op));
0655 }
0656 
0657 _LIBCPP_END_NAMESPACE_STD
0658 
0659 #endif // _LIBCPP_HAS_EXPERIMENTAL_PSTL && _LIBCPP_STD_VER >= 17
0660 
0661 _LIBCPP_POP_MACROS
0662 
0663 #endif // _LIBCPP___ALGORITHM_PSTL_H