xref: /freebsd-src/contrib/llvm-project/libcxx/include/__pstl/backend_fwd.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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