1*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===// 2*0fca6ea1SDimitry Andric // 3*0fca6ea1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0fca6ea1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0fca6ea1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0fca6ea1SDimitry Andric // 7*0fca6ea1SDimitry Andric //===----------------------------------------------------------------------===// 8*0fca6ea1SDimitry Andric 9*0fca6ea1SDimitry Andric #ifndef _LIBCPP___PSTL_BACKEND_FWD_H 10*0fca6ea1SDimitry Andric #define _LIBCPP___PSTL_BACKEND_FWD_H 11*0fca6ea1SDimitry Andric 12*0fca6ea1SDimitry Andric #include <__config> 13*0fca6ea1SDimitry Andric 14*0fca6ea1SDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 15*0fca6ea1SDimitry Andric # pragma GCC system_header 16*0fca6ea1SDimitry Andric #endif 17*0fca6ea1SDimitry Andric 18*0fca6ea1SDimitry Andric _LIBCPP_PUSH_MACROS 19*0fca6ea1SDimitry Andric #include <__undef_macros> 20*0fca6ea1SDimitry Andric 21*0fca6ea1SDimitry Andric // 22*0fca6ea1SDimitry Andric // This header declares available PSTL backends and the functions that must be implemented in order for the 23*0fca6ea1SDimitry Andric // PSTL algorithms to be provided. 24*0fca6ea1SDimitry Andric // 25*0fca6ea1SDimitry Andric // Backends often do not implement the full set of functions themselves -- a configuration of the PSTL is 26*0fca6ea1SDimitry Andric // usually a set of backends "stacked" together which each implement some algorithms under some execution 27*0fca6ea1SDimitry Andric // policies. It is only necessary for the "stack" of backends to implement all algorithms under all execution 28*0fca6ea1SDimitry Andric // policies, but a single backend is not required to implement everything on its own. 29*0fca6ea1SDimitry Andric // 30*0fca6ea1SDimitry Andric // The signatures used by each backend function are documented below. 31*0fca6ea1SDimitry Andric // 32*0fca6ea1SDimitry Andric // Exception handling 33*0fca6ea1SDimitry Andric // ================== 34*0fca6ea1SDimitry Andric // 35*0fca6ea1SDimitry Andric // PSTL backends are expected to report errors (i.e. failure to allocate) by returning a disengaged `optional` from 36*0fca6ea1SDimitry Andric // their implementation. Exceptions shouldn't be used to report an internal failure-to-allocate, since all exceptions 37*0fca6ea1SDimitry Andric // are turned into a program termination at the front-end level. When a backend returns a disengaged `optional` to the 38*0fca6ea1SDimitry Andric // frontend, the frontend will turn that into a call to `std::__throw_bad_alloc();` to report the internal failure to 39*0fca6ea1SDimitry Andric // the user. 40*0fca6ea1SDimitry Andric // 41*0fca6ea1SDimitry Andric 42*0fca6ea1SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD 43*0fca6ea1SDimitry Andric namespace __pstl { 44*0fca6ea1SDimitry Andric 45*0fca6ea1SDimitry Andric template <class... _Backends> 46*0fca6ea1SDimitry Andric struct __backend_configuration; 47*0fca6ea1SDimitry Andric 48*0fca6ea1SDimitry Andric struct __default_backend_tag; 49*0fca6ea1SDimitry Andric struct __libdispatch_backend_tag; 50*0fca6ea1SDimitry Andric struct __serial_backend_tag; 51*0fca6ea1SDimitry Andric struct __std_thread_backend_tag; 52*0fca6ea1SDimitry Andric 53*0fca6ea1SDimitry Andric #if defined(_LIBCPP_PSTL_BACKEND_SERIAL) 54*0fca6ea1SDimitry Andric using __current_configuration = __backend_configuration<__serial_backend_tag, __default_backend_tag>; 55*0fca6ea1SDimitry Andric #elif defined(_LIBCPP_PSTL_BACKEND_STD_THREAD) 56*0fca6ea1SDimitry Andric using __current_configuration = __backend_configuration<__std_thread_backend_tag, __default_backend_tag>; 57*0fca6ea1SDimitry Andric #elif defined(_LIBCPP_PSTL_BACKEND_LIBDISPATCH) 58*0fca6ea1SDimitry Andric using __current_configuration = __backend_configuration<__libdispatch_backend_tag, __default_backend_tag>; 59*0fca6ea1SDimitry Andric #else 60*0fca6ea1SDimitry Andric 61*0fca6ea1SDimitry Andric // ...New vendors can add parallel backends here... 62*0fca6ea1SDimitry Andric 63*0fca6ea1SDimitry Andric # error "Invalid PSTL backend configuration" 64*0fca6ea1SDimitry Andric #endif 65*0fca6ea1SDimitry Andric 66*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 67*0fca6ea1SDimitry Andric struct __find_if; 68*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _Predicate> 69*0fca6ea1SDimitry Andric // optional<_ForwardIterator> 70*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) const noexcept; 71*0fca6ea1SDimitry Andric 72*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 73*0fca6ea1SDimitry Andric struct __find_if_not; 74*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _Predicate> 75*0fca6ea1SDimitry Andric // optional<_ForwardIterator> 76*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) const noexcept; 77*0fca6ea1SDimitry Andric 78*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 79*0fca6ea1SDimitry Andric struct __find; 80*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _Tp> 81*0fca6ea1SDimitry Andric // optional<_ForwardIterator> 82*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) const noexcept; 83*0fca6ea1SDimitry Andric 84*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 85*0fca6ea1SDimitry Andric struct __any_of; 86*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _Predicate> 87*0fca6ea1SDimitry Andric // optional<bool> 88*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) const noexcept; 89*0fca6ea1SDimitry Andric 90*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 91*0fca6ea1SDimitry Andric struct __all_of; 92*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _Predicate> 93*0fca6ea1SDimitry Andric // optional<bool> 94*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) const noexcept; 95*0fca6ea1SDimitry Andric 96*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 97*0fca6ea1SDimitry Andric struct __none_of; 98*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _Predicate> 99*0fca6ea1SDimitry Andric // optional<bool> 100*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) const noexcept; 101*0fca6ea1SDimitry Andric 102*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 103*0fca6ea1SDimitry Andric struct __is_partitioned; 104*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _Predicate> 105*0fca6ea1SDimitry Andric // optional<bool> 106*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) const noexcept; 107*0fca6ea1SDimitry Andric 108*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 109*0fca6ea1SDimitry Andric struct __for_each; 110*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _Function> 111*0fca6ea1SDimitry Andric // optional<__empty> 112*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Function __func) const noexcept; 113*0fca6ea1SDimitry Andric 114*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 115*0fca6ea1SDimitry Andric struct __for_each_n; 116*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _Size, class _Function> 117*0fca6ea1SDimitry Andric // optional<__empty> 118*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _Size __size, _Function __func) const noexcept; 119*0fca6ea1SDimitry Andric 120*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 121*0fca6ea1SDimitry Andric struct __fill; 122*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _Tp> 123*0fca6ea1SDimitry Andric // optional<__empty> 124*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Tp const& __value) const noexcept; 125*0fca6ea1SDimitry Andric 126*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 127*0fca6ea1SDimitry Andric struct __fill_n; 128*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _Size, class _Tp> 129*0fca6ea1SDimitry Andric // optional<__empty> 130*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _Size __n, _Tp const& __value) const noexcept; 131*0fca6ea1SDimitry Andric 132*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 133*0fca6ea1SDimitry Andric struct __replace; 134*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _Tp> 135*0fca6ea1SDimitry Andric // optional<__empty> 136*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, 137*0fca6ea1SDimitry Andric // _Tp const& __old, _Tp const& __new) const noexcept; 138*0fca6ea1SDimitry Andric 139*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 140*0fca6ea1SDimitry Andric struct __replace_if; 141*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _Predicate, class _Tp> 142*0fca6ea1SDimitry Andric // optional<__empty> 143*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, 144*0fca6ea1SDimitry Andric // _Predicate __pred, _Tp const& __new_value) const noexcept; 145*0fca6ea1SDimitry Andric 146*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 147*0fca6ea1SDimitry Andric struct __generate; 148*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _Generator> 149*0fca6ea1SDimitry Andric // optional<__empty> 150*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Generator __gen) const noexcept; 151*0fca6ea1SDimitry Andric 152*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 153*0fca6ea1SDimitry Andric struct __generate_n; 154*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _Size, class _Generator> 155*0fca6ea1SDimitry Andric // optional<__empty> 156*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _Size __n, _Generator __gen) const noexcept; 157*0fca6ea1SDimitry Andric 158*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 159*0fca6ea1SDimitry Andric struct __merge; 160*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator1, class _ForwardIterator2, class _ForwardOutIterator, class _Comp> 161*0fca6ea1SDimitry Andric // optional<_ForwardOutIterator> 162*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator1 __first1, _ForwardIterator1 __last1, 163*0fca6ea1SDimitry Andric // _ForwardIterator2 __first2, _ForwardIterator2 __last2, 164*0fca6ea1SDimitry Andric // _ForwardOutIterator __result, _Comp __comp) const noexcept; 165*0fca6ea1SDimitry Andric 166*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 167*0fca6ea1SDimitry Andric struct __stable_sort; 168*0fca6ea1SDimitry Andric // template <class _Policy, class _RandomAccessIterator, class _Comp> 169*0fca6ea1SDimitry Andric // optional<__empty> 170*0fca6ea1SDimitry Andric // operator()(_Policy&&, _RandomAccessIterator __first, _RandomAccessIterator __last, _Comp __comp) const noexcept; 171*0fca6ea1SDimitry Andric 172*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 173*0fca6ea1SDimitry Andric struct __sort; 174*0fca6ea1SDimitry Andric // template <class _Policy, class _RandomAccessIterator, class _Comp> 175*0fca6ea1SDimitry Andric // optional<__empty> 176*0fca6ea1SDimitry Andric // operator()(_Policy&&, _RandomAccessIterator __first, _RandomAccessIterator __last, _Comp __comp) const noexcept; 177*0fca6ea1SDimitry Andric 178*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 179*0fca6ea1SDimitry Andric struct __transform; 180*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _ForwardOutIterator, class _UnaryOperation> 181*0fca6ea1SDimitry Andric // optional<_ForwardOutIterator> 182*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, 183*0fca6ea1SDimitry Andric // _ForwardOutIterator __result, 184*0fca6ea1SDimitry Andric // _UnaryOperation __op) const noexcept; 185*0fca6ea1SDimitry Andric 186*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 187*0fca6ea1SDimitry Andric struct __transform_binary; 188*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator1, class _ForwardIterator2, 189*0fca6ea1SDimitry Andric // class _ForwardOutIterator, 190*0fca6ea1SDimitry Andric // class _BinaryOperation> 191*0fca6ea1SDimitry Andric // optional<_ForwardOutIterator> 192*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator1 __first1, _ForwardIterator1 __last1, 193*0fca6ea1SDimitry Andric // _ForwardIterator2 __first2, 194*0fca6ea1SDimitry Andric // _ForwardOutIterator __result, 195*0fca6ea1SDimitry Andric // _BinaryOperation __op) const noexcept; 196*0fca6ea1SDimitry Andric 197*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 198*0fca6ea1SDimitry Andric struct __replace_copy_if; 199*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _ForwardOutIterator, class _Predicate, class _Tp> 200*0fca6ea1SDimitry Andric // optional<__empty> 201*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, 202*0fca6ea1SDimitry Andric // _ForwardOutIterator __out_it, 203*0fca6ea1SDimitry Andric // _Predicate __pred, 204*0fca6ea1SDimitry Andric // _Tp const& __new_value) const noexcept; 205*0fca6ea1SDimitry Andric 206*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 207*0fca6ea1SDimitry Andric struct __replace_copy; 208*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _ForwardOutIterator, class _Tp> 209*0fca6ea1SDimitry Andric // optional<__empty> 210*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, 211*0fca6ea1SDimitry Andric // _ForwardOutIterator __out_it, 212*0fca6ea1SDimitry Andric // _Tp const& __old_value, 213*0fca6ea1SDimitry Andric // _Tp const& __new_value) const noexcept; 214*0fca6ea1SDimitry Andric 215*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 216*0fca6ea1SDimitry Andric struct __move; 217*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _ForwardOutIterator> 218*0fca6ea1SDimitry Andric // optional<_ForwardOutIterator> 219*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, 220*0fca6ea1SDimitry Andric // _ForwardOutIterator __out_it) const noexcept; 221*0fca6ea1SDimitry Andric 222*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 223*0fca6ea1SDimitry Andric struct __copy; 224*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _ForwardOutIterator> 225*0fca6ea1SDimitry Andric // optional<_ForwardOutIterator> 226*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, 227*0fca6ea1SDimitry Andric // _ForwardOutIterator __out_it) const noexcept; 228*0fca6ea1SDimitry Andric 229*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 230*0fca6ea1SDimitry Andric struct __copy_n; 231*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _Size, class _ForwardOutIterator> 232*0fca6ea1SDimitry Andric // optional<_ForwardOutIterator> 233*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _Size __n, _ForwardOutIterator __out_it) const noexcept; 234*0fca6ea1SDimitry Andric 235*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 236*0fca6ea1SDimitry Andric struct __rotate_copy; 237*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _ForwardOutIterator> 238*0fca6ea1SDimitry Andric // optional<_ForwardOutIterator> 239*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, 240*0fca6ea1SDimitry Andric // _ForwardOutIterator __out_it) const noexcept; 241*0fca6ea1SDimitry Andric 242*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 243*0fca6ea1SDimitry Andric struct __transform_reduce; 244*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation> 245*0fca6ea1SDimitry Andric // optional<_Tp> 246*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, 247*0fca6ea1SDimitry Andric // _Tp __init, 248*0fca6ea1SDimitry Andric // _BinaryOperation __reduce, 249*0fca6ea1SDimitry Andric // _UnaryOperation __transform) const noexcept; 250*0fca6ea1SDimitry Andric 251*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 252*0fca6ea1SDimitry Andric struct __transform_reduce_binary; 253*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator1, class _ForwardIterator2, 254*0fca6ea1SDimitry Andric // class _Tp, class _BinaryOperation1, class _BinaryOperation2> 255*0fca6ea1SDimitry Andric // optional<_Tp> operator()(_Policy&&, _ForwardIterator1 __first1, _ForwardIterator1 __last1, 256*0fca6ea1SDimitry Andric // _ForwardIterator2 __first2, 257*0fca6ea1SDimitry Andric // _Tp __init, 258*0fca6ea1SDimitry Andric // _BinaryOperation1 __reduce, 259*0fca6ea1SDimitry Andric // _BinaryOperation2 __transform) const noexcept; 260*0fca6ea1SDimitry Andric 261*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 262*0fca6ea1SDimitry Andric struct __count_if; 263*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _Predicate> 264*0fca6ea1SDimitry Andric // optional<__iter_diff_t<_ForwardIterator>> 265*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) const noexcept; 266*0fca6ea1SDimitry Andric 267*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 268*0fca6ea1SDimitry Andric struct __count; 269*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _Tp> 270*0fca6ea1SDimitry Andric // optional<__iter_diff_t<_ForwardIterator>> 271*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, _Tp const& __value) const noexcept; 272*0fca6ea1SDimitry Andric 273*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 274*0fca6ea1SDimitry Andric struct __equal_3leg; 275*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator1, class _ForwardIterator2, class _Predicate> 276*0fca6ea1SDimitry Andric // optional<bool> 277*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator1 __first1, _ForwardIterator1 __last1, 278*0fca6ea1SDimitry Andric // _ForwardIterator2 __first2, 279*0fca6ea1SDimitry Andric // _Predicate __pred) const noexcept; 280*0fca6ea1SDimitry Andric 281*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 282*0fca6ea1SDimitry Andric struct __equal; 283*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator1, class _ForwardIterator2, class _Predicate> 284*0fca6ea1SDimitry Andric // optional<bool> 285*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator1 __first1, _ForwardIterator1 __last1, 286*0fca6ea1SDimitry Andric // _ForwardIterator2 __first2, _ForwardIterator2 __last2, 287*0fca6ea1SDimitry Andric // _Predicate __pred) const noexcept; 288*0fca6ea1SDimitry Andric 289*0fca6ea1SDimitry Andric template <class _Backend, class _ExecutionPolicy> 290*0fca6ea1SDimitry Andric struct __reduce; 291*0fca6ea1SDimitry Andric // template <class _Policy, class _ForwardIterator, class _Tp, class _BinaryOperation> 292*0fca6ea1SDimitry Andric // optional<_Tp> 293*0fca6ea1SDimitry Andric // operator()(_Policy&&, _ForwardIterator __first, _ForwardIterator __last, 294*0fca6ea1SDimitry Andric // _Tp __init, _BinaryOperation __op) const noexcept; 295*0fca6ea1SDimitry Andric 296*0fca6ea1SDimitry Andric } // namespace __pstl 297*0fca6ea1SDimitry Andric _LIBCPP_END_NAMESPACE_STD 298*0fca6ea1SDimitry Andric 299*0fca6ea1SDimitry Andric _LIBCPP_POP_MACROS 300*0fca6ea1SDimitry Andric 301*0fca6ea1SDimitry Andric #endif // _LIBCPP___PSTL_BACKEND_FWD_H 302