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