File indexing completed on 2026-05-03 08:13:58
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef _LIBCPP___NUMERIC_PSTL_H
0010 #define _LIBCPP___NUMERIC_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/identity.h>
0024 # include <__functional/operations.h>
0025 # include <__iterator/cpp17_iterator_concepts.h>
0026 # include <__iterator/iterator_traits.h>
0027 # include <__pstl/backend.h>
0028 # include <__pstl/dispatch.h>
0029 # include <__pstl/handle_exception.h>
0030 # include <__type_traits/enable_if.h>
0031 # include <__type_traits/is_execution_policy.h>
0032 # include <__type_traits/remove_cvref.h>
0033 # include <__utility/forward.h>
0034 # include <__utility/move.h>
0035
0036 _LIBCPP_BEGIN_NAMESPACE_STD
0037
0038 template <class _ExecutionPolicy,
0039 class _ForwardIterator,
0040 class _Tp,
0041 class _BinaryOperation,
0042 class _RawPolicy = __remove_cvref_t<_ExecutionPolicy>,
0043 enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0044 _LIBCPP_HIDE_FROM_ABI _Tp reduce(
0045 _ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Tp __init, _BinaryOperation __op) {
0046 _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "reduce requires ForwardIterators");
0047 using _Implementation = __pstl::__dispatch<__pstl::__reduce, __pstl::__current_configuration, _RawPolicy>;
0048 return __pstl::__handle_exception<_Implementation>(
0049 std::forward<_ExecutionPolicy>(__policy),
0050 std::move(__first),
0051 std::move(__last),
0052 std::move(__init),
0053 std::move(__op));
0054 }
0055
0056 template <class _ExecutionPolicy,
0057 class _ForwardIterator,
0058 class _Tp,
0059 class _RawPolicy = __remove_cvref_t<_ExecutionPolicy>,
0060 enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0061 _LIBCPP_HIDE_FROM_ABI _Tp
0062 reduce(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Tp __init) {
0063 _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "reduce requires ForwardIterators");
0064 using _Implementation = __pstl::__dispatch<__pstl::__reduce, __pstl::__current_configuration, _RawPolicy>;
0065 return __pstl::__handle_exception<_Implementation>(
0066 std::forward<_ExecutionPolicy>(__policy), std::move(__first), std::move(__last), std::move(__init), plus{});
0067 }
0068
0069 template <class _ExecutionPolicy,
0070 class _ForwardIterator,
0071 class _RawPolicy = __remove_cvref_t<_ExecutionPolicy>,
0072 enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0073 _LIBCPP_HIDE_FROM_ABI __iter_value_type<_ForwardIterator>
0074 reduce(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last) {
0075 _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "reduce requires ForwardIterators");
0076 using _Implementation = __pstl::__dispatch<__pstl::__reduce, __pstl::__current_configuration, _RawPolicy>;
0077 return __pstl::__handle_exception<_Implementation>(
0078 std::forward<_ExecutionPolicy>(__policy),
0079 std::move(__first),
0080 std::move(__last),
0081 __iter_value_type<_ForwardIterator>(),
0082 plus{});
0083 }
0084
0085 template <class _ExecutionPolicy,
0086 class _ForwardIterator1,
0087 class _ForwardIterator2,
0088 class _Tp,
0089 class _BinaryOperation1,
0090 class _BinaryOperation2,
0091 class _RawPolicy = __remove_cvref_t<_ExecutionPolicy>,
0092 enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0093 _LIBCPP_HIDE_FROM_ABI _Tp transform_reduce(
0094 _ExecutionPolicy&& __policy,
0095 _ForwardIterator1 __first1,
0096 _ForwardIterator1 __last1,
0097 _ForwardIterator2 __first2,
0098 _Tp __init,
0099 _BinaryOperation1 __reduce,
0100 _BinaryOperation2 __transform) {
0101 _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "transform_reduce requires ForwardIterators");
0102 _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "transform_reduce requires ForwardIterators");
0103 using _Implementation =
0104 __pstl::__dispatch<__pstl::__transform_reduce_binary, __pstl::__current_configuration, _RawPolicy>;
0105 return __pstl::__handle_exception<_Implementation>(
0106 std::forward<_ExecutionPolicy>(__policy),
0107 std::move(__first1),
0108 std::move(__last1),
0109 std::move(__first2),
0110 std::move(__init),
0111 std::move(__reduce),
0112 std::move(__transform));
0113 }
0114
0115
0116
0117 template <class _ExecutionPolicy,
0118 class _ForwardIterator1,
0119 class _ForwardIterator2,
0120 class _Tp,
0121 class _RawPolicy = __remove_cvref_t<_ExecutionPolicy>,
0122 enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0123 _LIBCPP_HIDE_FROM_ABI _Tp transform_reduce(
0124 _ExecutionPolicy&& __policy,
0125 _ForwardIterator1 __first1,
0126 _ForwardIterator1 __last1,
0127 _ForwardIterator2 __first2,
0128 _Tp __init) {
0129 _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator1, "transform_reduce requires ForwardIterators");
0130 _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator2, "transform_reduce requires ForwardIterators");
0131 using _Implementation =
0132 __pstl::__dispatch<__pstl::__transform_reduce_binary, __pstl::__current_configuration, _RawPolicy>;
0133 return __pstl::__handle_exception<_Implementation>(
0134 std::forward<_ExecutionPolicy>(__policy),
0135 std::move(__first1),
0136 std::move(__last1),
0137 std::move(__first2),
0138 std::move(__init),
0139 plus{},
0140 multiplies{});
0141 }
0142
0143 template <class _ExecutionPolicy,
0144 class _ForwardIterator,
0145 class _Tp,
0146 class _BinaryOperation,
0147 class _UnaryOperation,
0148 class _RawPolicy = __remove_cvref_t<_ExecutionPolicy>,
0149 enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0>
0150 _LIBCPP_HIDE_FROM_ABI _Tp transform_reduce(
0151 _ExecutionPolicy&& __policy,
0152 _ForwardIterator __first,
0153 _ForwardIterator __last,
0154 _Tp __init,
0155 _BinaryOperation __reduce,
0156 _UnaryOperation __transform) {
0157 _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator, "transform_reduce requires ForwardIterators");
0158 using _Implementation = __pstl::__dispatch<__pstl::__transform_reduce, __pstl::__current_configuration, _RawPolicy>;
0159 return __pstl::__handle_exception<_Implementation>(
0160 std::forward<_ExecutionPolicy>(__policy),
0161 std::move(__first),
0162 std::move(__last),
0163 std::move(__init),
0164 std::move(__reduce),
0165 std::move(__transform));
0166 }
0167
0168 _LIBCPP_END_NAMESPACE_STD
0169
0170 #endif
0171
0172 _LIBCPP_POP_MACROS
0173
0174 #endif