1627f7eb2Smrg // -*- C++ -*-
2627f7eb2Smrg //===-- glue_numeric_impl.h -----------------------------------------------===//
3627f7eb2Smrg //
4627f7eb2Smrg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5627f7eb2Smrg // See https://llvm.org/LICENSE.txt for license information.
6627f7eb2Smrg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7627f7eb2Smrg //
8627f7eb2Smrg //===----------------------------------------------------------------------===//
9627f7eb2Smrg
10*4c3eb207Smrg #ifndef _PSTL_GLUE_NUMERIC_IMPL_H
11*4c3eb207Smrg #define _PSTL_GLUE_NUMERIC_IMPL_H
12627f7eb2Smrg
13627f7eb2Smrg #include <functional>
14627f7eb2Smrg
15627f7eb2Smrg #include "utils.h"
16627f7eb2Smrg #include "numeric_fwd.h"
17627f7eb2Smrg
18627f7eb2Smrg namespace std
19627f7eb2Smrg {
20627f7eb2Smrg
21627f7eb2Smrg // [reduce]
22627f7eb2Smrg
23627f7eb2Smrg template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _BinaryOperation>
24627f7eb2Smrg __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
reduce(_ExecutionPolicy && __exec,_ForwardIterator __first,_ForwardIterator __last,_Tp __init,_BinaryOperation __binary_op)25627f7eb2Smrg reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Tp __init,
26627f7eb2Smrg _BinaryOperation __binary_op)
27627f7eb2Smrg {
28627f7eb2Smrg return transform_reduce(std::forward<_ExecutionPolicy>(__exec), __first, __last, __init, __binary_op,
29627f7eb2Smrg __pstl::__internal::__no_op());
30627f7eb2Smrg }
31627f7eb2Smrg
32627f7eb2Smrg template <class _ExecutionPolicy, class _ForwardIterator, class _Tp>
33627f7eb2Smrg __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
reduce(_ExecutionPolicy && __exec,_ForwardIterator __first,_ForwardIterator __last,_Tp __init)34627f7eb2Smrg reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Tp __init)
35627f7eb2Smrg {
36627f7eb2Smrg return transform_reduce(std::forward<_ExecutionPolicy>(__exec), __first, __last, __init, std::plus<_Tp>(),
37627f7eb2Smrg __pstl::__internal::__no_op());
38627f7eb2Smrg }
39627f7eb2Smrg
40627f7eb2Smrg template <class _ExecutionPolicy, class _ForwardIterator>
41627f7eb2Smrg __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy,
42627f7eb2Smrg typename iterator_traits<_ForwardIterator>::value_type>
reduce(_ExecutionPolicy && __exec,_ForwardIterator __first,_ForwardIterator __last)43627f7eb2Smrg reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last)
44627f7eb2Smrg {
45627f7eb2Smrg typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
46627f7eb2Smrg return transform_reduce(std::forward<_ExecutionPolicy>(__exec), __first, __last, _ValueType{},
47627f7eb2Smrg std::plus<_ValueType>(), __pstl::__internal::__no_op());
48627f7eb2Smrg }
49627f7eb2Smrg
50627f7eb2Smrg // [transform.reduce]
51627f7eb2Smrg
52627f7eb2Smrg template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp>
53627f7eb2Smrg __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
transform_reduce(_ExecutionPolicy && __exec,_ForwardIterator1 __first1,_ForwardIterator1 __last1,_ForwardIterator2 __first2,_Tp __init)54627f7eb2Smrg transform_reduce(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
55627f7eb2Smrg _ForwardIterator2 __first2, _Tp __init)
56627f7eb2Smrg {
57627f7eb2Smrg typedef typename iterator_traits<_ForwardIterator1>::value_type _InputType;
58627f7eb2Smrg using namespace __pstl;
59627f7eb2Smrg return __internal::__pattern_transform_reduce(
60627f7eb2Smrg std::forward<_ExecutionPolicy>(__exec), __first1, __last1, __first2, __init, std::plus<_InputType>(),
61627f7eb2Smrg std::multiplies<_InputType>(),
62627f7eb2Smrg __internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec),
63627f7eb2Smrg __internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec));
64627f7eb2Smrg }
65627f7eb2Smrg
66627f7eb2Smrg template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation1,
67627f7eb2Smrg class _BinaryOperation2>
68627f7eb2Smrg __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
transform_reduce(_ExecutionPolicy && __exec,_ForwardIterator1 __first1,_ForwardIterator1 __last1,_ForwardIterator2 __first2,_Tp __init,_BinaryOperation1 __binary_op1,_BinaryOperation2 __binary_op2)69627f7eb2Smrg transform_reduce(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
70627f7eb2Smrg _ForwardIterator2 __first2, _Tp __init, _BinaryOperation1 __binary_op1, _BinaryOperation2 __binary_op2)
71627f7eb2Smrg {
72627f7eb2Smrg using namespace __pstl;
73627f7eb2Smrg return __internal::__pattern_transform_reduce(
74627f7eb2Smrg std::forward<_ExecutionPolicy>(__exec), __first1, __last1, __first2, __init, __binary_op1, __binary_op2,
75627f7eb2Smrg __internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec),
76627f7eb2Smrg __internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec));
77627f7eb2Smrg }
78627f7eb2Smrg
79627f7eb2Smrg template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation>
80627f7eb2Smrg __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
transform_reduce(_ExecutionPolicy && __exec,_ForwardIterator __first,_ForwardIterator __last,_Tp __init,_BinaryOperation __binary_op,_UnaryOperation __unary_op)81627f7eb2Smrg transform_reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Tp __init,
82627f7eb2Smrg _BinaryOperation __binary_op, _UnaryOperation __unary_op)
83627f7eb2Smrg {
84627f7eb2Smrg using namespace __pstl;
85627f7eb2Smrg return __internal::__pattern_transform_reduce(
86627f7eb2Smrg std::forward<_ExecutionPolicy>(__exec), __first, __last, __init, __binary_op, __unary_op,
87627f7eb2Smrg __internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
88627f7eb2Smrg __internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec));
89627f7eb2Smrg }
90627f7eb2Smrg
91627f7eb2Smrg // [exclusive.scan]
92627f7eb2Smrg
93627f7eb2Smrg template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp>
94627f7eb2Smrg __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
exclusive_scan(_ExecutionPolicy && __exec,_ForwardIterator1 __first,_ForwardIterator1 __last,_ForwardIterator2 __result,_Tp __init)95627f7eb2Smrg exclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
96627f7eb2Smrg _ForwardIterator2 __result, _Tp __init)
97627f7eb2Smrg {
98627f7eb2Smrg return transform_exclusive_scan(std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __init,
99627f7eb2Smrg std::plus<_Tp>(), __pstl::__internal::__no_op());
100627f7eb2Smrg }
101627f7eb2Smrg
102627f7eb2Smrg template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation>
103627f7eb2Smrg __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
exclusive_scan(_ExecutionPolicy && __exec,_ForwardIterator1 __first,_ForwardIterator1 __last,_ForwardIterator2 __result,_Tp __init,_BinaryOperation __binary_op)104627f7eb2Smrg exclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
105627f7eb2Smrg _ForwardIterator2 __result, _Tp __init, _BinaryOperation __binary_op)
106627f7eb2Smrg {
107627f7eb2Smrg return transform_exclusive_scan(std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __init,
108627f7eb2Smrg __binary_op, __pstl::__internal::__no_op());
109627f7eb2Smrg }
110627f7eb2Smrg
111627f7eb2Smrg // [inclusive.scan]
112627f7eb2Smrg
113627f7eb2Smrg template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
114627f7eb2Smrg __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
inclusive_scan(_ExecutionPolicy && __exec,_ForwardIterator1 __first,_ForwardIterator1 __last,_ForwardIterator2 __result)115627f7eb2Smrg inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
116627f7eb2Smrg _ForwardIterator2 __result)
117627f7eb2Smrg {
118627f7eb2Smrg typedef typename iterator_traits<_ForwardIterator1>::value_type _InputType;
119627f7eb2Smrg return transform_inclusive_scan(std::forward<_ExecutionPolicy>(__exec), __first, __last, __result,
120627f7eb2Smrg std::plus<_InputType>(), __pstl::__internal::__no_op());
121627f7eb2Smrg }
122627f7eb2Smrg
123627f7eb2Smrg template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryOperation>
124627f7eb2Smrg __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
inclusive_scan(_ExecutionPolicy && __exec,_ForwardIterator1 __first,_ForwardIterator1 __last,_ForwardIterator2 __result,_BinaryOperation __binary_op)125627f7eb2Smrg inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
126627f7eb2Smrg _ForwardIterator2 __result, _BinaryOperation __binary_op)
127627f7eb2Smrg {
128627f7eb2Smrg return transform_inclusive_scan(std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __binary_op,
129627f7eb2Smrg __pstl::__internal::__no_op());
130627f7eb2Smrg }
131627f7eb2Smrg
132627f7eb2Smrg template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation>
133627f7eb2Smrg __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
inclusive_scan(_ExecutionPolicy && __exec,_ForwardIterator1 __first,_ForwardIterator1 __last,_ForwardIterator2 __result,_BinaryOperation __binary_op,_Tp __init)134627f7eb2Smrg inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
135627f7eb2Smrg _ForwardIterator2 __result, _BinaryOperation __binary_op, _Tp __init)
136627f7eb2Smrg {
137627f7eb2Smrg return transform_inclusive_scan(std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __binary_op,
138627f7eb2Smrg __pstl::__internal::__no_op(), __init);
139627f7eb2Smrg }
140627f7eb2Smrg
141627f7eb2Smrg // [transform.exclusive.scan]
142627f7eb2Smrg
143627f7eb2Smrg template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation,
144627f7eb2Smrg class _UnaryOperation>
145627f7eb2Smrg __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
transform_exclusive_scan(_ExecutionPolicy && __exec,_ForwardIterator1 __first,_ForwardIterator1 __last,_ForwardIterator2 __result,_Tp __init,_BinaryOperation __binary_op,_UnaryOperation __unary_op)146627f7eb2Smrg transform_exclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
147627f7eb2Smrg _ForwardIterator2 __result, _Tp __init, _BinaryOperation __binary_op,
148627f7eb2Smrg _UnaryOperation __unary_op)
149627f7eb2Smrg {
150627f7eb2Smrg using namespace __pstl;
151627f7eb2Smrg return __internal::__pattern_transform_scan(
152627f7eb2Smrg std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __unary_op, __init, __binary_op,
153627f7eb2Smrg /*inclusive=*/std::false_type(),
154627f7eb2Smrg __internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec),
155627f7eb2Smrg __internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec));
156627f7eb2Smrg }
157627f7eb2Smrg
158627f7eb2Smrg // [transform.inclusive.scan]
159627f7eb2Smrg
160627f7eb2Smrg template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryOperation,
161627f7eb2Smrg class _UnaryOperation, class _Tp>
162627f7eb2Smrg __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
transform_inclusive_scan(_ExecutionPolicy && __exec,_ForwardIterator1 __first,_ForwardIterator1 __last,_ForwardIterator2 __result,_BinaryOperation __binary_op,_UnaryOperation __unary_op,_Tp __init)163627f7eb2Smrg transform_inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
164627f7eb2Smrg _ForwardIterator2 __result, _BinaryOperation __binary_op, _UnaryOperation __unary_op,
165627f7eb2Smrg _Tp __init)
166627f7eb2Smrg {
167627f7eb2Smrg using namespace __pstl;
168627f7eb2Smrg return __internal::__pattern_transform_scan(
169627f7eb2Smrg std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __unary_op, __init, __binary_op,
170627f7eb2Smrg /*inclusive=*/std::true_type(),
171627f7eb2Smrg __internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec),
172627f7eb2Smrg __internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec));
173627f7eb2Smrg }
174627f7eb2Smrg
175627f7eb2Smrg template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _UnaryOperation,
176627f7eb2Smrg class _BinaryOperation>
177627f7eb2Smrg __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
transform_inclusive_scan(_ExecutionPolicy && __exec,_ForwardIterator1 __first,_ForwardIterator1 __last,_ForwardIterator2 __result,_BinaryOperation __binary_op,_UnaryOperation __unary_op)178627f7eb2Smrg transform_inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
179627f7eb2Smrg _ForwardIterator2 __result, _BinaryOperation __binary_op, _UnaryOperation __unary_op)
180627f7eb2Smrg {
181627f7eb2Smrg if (__first != __last)
182627f7eb2Smrg {
183627f7eb2Smrg auto __tmp = __unary_op(*__first);
184627f7eb2Smrg *__result = __tmp;
185627f7eb2Smrg return transform_inclusive_scan(std::forward<_ExecutionPolicy>(__exec), ++__first, __last, ++__result,
186627f7eb2Smrg __binary_op, __unary_op, __tmp);
187627f7eb2Smrg }
188627f7eb2Smrg else
189627f7eb2Smrg {
190627f7eb2Smrg return __result;
191627f7eb2Smrg }
192627f7eb2Smrg }
193627f7eb2Smrg
194627f7eb2Smrg // [adjacent.difference]
195627f7eb2Smrg
196627f7eb2Smrg template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryOperation>
197627f7eb2Smrg __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
adjacent_difference(_ExecutionPolicy && __exec,_ForwardIterator1 __first,_ForwardIterator1 __last,_ForwardIterator2 __d_first,_BinaryOperation __op)198627f7eb2Smrg adjacent_difference(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
199627f7eb2Smrg _ForwardIterator2 __d_first, _BinaryOperation __op)
200627f7eb2Smrg {
201627f7eb2Smrg
202627f7eb2Smrg if (__first == __last)
203627f7eb2Smrg return __d_first;
204627f7eb2Smrg
205627f7eb2Smrg using namespace __pstl;
206627f7eb2Smrg return __internal::__pattern_adjacent_difference(
207627f7eb2Smrg std::forward<_ExecutionPolicy>(__exec), __first, __last, __d_first, __op,
208627f7eb2Smrg __internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec),
209627f7eb2Smrg __internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec));
210627f7eb2Smrg }
211627f7eb2Smrg
212627f7eb2Smrg template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
213627f7eb2Smrg __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
adjacent_difference(_ExecutionPolicy && __exec,_ForwardIterator1 __first,_ForwardIterator1 __last,_ForwardIterator2 __d_first)214627f7eb2Smrg adjacent_difference(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
215627f7eb2Smrg _ForwardIterator2 __d_first)
216627f7eb2Smrg {
217627f7eb2Smrg typedef typename iterator_traits<_ForwardIterator1>::value_type _ValueType;
218627f7eb2Smrg return adjacent_difference(std::forward<_ExecutionPolicy>(__exec), __first, __last, __d_first,
219627f7eb2Smrg std::minus<_ValueType>());
220627f7eb2Smrg }
221627f7eb2Smrg
222627f7eb2Smrg } // namespace std
223627f7eb2Smrg
224*4c3eb207Smrg #endif /* _PSTL_GLUE_NUMERIC_IMPL_H_ */
225