1// -*- C++ -*-
2//===-- glue_numeric_defs.h -----------------------------------------------===//
3//
4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef _PSTL_GLUE_NUMERIC_DEFS_H
11#define _PSTL_GLUE_NUMERIC_DEFS_H
12
13#include "execution_defs.h"
14
15namespace std
16{
17// [reduce]
18
19template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _BinaryOperation>
20__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
21reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Tp __init,
22       _BinaryOperation __binary_op);
23
24template <class _ExecutionPolicy, class _ForwardIterator, class _Tp>
25__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
26reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Tp __init);
27
28template <class _ExecutionPolicy, class _ForwardIterator>
29__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy,
30                                                 typename iterator_traits<_ForwardIterator>::value_type>
31reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last);
32
33template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp>
34__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
35transform_reduce(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
36                 _ForwardIterator2 __first2, _Tp __init);
37
38template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation1,
39          class _BinaryOperation2>
40__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
41transform_reduce(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
42                 _ForwardIterator2 __first2, _Tp __init, _BinaryOperation1 __binary_op1,
43                 _BinaryOperation2 __binary_op2);
44
45template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation>
46__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
47transform_reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Tp __init,
48                 _BinaryOperation __binary_op, _UnaryOperation __unary_op);
49
50// [exclusive.scan]
51
52template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp>
53__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
54exclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
55               _ForwardIterator2 __result, _Tp __init);
56
57template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation>
58__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
59exclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
60               _ForwardIterator2 __result, _Tp __init, _BinaryOperation __binary_op);
61
62// [inclusive.scan]
63
64template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
65__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
66inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
67               _ForwardIterator2 __result);
68
69template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryOperation>
70__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
71inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
72               _ForwardIterator2 __result, _BinaryOperation __binary_op);
73
74template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation>
75__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
76inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
77               _ForwardIterator2 __result, _BinaryOperation __binary_op, _Tp __init);
78
79// [transform.exclusive.scan]
80
81template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation,
82          class _UnaryOperation>
83__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
84transform_exclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
85                         _ForwardIterator2 __result, _Tp __init, _BinaryOperation __binary_op,
86                         _UnaryOperation __unary_op);
87
88// [transform.inclusive.scan]
89
90template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryOperation,
91          class _UnaryOperation, class _Tp>
92__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
93transform_inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
94                         _ForwardIterator2 __result, _BinaryOperation __binary_op, _UnaryOperation __unary_op,
95                         _Tp __init);
96
97template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _UnaryOperation,
98          class _BinaryOperation>
99__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
100transform_inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
101                         _ForwardIterator2 __result, _BinaryOperation __binary_op, _UnaryOperation __unary_op);
102
103// [adjacent.difference]
104
105template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryOperation>
106__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
107adjacent_difference(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
108                    _ForwardIterator2 __d_first, _BinaryOperation op);
109
110template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
111__pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
112adjacent_difference(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
113                    _ForwardIterator2 __d_first);
114
115} // namespace std
116#endif /* _PSTL_GLUE_NUMERIC_DEFS_H */
117