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