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