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-exception 6// 7//===----------------------------------------------------------------------===// 8 9#ifndef _LIBCPP___ALGORITHM_PSTL_TRANSFORM_H 10#define _LIBCPP___ALGORITHM_PSTL_TRANSFORM_H 11 12#include <__algorithm/pstl_backend.h> 13#include <__config> 14#include <__iterator/cpp17_iterator_concepts.h> 15#include <__type_traits/enable_if.h> 16#include <__type_traits/is_execution_policy.h> 17#include <__type_traits/remove_cvref.h> 18#include <__utility/move.h> 19#include <optional> 20 21#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 22# pragma GCC system_header 23#endif 24 25_LIBCPP_PUSH_MACROS 26#include <__undef_macros> 27 28#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 29 30_LIBCPP_BEGIN_NAMESPACE_STD 31 32template <class _ExecutionPolicy, 33 class _ForwardIterator, 34 class _ForwardOutIterator, 35 class _UnaryOperation, 36 class _RawPolicy = __remove_cvref_t<_ExecutionPolicy>, 37 enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0> 38[[nodiscard]] _LIBCPP_HIDE_FROM_ABI optional<__remove_cvref_t<_ForwardOutIterator>> 39__transform(_ExecutionPolicy&&, 40 _ForwardIterator&& __first, 41 _ForwardIterator&& __last, 42 _ForwardOutIterator&& __result, 43 _UnaryOperation&& __op) noexcept { 44 using _Backend = typename __select_backend<_RawPolicy>::type; 45 return std::__pstl_transform<_RawPolicy>( 46 _Backend{}, std::move(__first), std::move(__last), std::move(__result), std::move(__op)); 47} 48 49template <class _ExecutionPolicy, 50 class _ForwardIterator, 51 class _ForwardOutIterator, 52 class _UnaryOperation, 53 class _RawPolicy = __remove_cvref_t<_ExecutionPolicy>, 54 enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0> 55_LIBCPP_HIDE_FROM_ABI _ForwardOutIterator transform( 56 _ExecutionPolicy&& __policy, 57 _ForwardIterator __first, 58 _ForwardIterator __last, 59 _ForwardOutIterator __result, 60 _UnaryOperation __op) { 61 _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator); 62 _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardOutIterator); 63 _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(_ForwardOutIterator, decltype(__op(*__first))); 64 auto __res = std::__transform(__policy, std::move(__first), std::move(__last), std::move(__result), std::move(__op)); 65 if (!__res) 66 std::__throw_bad_alloc(); 67 return *std::move(__res); 68} 69 70template <class _ExecutionPolicy, 71 class _ForwardIterator1, 72 class _ForwardIterator2, 73 class _ForwardOutIterator, 74 class _BinaryOperation, 75 class _RawPolicy = __remove_cvref_t<_ExecutionPolicy>, 76 enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0> 77_LIBCPP_HIDE_FROM_ABI optional<__remove_cvref_t<_ForwardOutIterator>> 78__transform(_ExecutionPolicy&&, 79 _ForwardIterator1&& __first1, 80 _ForwardIterator1&& __last1, 81 _ForwardIterator2&& __first2, 82 _ForwardOutIterator&& __result, 83 _BinaryOperation&& __op) noexcept { 84 using _Backend = typename __select_backend<_RawPolicy>::type; 85 return std::__pstl_transform<_RawPolicy>( 86 _Backend{}, std::move(__first1), std::move(__last1), std::move(__first2), std::move(__result), std::move(__op)); 87} 88 89template <class _ExecutionPolicy, 90 class _ForwardIterator1, 91 class _ForwardIterator2, 92 class _ForwardOutIterator, 93 class _BinaryOperation, 94 class _RawPolicy = __remove_cvref_t<_ExecutionPolicy>, 95 enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0> 96_LIBCPP_HIDE_FROM_ABI _ForwardOutIterator transform( 97 _ExecutionPolicy&& __policy, 98 _ForwardIterator1 __first1, 99 _ForwardIterator1 __last1, 100 _ForwardIterator2 __first2, 101 _ForwardOutIterator __result, 102 _BinaryOperation __op) { 103 _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1); 104 _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2); 105 _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardOutIterator); 106 _LIBCPP_REQUIRE_CPP17_OUTPUT_ITERATOR(_ForwardOutIterator, decltype(__op(*__first1, *__first2))); 107 auto __res = std::__transform( 108 __policy, std::move(__first1), std::move(__last1), std::move(__first2), std::move(__result), std::move(__op)); 109 if (!__res) 110 std::__throw_bad_alloc(); 111 return *std::move(__res); 112} 113 114_LIBCPP_END_NAMESPACE_STD 115 116#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 117 118_LIBCPP_POP_MACROS 119 120#endif // _LIBCPP___ALGORITHM_PSTL_TRANSFORM_H 121