Back to home page

EIC code displayed by LXR

 
 

    


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

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___PSTL_BACKEND_FWD_H
0010 #define _LIBCPP___CXX03___PSTL_BACKEND_FWD_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 //
0022 // This header declares available PSTL backends and the functions that must be implemented in order for the
0023 // PSTL algorithms to be provided.
0024 //
0025 // Backends often do not implement the full set of functions themselves -- a configuration of the PSTL is
0026 // usually a set of backends "stacked" together which each implement some algorithms under some execution
0027 // policies. It is only necessary for the "stack" of backends to implement all algorithms under all execution
0028 // policies, but a single backend is not required to implement everything on its own.
0029 //
0030 // The signatures used by each backend function are documented below.
0031 //
0032 // Exception handling
0033 // ==================
0034 //
0035 // PSTL backends are expected to report errors (i.e. failure to allocate) by returning a disengaged `optional` from
0036 // their implementation. Exceptions shouldn't be used to report an internal failure-to-allocate, since all exceptions
0037 // are turned into a program termination at the front-end level. When a backend returns a disengaged `optional` to the
0038 // frontend, the frontend will turn that into a call to `std::__throw_bad_alloc();` to report the internal failure to
0039 // the user.
0040 //
0041 
0042 _LIBCPP_BEGIN_NAMESPACE_STD
0043 namespace __pstl {
0044 
0045 template <class... _Backends>
0046 struct __backend_configuration;
0047 
0048 struct __default_backend_tag;
0049 struct __libdispatch_backend_tag;
0050 struct __serial_backend_tag;
0051 struct __std_thread_backend_tag;
0052 
0053 #if defined(_LIBCPP_PSTL_BACKEND_SERIAL)
0054 using __current_configuration = __backend_configuration<__serial_backend_tag, __default_backend_tag>;
0055 #elif defined(_LIBCPP_PSTL_BACKEND_STD_THREAD)
0056 using __current_configuration = __backend_configuration<__std_thread_backend_tag, __default_backend_tag>;
0057 #elif defined(_LIBCPP_PSTL_BACKEND_LIBDISPATCH)
0058 using __current_configuration = __backend_configuration<__libdispatch_backend_tag, __default_backend_tag>;
0059 #else
0060 
0061 // ...New vendors can add parallel backends here...
0062 
0063 #  error "Invalid PSTL backend configuration"
0064 #endif
0065 
0066 template <class _Backend, class _ExecutionPolicy>
0067 struct __find_if;
0068 // template <class _Policy, class _ForwardIterator, class _Predicate>
0069 // optional<_ForwardIterator>
0070 // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) const noexcept;
0071 
0072 template <class _Backend, class _ExecutionPolicy>
0073 struct __find_if_not;
0074 // template <class _Policy, class _ForwardIterator, class _Predicate>
0075 // optional<_ForwardIterator>
0076 // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) const noexcept;
0077 
0078 template <class _Backend, class _ExecutionPolicy>
0079 struct __find;
0080 // template <class _Policy, class _ForwardIterator, class _Tp>
0081 // optional<_ForwardIterator>
0082 // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) const noexcept;
0083 
0084 template <class _Backend, class _ExecutionPolicy>
0085 struct __any_of;
0086 // template <class _Policy, class _ForwardIterator, class _Predicate>
0087 // optional<bool>
0088 // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) const noexcept;
0089 
0090 template <class _Backend, class _ExecutionPolicy>
0091 struct __all_of;
0092 // template <class _Policy, class _ForwardIterator, class _Predicate>
0093 // optional<bool>
0094 // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) const noexcept;
0095 
0096 template <class _Backend, class _ExecutionPolicy>
0097 struct __none_of;
0098 // template <class _Policy, class _ForwardIterator, class _Predicate>
0099 // optional<bool>
0100 // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) const noexcept;
0101 
0102 template <class _Backend, class _ExecutionPolicy>
0103 struct __is_partitioned;
0104 // template <class _Policy, class _ForwardIterator, class _Predicate>
0105 // optional<bool>
0106 // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) const noexcept;
0107 
0108 template <class _Backend, class _ExecutionPolicy>
0109 struct __for_each;
0110 // template <class _Policy, class _ForwardIterator, class _Function>
0111 // optional<__empty>
0112 // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Function __func) const noexcept;
0113 
0114 template <class _Backend, class _ExecutionPolicy>
0115 struct __for_each_n;
0116 // template <class _Policy, class _ForwardIterator, class _Size, class _Function>
0117 // optional<__empty>
0118 // operator()(_Policy&&, _ForwardIterator __first, _Size __size, _Function __func) const noexcept;
0119 
0120 template <class _Backend, class _ExecutionPolicy>
0121 struct __fill;
0122 // template <class _Policy, class _ForwardIterator, class _Tp>
0123 // optional<__empty>
0124 // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Tp const& __value) const noexcept;
0125 
0126 template <class _Backend, class _ExecutionPolicy>
0127 struct __fill_n;
0128 // template <class _Policy, class _ForwardIterator, class _Size, class _Tp>
0129 // optional<__empty>
0130 // operator()(_Policy&&, _ForwardIterator __first, _Size __n, _Tp const& __value) const noexcept;
0131 
0132 template <class _Backend, class _ExecutionPolicy>
0133 struct __replace;
0134 // template <class _Policy, class _ForwardIterator, class _Tp>
0135 // optional<__empty>
0136 // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last,
0137 //                       _Tp const& __old, _Tp const& __new) const noexcept;
0138 
0139 template <class _Backend, class _ExecutionPolicy>
0140 struct __replace_if;
0141 // template <class _Policy, class _ForwardIterator, class _Predicate, class _Tp>
0142 // optional<__empty>
0143 // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last,
0144 //                       _Predicate __pred, _Tp const& __new_value) const noexcept;
0145 
0146 template <class _Backend, class _ExecutionPolicy>
0147 struct __generate;
0148 // template <class _Policy, class _ForwardIterator, class _Generator>
0149 // optional<__empty>
0150 // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Generator __gen) const noexcept;
0151 
0152 template <class _Backend, class _ExecutionPolicy>
0153 struct __generate_n;
0154 // template <class _Policy, class _ForwardIterator, class _Size, class _Generator>
0155 // optional<__empty>
0156 // operator()(_Policy&&, _ForwardIterator __first, _Size __n, _Generator __gen) const noexcept;
0157 
0158 template <class _Backend, class _ExecutionPolicy>
0159 struct __merge;
0160 // template <class _Policy, class _ForwardIterator1, class _ForwardIterator2, class _ForwardOutIterator, class _Comp>
0161 // optional<_ForwardOutIterator>
0162 // operator()(_Policy&&, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
0163 //                       _ForwardIterator2 __first2, _ForwardIterator2 __last2,
0164 //                       _ForwardOutIterator __result, _Comp __comp) const noexcept;
0165 
0166 template <class _Backend, class _ExecutionPolicy>
0167 struct __stable_sort;
0168 // template <class _Policy, class _RandomAccessIterator, class _Comp>
0169 // optional<__empty>
0170 // operator()(_Policy&&, _RandomAccessIterator __first, _RandomAccessIterator __last, _Comp __comp) const noexcept;
0171 
0172 template <class _Backend, class _ExecutionPolicy>
0173 struct __sort;
0174 // template <class _Policy, class _RandomAccessIterator, class _Comp>
0175 // optional<__empty>
0176 // operator()(_Policy&&, _RandomAccessIterator __first, _RandomAccessIterator __last, _Comp __comp) const noexcept;
0177 
0178 template <class _Backend, class _ExecutionPolicy>
0179 struct __transform;
0180 // template <class _Policy, class _ForwardIterator, class _ForwardOutIterator, class _UnaryOperation>
0181 // optional<_ForwardOutIterator>
0182 // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last,
0183 //                       _ForwardOutIterator __result,
0184 //                       _UnaryOperation __op) const noexcept;
0185 
0186 template <class _Backend, class _ExecutionPolicy>
0187 struct __transform_binary;
0188 // template <class _Policy, class _ForwardIterator1, class _ForwardIterator2,
0189 //                          class _ForwardOutIterator,
0190 //                          class _BinaryOperation>
0191 // optional<_ForwardOutIterator>
0192 // operator()(_Policy&&, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
0193 //                       _ForwardIterator2 __first2,
0194 //                       _ForwardOutIterator __result,
0195 //                       _BinaryOperation __op) const noexcept;
0196 
0197 template <class _Backend, class _ExecutionPolicy>
0198 struct __replace_copy_if;
0199 // template <class _Policy, class _ForwardIterator, class _ForwardOutIterator, class _Predicate, class _Tp>
0200 // optional<__empty>
0201 // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last,
0202 //                       _ForwardOutIterator __out_it,
0203 //                       _Predicate __pred,
0204 //                       _Tp const& __new_value) const noexcept;
0205 
0206 template <class _Backend, class _ExecutionPolicy>
0207 struct __replace_copy;
0208 // template <class _Policy, class _ForwardIterator, class _ForwardOutIterator, class _Tp>
0209 // optional<__empty>
0210 // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last,
0211 //                       _ForwardOutIterator __out_it,
0212 //                       _Tp const& __old_value,
0213 //                       _Tp const& __new_value) const noexcept;
0214 
0215 template <class _Backend, class _ExecutionPolicy>
0216 struct __move;
0217 // template <class _Policy, class _ForwardIterator, class _ForwardOutIterator>
0218 // optional<_ForwardOutIterator>
0219 // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last,
0220 //                       _ForwardOutIterator __out_it) const noexcept;
0221 
0222 template <class _Backend, class _ExecutionPolicy>
0223 struct __copy;
0224 // template <class _Policy, class _ForwardIterator, class _ForwardOutIterator>
0225 // optional<_ForwardOutIterator>
0226 // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last,
0227 //                       _ForwardOutIterator __out_it) const noexcept;
0228 
0229 template <class _Backend, class _ExecutionPolicy>
0230 struct __copy_n;
0231 // template <class _Policy, class _ForwardIterator, class _Size, class _ForwardOutIterator>
0232 // optional<_ForwardOutIterator>
0233 // operator()(_Policy&&, _ForwardIterator __first, _Size __n, _ForwardOutIterator __out_it) const noexcept;
0234 
0235 template <class _Backend, class _ExecutionPolicy>
0236 struct __rotate_copy;
0237 // template <class _Policy, class _ForwardIterator, class _ForwardOutIterator>
0238 // optional<_ForwardOutIterator>
0239 // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last,
0240 //                       _ForwardOutIterator __out_it) const noexcept;
0241 
0242 template <class _Backend, class _ExecutionPolicy>
0243 struct __transform_reduce;
0244 // template <class _Policy, class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation>
0245 // optional<_Tp>
0246 // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last,
0247 //                       _Tp __init,
0248 //                       _BinaryOperation __reduce,
0249 //                       _UnaryOperation __transform) const noexcept;
0250 
0251 template <class _Backend, class _ExecutionPolicy>
0252 struct __transform_reduce_binary;
0253 // template <class _Policy, class _ForwardIterator1, class _ForwardIterator2,
0254 //           class _Tp, class _BinaryOperation1, class _BinaryOperation2>
0255 // optional<_Tp> operator()(_Policy&&, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
0256 //                                     _ForwardIterator2 __first2,
0257 //                                     _Tp __init,
0258 //                                     _BinaryOperation1 __reduce,
0259 //                                     _BinaryOperation2 __transform) const noexcept;
0260 
0261 template <class _Backend, class _ExecutionPolicy>
0262 struct __count_if;
0263 // template <class _Policy, class _ForwardIterator, class _Predicate>
0264 // optional<__iter_diff_t<_ForwardIterator>>
0265 // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) const noexcept;
0266 
0267 template <class _Backend, class _ExecutionPolicy>
0268 struct __count;
0269 // template <class _Policy, class _ForwardIterator, class _Tp>
0270 // optional<__iter_diff_t<_ForwardIterator>>
0271 // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Tp const& __value) const noexcept;
0272 
0273 template <class _Backend, class _ExecutionPolicy>
0274 struct __equal_3leg;
0275 // template <class _Policy, class _ForwardIterator1, class _ForwardIterator2, class _Predicate>
0276 // optional<bool>
0277 // operator()(_Policy&&, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
0278 //                       _ForwardIterator2 __first2,
0279 //                       _Predicate __pred) const noexcept;
0280 
0281 template <class _Backend, class _ExecutionPolicy>
0282 struct __equal;
0283 // template <class _Policy, class _ForwardIterator1, class _ForwardIterator2, class _Predicate>
0284 // optional<bool>
0285 // operator()(_Policy&&, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
0286 //                       _ForwardIterator2 __first2, _ForwardIterator2 __last2,
0287 //                       _Predicate __pred) const noexcept;
0288 
0289 template <class _Backend, class _ExecutionPolicy>
0290 struct __reduce;
0291 // template <class _Policy, class _ForwardIterator, class _Tp, class _BinaryOperation>
0292 // optional<_Tp>
0293 // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last,
0294 //                       _Tp __init, _BinaryOperation __op) const noexcept;
0295 
0296 } // namespace __pstl
0297 _LIBCPP_END_NAMESPACE_STD
0298 
0299 _LIBCPP_POP_MACROS
0300 
0301 #endif // _LIBCPP___CXX03___PSTL_BACKEND_FWD_H