Back to home page

EIC code displayed by LXR

 
 

    


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

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___CXX03___NUMERIC_PSTL_H
0010 #define _LIBCPP___CXX03___NUMERIC_PSTL_H
0011 
0012 #include <__cxx03/__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 <__cxx03/__undef_macros>
0020 
0021 #if !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17
0022 
0023 #  include <__cxx03/__functional/identity.h>
0024 #  include <__cxx03/__functional/operations.h>
0025 #  include <__cxx03/__iterator/cpp17_iterator_concepts.h>
0026 #  include <__cxx03/__iterator/iterator_traits.h>
0027 #  include <__cxx03/__pstl/backend.h>
0028 #  include <__cxx03/__pstl/dispatch.h>
0029 #  include <__cxx03/__pstl/handle_exception.h>
0030 #  include <__cxx03/__type_traits/enable_if.h>
0031 #  include <__cxx03/__type_traits/is_execution_policy.h>
0032 #  include <__cxx03/__type_traits/remove_cvref.h>
0033 #  include <__cxx03/__utility/forward.h>
0034 #  include <__cxx03/__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 // This overload doesn't get a customization point because it's trivial to detect (through e.g.
0116 // __desugars_to_v) when specializing the more general variant, which should always be preferred
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 // !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17
0171 
0172 _LIBCPP_POP_MACROS
0173 
0174 #endif // _LIBCPP___CXX03___NUMERIC_PSTL_H