• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation1, class _BinaryOperation2>
30 _Tp __brick_transform_reduce(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _Tp, _BinaryOperation1,
31                              _BinaryOperation2,
32                              /*__is_vector=*/std::true_type) noexcept;
33 
34 template <class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation1, class _BinaryOperation2>
35 _Tp __brick_transform_reduce(_ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _Tp, _BinaryOperation1,
36                              _BinaryOperation2,
37                              /*__is_vector=*/std::false_type) noexcept;
38 
39 template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation1,
40           class _BinaryOperation2, class _IsVector>
41 _Tp
42 __pattern_transform_reduce(_ExecutionPolicy&&, _ForwardIterator1, _ForwardIterator1, _ForwardIterator2, _Tp,
43                            _BinaryOperation1, _BinaryOperation2, _IsVector,
44                            /*is_parallel=*/std::false_type) noexcept;
45 
46 template <class _ExecutionPolicy, class _RandomAccessIterator1, class _RandomAccessIterator2, class _Tp,
47           class _BinaryOperation1, class _BinaryOperation2, class _IsVector>
48 _Tp
49 __pattern_transform_reduce(_ExecutionPolicy&&, _RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2,
50                            _Tp, _BinaryOperation1, _BinaryOperation2, _IsVector __is_vector,
51                            /*is_parallel=*/std::true_type);
52 
53 //------------------------------------------------------------------------
54 // transform_reduce (version with unary and binary functions)
55 //------------------------------------------------------------------------
56 
57 template <class _ForwardIterator, class _Tp, class _UnaryOperation, class _BinaryOperation>
58 _Tp __brick_transform_reduce(_ForwardIterator, _ForwardIterator, _Tp, _BinaryOperation, _UnaryOperation,
59                              /*is_vector=*/std::true_type) noexcept;
60 
61 template <class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation>
62 _Tp __brick_transform_reduce(_ForwardIterator, _ForwardIterator, _Tp, _BinaryOperation, _UnaryOperation,
63                              /*is_vector=*/std::false_type) noexcept;
64 
65 template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation,
66           class _IsVector>
67 _Tp
68 __pattern_transform_reduce(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Tp, _BinaryOperation,
69                            _UnaryOperation, _IsVector,
70                            /*is_parallel=*/std::false_type) noexcept;
71 
72 template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation,
73           class _IsVector>
74 _Tp
75 __pattern_transform_reduce(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Tp, _BinaryOperation,
76                            _UnaryOperation, _IsVector,
77                            /*is_parallel=*/std::true_type);
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 template <class _ExecutionPolicy, class _RandomAccessIterator, class _OutputIterator, class _UnaryOperation, class _Tp,
103           class _BinaryOperation, class _Inclusive, class _IsVector>
104 typename std::enable_if<!std::is_floating_point<_Tp>::value, _OutputIterator>::type
105 __pattern_transform_scan(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _OutputIterator,
106                          _UnaryOperation, _Tp, _BinaryOperation, _Inclusive, _IsVector, /*is_parallel=*/std::true_type);
107 
108 template <class _ExecutionPolicy, class _RandomAccessIterator, class _OutputIterator, class _UnaryOperation, class _Tp,
109           class _BinaryOperation, class _Inclusive, class _IsVector>
110 typename std::enable_if<std::is_floating_point<_Tp>::value, _OutputIterator>::type
111 __pattern_transform_scan(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _OutputIterator,
112                          _UnaryOperation, _Tp, _BinaryOperation, _Inclusive, _IsVector, /*is_parallel=*/std::true_type);
113 
114 //------------------------------------------------------------------------
115 // adjacent_difference
116 //------------------------------------------------------------------------
117 
118 template <class _ForwardIterator, class _OutputIterator, class _BinaryOperation>
119 _OutputIterator __brick_adjacent_difference(_ForwardIterator, _ForwardIterator, _OutputIterator, _BinaryOperation,
120                                             /*is_vector*/ std::false_type) noexcept;
121 
122 template <class _ForwardIterator, class _OutputIterator, class _BinaryOperation>
123 _OutputIterator __brick_adjacent_difference(_ForwardIterator, _ForwardIterator, _OutputIterator, _BinaryOperation,
124                                             /*is_vector*/ std::true_type) noexcept;
125 
126 template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _BinaryOperation,
127           class _IsVector>
128 _OutputIterator
129 __pattern_adjacent_difference(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _OutputIterator, _BinaryOperation,
130                               _IsVector, /*is_parallel*/ std::false_type) noexcept;
131 
132 template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _BinaryOperation,
133           class _IsVector>
134 _OutputIterator
135 __pattern_adjacent_difference(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _OutputIterator, _BinaryOperation,
136                               _IsVector, /*is_parallel*/ std::true_type);
137 
138 } // namespace __internal
139 } // namespace __pstl
140 
141 _PSTL_HIDE_FROM_ABI_POP
142 
143 #endif /* _PSTL_NUMERIC_FWD_H */
144