xref: /llvm-project/pstl/include/pstl/internal/numeric_fwd.h (revision 843c12d6a0cdfd64c5a92e24eb58ba9ee17ca1ee)
1 // -*- C++ -*-
2 //===----------------------------------------------------------------------===//
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_NUMERIC_FWD_H
11 #define _PSTL_NUMERIC_FWD_H
12 
13 #include <type_traits>
14 #include <utility>
15 
16 #include "pstl_config.h"
17 
18 _PSTL_HIDE_FROM_ABI_PUSH
19 
20 namespace __pstl
21 {
22 namespace __internal
23 {
24 
25 //------------------------------------------------------------------------
26 // transform_reduce (version with two binary functions, according to draft N4659)
27 //------------------------------------------------------------------------
28 
29 template <class _RandomAccessIterator1, class _RandomAccessIterator2, class _Tp, class _BinaryOperation1,
30           class _BinaryOperation2>
31 _Tp __brick_transform_reduce(_RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2, _Tp,
32                              _BinaryOperation1, _BinaryOperation2,
33                              /*__is_vector=*/std::true_type) noexcept;
34 
35 template <class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation1, class _BinaryOperation2>
36 _Tp __brick_transform_reduce(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _Tp, _BinaryOperation1,
37                              _BinaryOperation2,
38                              /*__is_vector=*/std::false_type) noexcept;
39 
40 template <class _Tag, class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp,
41           class _BinaryOperation1, class _BinaryOperation2>
42 _Tp
43 __pattern_transform_reduce(_Tag, _ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _Tp,
44                            _BinaryOperation1, _BinaryOperation2) noexcept;
45 
46 template <class _IsVector, class _ExecutionPolicy, class _RandomAccessIterator1, class _RandomAccessIterator2,
47           class _Tp, class _BinaryOperation1, class _BinaryOperation2>
48 _Tp
49 __pattern_transform_reduce(__parallel_tag<_IsVector>, _ExecutionPolicy&&, _RandomAccessIterator1,
50                            _RandomAccessIterator1, _RandomAccessIterator2, _Tp, _BinaryOperation1, _BinaryOperation2);
51 
52 //------------------------------------------------------------------------
53 // transform_reduce (version with unary and binary functions)
54 //------------------------------------------------------------------------
55 
56 template <class _RandomAccessIterator, class _Tp, class _UnaryOperation, class _BinaryOperation>
57 _Tp __brick_transform_reduce(_RandomAccessIterator, _RandomAccessIterator, _Tp, _BinaryOperation, _UnaryOperation,
58                              /*is_vector=*/std::true_type) noexcept;
59 
60 template <class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation>
61 _Tp __brick_transform_reduce(_ForwardIterator, _ForwardIterator, _Tp, _BinaryOperation, _UnaryOperation,
62                              /*is_vector=*/std::false_type) noexcept;
63 
64 template <class _Tag, class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _BinaryOperation,
65           class _UnaryOperation>
66 _Tp
67 __pattern_transform_reduce(_Tag, _ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Tp, _BinaryOperation,
68                            _UnaryOperation) noexcept;
69 
70 template <class _IsVector, class _ExecutionPolicy, class _RandomAccessIterator, class _Tp, class _BinaryOperation,
71           class _UnaryOperation>
72 _Tp
73 __pattern_transform_reduce(__parallel_tag<_IsVector>, _ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator,
74                            _Tp, _BinaryOperation, _UnaryOperation);
75 
76 //------------------------------------------------------------------------
77 // transform_exclusive_scan
78 //
79 // walk3 evaluates f(x,y,z) for (x,y,z) drawn from [first1,last1), [first2,...), [first3,...)
80 //------------------------------------------------------------------------
81 
82 template <class _ForwardIterator, class _OutputIterator, class _UnaryOperation, class _Tp, class _BinaryOperation>
83 std::pair<_OutputIterator, _Tp> __brick_transform_scan(_ForwardIterator, _ForwardIterator, _OutputIterator,
84                                                        _UnaryOperation, _Tp, _BinaryOperation,
85                                                        /*Inclusive*/ std::false_type) noexcept;
86 
87 template <class _RandomAccessIterator, class _OutputIterator, class _UnaryOperation, class _Tp, class _BinaryOperation>
88 std::pair<_OutputIterator, _Tp> __brick_transform_scan(_RandomAccessIterator, _RandomAccessIterator, _OutputIterator,
89                                                        _UnaryOperation, _Tp, _BinaryOperation,
90                                                        /*Inclusive*/ std::true_type) noexcept;
91 
92 template <class _Tag, class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _UnaryOperation,
93           class _Tp, class _BinaryOperation, class _Inclusive>
94 _OutputIterator
95 __pattern_transform_scan(_Tag, _ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _OutputIterator, _UnaryOperation,
96                          _Tp, _BinaryOperation, _Inclusive) noexcept;
97 
98 template <class _IsVector, class _ExecutionPolicy, class _RandomAccessIterator, class _OutputIterator,
99           class _UnaryOperation, class _Tp, class _BinaryOperation, class _Inclusive>
100 typename std::enable_if<!std::is_floating_point<_Tp>::value, _OutputIterator>::type
101 __pattern_transform_scan(__parallel_tag<_IsVector> __tag, _ExecutionPolicy&&, _RandomAccessIterator,
102                          _RandomAccessIterator, _OutputIterator, _UnaryOperation, _Tp, _BinaryOperation, _Inclusive);
103 
104 template <class _IsVector, class _ExecutionPolicy, class _RandomAccessIterator, class _OutputIterator,
105           class _UnaryOperation, class _Tp, class _BinaryOperation, class _Inclusive>
106 typename std::enable_if<std::is_floating_point<_Tp>::value, _OutputIterator>::type
107 __pattern_transform_scan(__parallel_tag<_IsVector>, _ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator,
108                          _OutputIterator, _UnaryOperation, _Tp, _BinaryOperation, _Inclusive);
109 
110 //------------------------------------------------------------------------
111 // adjacent_difference
112 //------------------------------------------------------------------------
113 
114 template <class _ForwardIterator, class _OutputIterator, class _BinaryOperation>
115 _OutputIterator __brick_adjacent_difference(_ForwardIterator, _ForwardIterator, _OutputIterator, _BinaryOperation,
116                                             /*is_vector*/ std::false_type) noexcept;
117 
118 template <class _RandomAccessIterator, class _OutputIterator, class _BinaryOperation>
119 _OutputIterator __brick_adjacent_difference(_RandomAccessIterator, _RandomAccessIterator, _OutputIterator,
120                                             _BinaryOperation,
121                                             /*is_vector*/ std::true_type) noexcept;
122 
123 template <class _Tag, class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _BinaryOperation>
124 _OutputIterator
125 __pattern_adjacent_difference(_Tag, _ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _OutputIterator,
126                               _BinaryOperation) noexcept;
127 
128 template <class _IsVector, class _ExecutionPolicy, class _RandomAccessIterator, class _OutputIterator,
129           class _BinaryOperation>
130 _OutputIterator
131 __pattern_adjacent_difference(__parallel_tag<_IsVector>, _ExecutionPolicy&&, _RandomAccessIterator,
132                               _RandomAccessIterator, _OutputIterator, _BinaryOperation);
133 
134 } // namespace __internal
135 } // namespace __pstl
136 
137 _PSTL_HIDE_FROM_ABI_POP
138 
139 #endif /* _PSTL_NUMERIC_FWD_H */
140