glue_numeric_impl.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. // -*- C++ -*-
  2. //===-- glue_numeric_impl.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. #ifndef _PSTL_GLUE_NUMERIC_IMPL_H
  10. #define _PSTL_GLUE_NUMERIC_IMPL_H
  11. #include <functional>
  12. #include "utils.h"
  13. #include "numeric_fwd.h"
  14. namespace std
  15. {
  16. // [reduce]
  17. template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _BinaryOperation>
  18. __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
  19. reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Tp __init,
  20. _BinaryOperation __binary_op)
  21. {
  22. return transform_reduce(std::forward<_ExecutionPolicy>(__exec), __first, __last, __init, __binary_op,
  23. __pstl::__internal::__no_op());
  24. }
  25. template <class _ExecutionPolicy, class _ForwardIterator, class _Tp>
  26. __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
  27. reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Tp __init)
  28. {
  29. return transform_reduce(std::forward<_ExecutionPolicy>(__exec), __first, __last, __init, std::plus<_Tp>(),
  30. __pstl::__internal::__no_op());
  31. }
  32. template <class _ExecutionPolicy, class _ForwardIterator>
  33. __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy,
  34. typename iterator_traits<_ForwardIterator>::value_type>
  35. reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last)
  36. {
  37. typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType;
  38. return transform_reduce(std::forward<_ExecutionPolicy>(__exec), __first, __last, _ValueType{},
  39. std::plus<_ValueType>(), __pstl::__internal::__no_op());
  40. }
  41. // [transform.reduce]
  42. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp>
  43. __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
  44. transform_reduce(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
  45. _ForwardIterator2 __first2, _Tp __init)
  46. {
  47. typedef typename iterator_traits<_ForwardIterator1>::value_type _InputType;
  48. using namespace __pstl;
  49. return __internal::__pattern_transform_reduce(
  50. std::forward<_ExecutionPolicy>(__exec), __first1, __last1, __first2, __init, std::plus<_InputType>(),
  51. std::multiplies<_InputType>(),
  52. __internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec),
  53. __internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec));
  54. }
  55. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation1,
  56. class _BinaryOperation2>
  57. __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
  58. transform_reduce(_ExecutionPolicy&& __exec, _ForwardIterator1 __first1, _ForwardIterator1 __last1,
  59. _ForwardIterator2 __first2, _Tp __init, _BinaryOperation1 __binary_op1, _BinaryOperation2 __binary_op2)
  60. {
  61. using namespace __pstl;
  62. return __internal::__pattern_transform_reduce(
  63. std::forward<_ExecutionPolicy>(__exec), __first1, __last1, __first2, __init, __binary_op1, __binary_op2,
  64. __internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec),
  65. __internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec));
  66. }
  67. template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation>
  68. __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _Tp>
  69. transform_reduce(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Tp __init,
  70. _BinaryOperation __binary_op, _UnaryOperation __unary_op)
  71. {
  72. using namespace __pstl;
  73. return __internal::__pattern_transform_reduce(
  74. std::forward<_ExecutionPolicy>(__exec), __first, __last, __init, __binary_op, __unary_op,
  75. __internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec),
  76. __internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator>(__exec));
  77. }
  78. // [exclusive.scan]
  79. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp>
  80. __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
  81. exclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
  82. _ForwardIterator2 __result, _Tp __init)
  83. {
  84. return transform_exclusive_scan(std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __init,
  85. std::plus<_Tp>(), __pstl::__internal::__no_op());
  86. }
  87. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation>
  88. __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
  89. exclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
  90. _ForwardIterator2 __result, _Tp __init, _BinaryOperation __binary_op)
  91. {
  92. return transform_exclusive_scan(std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __init,
  93. __binary_op, __pstl::__internal::__no_op());
  94. }
  95. // [inclusive.scan]
  96. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
  97. __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
  98. inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
  99. _ForwardIterator2 __result)
  100. {
  101. typedef typename iterator_traits<_ForwardIterator1>::value_type _InputType;
  102. return transform_inclusive_scan(std::forward<_ExecutionPolicy>(__exec), __first, __last, __result,
  103. std::plus<_InputType>(), __pstl::__internal::__no_op());
  104. }
  105. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryOperation>
  106. __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
  107. inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
  108. _ForwardIterator2 __result, _BinaryOperation __binary_op)
  109. {
  110. return transform_inclusive_scan(std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __binary_op,
  111. __pstl::__internal::__no_op());
  112. }
  113. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation>
  114. __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
  115. inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
  116. _ForwardIterator2 __result, _BinaryOperation __binary_op, _Tp __init)
  117. {
  118. return transform_inclusive_scan(std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __binary_op,
  119. __pstl::__internal::__no_op(), __init);
  120. }
  121. // [transform.exclusive.scan]
  122. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _Tp, class _BinaryOperation,
  123. class _UnaryOperation>
  124. __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
  125. transform_exclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
  126. _ForwardIterator2 __result, _Tp __init, _BinaryOperation __binary_op,
  127. _UnaryOperation __unary_op)
  128. {
  129. using namespace __pstl;
  130. return __internal::__pattern_transform_scan(
  131. std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __unary_op, __init, __binary_op,
  132. /*inclusive=*/std::false_type(),
  133. __internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec),
  134. __internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec));
  135. }
  136. // [transform.inclusive.scan]
  137. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryOperation,
  138. class _UnaryOperation, class _Tp>
  139. __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
  140. transform_inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
  141. _ForwardIterator2 __result, _BinaryOperation __binary_op, _UnaryOperation __unary_op,
  142. _Tp __init)
  143. {
  144. using namespace __pstl;
  145. return __internal::__pattern_transform_scan(
  146. std::forward<_ExecutionPolicy>(__exec), __first, __last, __result, __unary_op, __init, __binary_op,
  147. /*inclusive=*/std::true_type(),
  148. __internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec),
  149. __internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec));
  150. }
  151. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _UnaryOperation,
  152. class _BinaryOperation>
  153. __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
  154. transform_inclusive_scan(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
  155. _ForwardIterator2 __result, _BinaryOperation __binary_op, _UnaryOperation __unary_op)
  156. {
  157. if (__first != __last)
  158. {
  159. auto __tmp = __unary_op(*__first);
  160. *__result = __tmp;
  161. return transform_inclusive_scan(std::forward<_ExecutionPolicy>(__exec), ++__first, __last, ++__result,
  162. __binary_op, __unary_op, __tmp);
  163. }
  164. else
  165. {
  166. return __result;
  167. }
  168. }
  169. // [adjacent.difference]
  170. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2, class _BinaryOperation>
  171. __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
  172. adjacent_difference(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
  173. _ForwardIterator2 __d_first, _BinaryOperation __op)
  174. {
  175. if (__first == __last)
  176. return __d_first;
  177. using namespace __pstl;
  178. return __internal::__pattern_adjacent_difference(
  179. std::forward<_ExecutionPolicy>(__exec), __first, __last, __d_first, __op,
  180. __internal::__is_vectorization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec),
  181. __internal::__is_parallelization_preferred<_ExecutionPolicy, _ForwardIterator1, _ForwardIterator2>(__exec));
  182. }
  183. template <class _ExecutionPolicy, class _ForwardIterator1, class _ForwardIterator2>
  184. __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, _ForwardIterator2>
  185. adjacent_difference(_ExecutionPolicy&& __exec, _ForwardIterator1 __first, _ForwardIterator1 __last,
  186. _ForwardIterator2 __d_first)
  187. {
  188. typedef typename iterator_traits<_ForwardIterator1>::value_type _ValueType;
  189. return adjacent_difference(std::forward<_ExecutionPolicy>(__exec), __first, __last, __d_first,
  190. std::minus<_ValueType>());
  191. }
  192. } // namespace std
  193. #endif /* _PSTL_GLUE_NUMERIC_IMPL_H_ */