|
|
|||
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
| [ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
|
This page was automatically generated by the 2.3.7 LXR engine. The LXR team |
|