xref: /netbsd-src/external/gpl3/gcc.old/dist/libstdc++-v3/include/pstl/numeric_fwd.h (revision 82d56013d7b633d116a93943de88e08335357a7c)
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 #if __PSTL_USE_PAR_POLICIES
43 template <class _ExecutionPolicy, class _RandomAccessIterator1, class _RandomAccessIterator2, class _Tp,
44           class _BinaryOperation1, class _BinaryOperation2, class _IsVector>
45 _Tp
46 __pattern_transform_reduce(_ExecutionPolicy&&, _RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2,
47                            _Tp, _BinaryOperation1, _BinaryOperation2, _IsVector __is_vector,
48                            /*is_parallel=*/std::true_type);
49 #endif
50 
51 //------------------------------------------------------------------------
52 // transform_reduce (version with unary and binary functions)
53 //------------------------------------------------------------------------
54 
55 template <class _ForwardIterator, class _Tp, class _UnaryOperation, class _BinaryOperation>
56 _Tp __brick_transform_reduce(_ForwardIterator, _ForwardIterator, _Tp, _BinaryOperation, _UnaryOperation,
57                              /*is_vector=*/std::true_type) noexcept;
58 
59 template <class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation>
60 _Tp __brick_transform_reduce(_ForwardIterator, _ForwardIterator, _Tp, _BinaryOperation, _UnaryOperation,
61                              /*is_vector=*/std::false_type) noexcept;
62 
63 template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation,
64           class _IsVector>
65 _Tp
66 __pattern_transform_reduce(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Tp, _BinaryOperation,
67                            _UnaryOperation, _IsVector,
68                            /*is_parallel=*/std::false_type) noexcept;
69 
70 #if __PSTL_USE_PAR_POLICIES
71 template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation,
72           class _IsVector>
73 _Tp
74 __pattern_transform_reduce(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Tp, _BinaryOperation,
75                            _UnaryOperation, _IsVector,
76                            /*is_parallel=*/std::true_type);
77 #endif
78 
79 //------------------------------------------------------------------------
80 // transform_exclusive_scan
81 //
82 // walk3 evaluates f(x,y,z) for (x,y,z) drawn from [first1,last1), [first2,...), [first3,...)
83 //------------------------------------------------------------------------
84 
85 template <class _ForwardIterator, class _OutputIterator, class _UnaryOperation, class _Tp, class _BinaryOperation>
86 std::pair<_OutputIterator, _Tp> __brick_transform_scan(_ForwardIterator, _ForwardIterator, _OutputIterator,
87                                                        _UnaryOperation, _Tp, _BinaryOperation,
88                                                        /*Inclusive*/ std::false_type) noexcept;
89 
90 template <class _ForwardIterator, class _OutputIterator, class _UnaryOperation, class _Tp, class _BinaryOperation>
91 std::pair<_OutputIterator, _Tp> __brick_transform_scan(_ForwardIterator, _ForwardIterator, _OutputIterator,
92                                                        _UnaryOperation, _Tp, _BinaryOperation,
93                                                        /*Inclusive*/ std::true_type) noexcept;
94 
95 template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _UnaryOperation, class _Tp,
96           class _BinaryOperation, class _Inclusive, class _IsVector>
97 _OutputIterator
98 __pattern_transform_scan(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _OutputIterator, _UnaryOperation, _Tp,
99                          _BinaryOperation, _Inclusive, _IsVector,
100                          /*is_parallel=*/std::false_type) noexcept;
101 
102 #if __PSTL_USE_PAR_POLICIES
103 template <class _ExecutionPolicy, class _RandomAccessIterator, class _OutputIterator, class _UnaryOperation, class _Tp,
104           class _BinaryOperation, class _Inclusive, class _IsVector>
105 typename std::enable_if<!std::is_floating_point<_Tp>::value, _OutputIterator>::type
106 __pattern_transform_scan(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _OutputIterator,
107                          _UnaryOperation, _Tp, _BinaryOperation, _Inclusive, _IsVector, /*is_parallel=*/std::true_type);
108 #endif
109 
110 #if __PSTL_USE_PAR_POLICIES
111 template <class _ExecutionPolicy, class _RandomAccessIterator, class _OutputIterator, class _UnaryOperation, class _Tp,
112           class _BinaryOperation, class _Inclusive, class _IsVector>
113 typename std::enable_if<std::is_floating_point<_Tp>::value, _OutputIterator>::type
114 __pattern_transform_scan(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _OutputIterator,
115                          _UnaryOperation, _Tp, _BinaryOperation, _Inclusive, _IsVector, /*is_parallel=*/std::true_type);
116 #endif
117 
118 //------------------------------------------------------------------------
119 // adjacent_difference
120 //------------------------------------------------------------------------
121 
122 template <class _ForwardIterator, class _OutputIterator, class _BinaryOperation>
123 _OutputIterator __brick_adjacent_difference(_ForwardIterator, _ForwardIterator, _OutputIterator, _BinaryOperation,
124                                             /*is_vector*/ std::false_type) noexcept;
125 
126 template <class _ForwardIterator, class _OutputIterator, class _BinaryOperation>
127 _OutputIterator __brick_adjacent_difference(_ForwardIterator, _ForwardIterator, _OutputIterator, _BinaryOperation,
128                                             /*is_vector*/ std::true_type) noexcept;
129 
130 template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _BinaryOperation,
131           class _IsVector>
132 _OutputIterator
133 __pattern_adjacent_difference(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _OutputIterator, _BinaryOperation,
134                               _IsVector, /*is_parallel*/ std::false_type) noexcept;
135 
136 #if __PSTL_USE_PAR_POLICIES
137 template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _BinaryOperation,
138           class _IsVector>
139 _OutputIterator
140 __pattern_adjacent_difference(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _OutputIterator, _BinaryOperation,
141                               _IsVector, /*is_parallel*/ std::true_type);
142 #endif
143 
144 } // namespace __internal
145 } // namespace __pstl
146 #endif /* __PSTL_numeric_fwd_H */
147