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