1e78f53d1SNikolas Klauser //===----------------------------------------------------------------------===// 2e78f53d1SNikolas Klauser // 3e78f53d1SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e78f53d1SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 5e78f53d1SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e78f53d1SNikolas Klauser // 7e78f53d1SNikolas Klauser //===----------------------------------------------------------------------===// 8e78f53d1SNikolas Klauser 9*ce777190SNikolas Klauser #ifndef _LIBCPP___CXX03___NUMERIC_PSTL_H 10*ce777190SNikolas Klauser #define _LIBCPP___CXX03___NUMERIC_PSTL_H 11e78f53d1SNikolas Klauser 1273fbae83SNikolas Klauser #include <__cxx03/__config> 13e78f53d1SNikolas Klauser 14e78f53d1SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 15e78f53d1SNikolas Klauser # pragma GCC system_header 16e78f53d1SNikolas Klauser #endif 17e78f53d1SNikolas Klauser 18e78f53d1SNikolas Klauser _LIBCPP_PUSH_MACROS 1973fbae83SNikolas Klauser #include <__cxx03/__undef_macros> 20e78f53d1SNikolas Klauser 21e78f53d1SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 22e78f53d1SNikolas Klauser 2373fbae83SNikolas Klauser # include <__cxx03/__functional/identity.h> 2473fbae83SNikolas Klauser # include <__cxx03/__functional/operations.h> 2573fbae83SNikolas Klauser # include <__cxx03/__iterator/cpp17_iterator_concepts.h> 2673fbae83SNikolas Klauser # include <__cxx03/__iterator/iterator_traits.h> 2773fbae83SNikolas Klauser # include <__cxx03/__pstl/backend.h> 2873fbae83SNikolas Klauser # include <__cxx03/__pstl/dispatch.h> 2973fbae83SNikolas Klauser # include <__cxx03/__pstl/handle_exception.h> 3073fbae83SNikolas Klauser # include <__cxx03/__type_traits/enable_if.h> 3173fbae83SNikolas Klauser # include <__cxx03/__type_traits/is_execution_policy.h> 3273fbae83SNikolas Klauser # include <__cxx03/__type_traits/remove_cvref.h> 3373fbae83SNikolas Klauser # include <__cxx03/__utility/forward.h> 3473fbae83SNikolas Klauser # include <__cxx03/__utility/move.h> 35e78f53d1SNikolas Klauser 36e78f53d1SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD 37e78f53d1SNikolas Klauser 38e78f53d1SNikolas Klauser template <class _ExecutionPolicy, 39e78f53d1SNikolas Klauser class _ForwardIterator, 40e78f53d1SNikolas Klauser class _Tp, 41e78f53d1SNikolas Klauser class _BinaryOperation, 42e78f53d1SNikolas Klauser class _RawPolicy = __remove_cvref_t<_ExecutionPolicy>, 43e78f53d1SNikolas Klauser enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0> 44e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _Tp reduce( 45e78f53d1SNikolas Klauser _ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Tp __init, _BinaryOperation __op) { 46e78f53d1SNikolas Klauser _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "reduce requires ForwardIterators"); 47e78f53d1SNikolas Klauser using _Implementation = __pstl::__dispatch<__pstl::__reduce, __pstl::__current_configuration, _RawPolicy>; 48e78f53d1SNikolas Klauser return __pstl::__handle_exception<_Implementation>( 49e78f53d1SNikolas Klauser std::forward<_ExecutionPolicy>(__policy), 50e78f53d1SNikolas Klauser std::move(__first), 51e78f53d1SNikolas Klauser std::move(__last), 52e78f53d1SNikolas Klauser std::move(__init), 53e78f53d1SNikolas Klauser std::move(__op)); 54e78f53d1SNikolas Klauser } 55e78f53d1SNikolas Klauser 56e78f53d1SNikolas Klauser template <class _ExecutionPolicy, 57e78f53d1SNikolas Klauser class _ForwardIterator, 58e78f53d1SNikolas Klauser class _Tp, 59e78f53d1SNikolas Klauser class _RawPolicy = __remove_cvref_t<_ExecutionPolicy>, 60e78f53d1SNikolas Klauser enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0> 61e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _Tp 62e78f53d1SNikolas Klauser reduce(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Tp __init) { 63e78f53d1SNikolas Klauser _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "reduce requires ForwardIterators"); 64e78f53d1SNikolas Klauser using _Implementation = __pstl::__dispatch<__pstl::__reduce, __pstl::__current_configuration, _RawPolicy>; 65e78f53d1SNikolas Klauser return __pstl::__handle_exception<_Implementation>( 66e78f53d1SNikolas Klauser std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__init), plus{}); 67e78f53d1SNikolas Klauser } 68e78f53d1SNikolas Klauser 69e78f53d1SNikolas Klauser template <class _ExecutionPolicy, 70e78f53d1SNikolas Klauser class _ForwardIterator, 71e78f53d1SNikolas Klauser class _RawPolicy = __remove_cvref_t<_ExecutionPolicy>, 72e78f53d1SNikolas Klauser enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0> 73e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI __iter_value_type<_ForwardIterator> 74e78f53d1SNikolas Klauser reduce(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last) { 75e78f53d1SNikolas Klauser _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "reduce requires ForwardIterators"); 76e78f53d1SNikolas Klauser using _Implementation = __pstl::__dispatch<__pstl::__reduce, __pstl::__current_configuration, _RawPolicy>; 77e78f53d1SNikolas Klauser return __pstl::__handle_exception<_Implementation>( 78e78f53d1SNikolas Klauser std::forward<_ExecutionPolicy>(__policy), 79e78f53d1SNikolas Klauser std::move(__first), 80e78f53d1SNikolas Klauser std::move(__last), 81e78f53d1SNikolas Klauser __iter_value_type<_ForwardIterator>(), 82e78f53d1SNikolas Klauser plus{}); 83e78f53d1SNikolas Klauser } 84e78f53d1SNikolas Klauser 85e78f53d1SNikolas Klauser template <class _ExecutionPolicy, 86e78f53d1SNikolas Klauser class _ForwardIterator1, 87e78f53d1SNikolas Klauser class _ForwardIterator2, 88e78f53d1SNikolas Klauser class _Tp, 89e78f53d1SNikolas Klauser class _BinaryOperation1, 90e78f53d1SNikolas Klauser class _BinaryOperation2, 91e78f53d1SNikolas Klauser class _RawPolicy = __remove_cvref_t<_ExecutionPolicy>, 92e78f53d1SNikolas Klauser enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0> 93e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _Tp transform_reduce( 94e78f53d1SNikolas Klauser _ExecutionPolicy&& __policy, 95e78f53d1SNikolas Klauser _ForwardIterator1 __first1, 96e78f53d1SNikolas Klauser _ForwardIterator1 __last1, 97e78f53d1SNikolas Klauser _ForwardIterator2 __first2, 98e78f53d1SNikolas Klauser _Tp __init, 99e78f53d1SNikolas Klauser _BinaryOperation1 __reduce, 100e78f53d1SNikolas Klauser _BinaryOperation2 __transform) { 101e78f53d1SNikolas Klauser _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "transform_reduce requires ForwardIterators"); 102e78f53d1SNikolas Klauser _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "transform_reduce requires ForwardIterators"); 103e78f53d1SNikolas Klauser using _Implementation = 104e78f53d1SNikolas Klauser __pstl::__dispatch<__pstl::__transform_reduce_binary, __pstl::__current_configuration, _RawPolicy>; 105e78f53d1SNikolas Klauser return __pstl::__handle_exception<_Implementation>( 106e78f53d1SNikolas Klauser std::forward<_ExecutionPolicy>(__policy), 107e78f53d1SNikolas Klauser std::move(__first1), 108e78f53d1SNikolas Klauser std::move(__last1), 109e78f53d1SNikolas Klauser std::move(__first2), 110e78f53d1SNikolas Klauser std::move(__init), 111e78f53d1SNikolas Klauser std::move(__reduce), 112e78f53d1SNikolas Klauser std::move(__transform)); 113e78f53d1SNikolas Klauser } 114e78f53d1SNikolas Klauser 115e78f53d1SNikolas Klauser // This overload doesn't get a customization point because it's trivial to detect (through e.g. 116e78f53d1SNikolas Klauser // __desugars_to_v) when specializing the more general variant, which should always be preferred 117e78f53d1SNikolas Klauser template <class _ExecutionPolicy, 118e78f53d1SNikolas Klauser class _ForwardIterator1, 119e78f53d1SNikolas Klauser class _ForwardIterator2, 120e78f53d1SNikolas Klauser class _Tp, 121e78f53d1SNikolas Klauser class _RawPolicy = __remove_cvref_t<_ExecutionPolicy>, 122e78f53d1SNikolas Klauser enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0> 123e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _Tp transform_reduce( 124e78f53d1SNikolas Klauser _ExecutionPolicy&& __policy, 125e78f53d1SNikolas Klauser _ForwardIterator1 __first1, 126e78f53d1SNikolas Klauser _ForwardIterator1 __last1, 127e78f53d1SNikolas Klauser _ForwardIterator2 __first2, 128e78f53d1SNikolas Klauser _Tp __init) { 129e78f53d1SNikolas Klauser _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "transform_reduce requires ForwardIterators"); 130e78f53d1SNikolas Klauser _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "transform_reduce requires ForwardIterators"); 131e78f53d1SNikolas Klauser using _Implementation = 132e78f53d1SNikolas Klauser __pstl::__dispatch<__pstl::__transform_reduce_binary, __pstl::__current_configuration, _RawPolicy>; 133e78f53d1SNikolas Klauser return __pstl::__handle_exception<_Implementation>( 134e78f53d1SNikolas Klauser std::forward<_ExecutionPolicy>(__policy), 135e78f53d1SNikolas Klauser std::move(__first1), 136e78f53d1SNikolas Klauser std::move(__last1), 137e78f53d1SNikolas Klauser std::move(__first2), 138e78f53d1SNikolas Klauser std::move(__init), 139e78f53d1SNikolas Klauser plus{}, 140e78f53d1SNikolas Klauser multiplies{}); 141e78f53d1SNikolas Klauser } 142e78f53d1SNikolas Klauser 143e78f53d1SNikolas Klauser template <class _ExecutionPolicy, 144e78f53d1SNikolas Klauser class _ForwardIterator, 145e78f53d1SNikolas Klauser class _Tp, 146e78f53d1SNikolas Klauser class _BinaryOperation, 147e78f53d1SNikolas Klauser class _UnaryOperation, 148e78f53d1SNikolas Klauser class _RawPolicy = __remove_cvref_t<_ExecutionPolicy>, 149e78f53d1SNikolas Klauser enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0> 150e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _Tp transform_reduce( 151e78f53d1SNikolas Klauser _ExecutionPolicy&& __policy, 152e78f53d1SNikolas Klauser _ForwardIterator __first, 153e78f53d1SNikolas Klauser _ForwardIterator __last, 154e78f53d1SNikolas Klauser _Tp __init, 155e78f53d1SNikolas Klauser _BinaryOperation __reduce, 156e78f53d1SNikolas Klauser _UnaryOperation __transform) { 157e78f53d1SNikolas Klauser _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "transform_reduce requires ForwardIterators"); 158e78f53d1SNikolas Klauser using _Implementation = __pstl::__dispatch<__pstl::__transform_reduce, __pstl::__current_configuration, _RawPolicy>; 159e78f53d1SNikolas Klauser return __pstl::__handle_exception<_Implementation>( 160e78f53d1SNikolas Klauser std::forward<_ExecutionPolicy>(__policy), 161e78f53d1SNikolas Klauser std::move(__first), 162e78f53d1SNikolas Klauser std::move(__last), 163e78f53d1SNikolas Klauser std::move(__init), 164e78f53d1SNikolas Klauser std::move(__reduce), 165e78f53d1SNikolas Klauser std::move(__transform)); 166e78f53d1SNikolas Klauser } 167e78f53d1SNikolas Klauser 168e78f53d1SNikolas Klauser _LIBCPP_END_NAMESPACE_STD 169e78f53d1SNikolas Klauser 170e78f53d1SNikolas Klauser #endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 171e78f53d1SNikolas Klauser 172e78f53d1SNikolas Klauser _LIBCPP_POP_MACROS 173e78f53d1SNikolas Klauser 174*ce777190SNikolas Klauser #endif // _LIBCPP___CXX03___NUMERIC_PSTL_H 175