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  template <class _ExecutionPolicy, class _RandomAccessIterator1, class _RandomAccessIterator2, class _Tp,
      43            class _BinaryOperation1, class _BinaryOperation2, class _IsVector>
      44  _Tp
      45  __pattern_transform_reduce(_ExecutionPolicy&&, _RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2,
      46                             _Tp, _BinaryOperation1, _BinaryOperation2, _IsVector __is_vector,
      47                             /*is_parallel=*/std::true_type);
      48  
      49  //------------------------------------------------------------------------
      50  // transform_reduce (version with unary and binary functions)
      51  //------------------------------------------------------------------------
      52  
      53  template <class _ForwardIterator, class _Tp, class _UnaryOperation, class _BinaryOperation>
      54  _Tp __brick_transform_reduce(_ForwardIterator, _ForwardIterator, _Tp, _BinaryOperation, _UnaryOperation,
      55                               /*is_vector=*/std::true_type) noexcept;
      56  
      57  template <class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation>
      58  _Tp __brick_transform_reduce(_ForwardIterator, _ForwardIterator, _Tp, _BinaryOperation, _UnaryOperation,
      59                               /*is_vector=*/std::false_type) noexcept;
      60  
      61  template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation,
      62            class _IsVector>
      63  _Tp
      64  __pattern_transform_reduce(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Tp, _BinaryOperation,
      65                             _UnaryOperation, _IsVector,
      66                             /*is_parallel=*/std::false_type) noexcept;
      67  
      68  template <class _ExecutionPolicy, class _ForwardIterator, class _Tp, class _BinaryOperation, class _UnaryOperation,
      69            class _IsVector>
      70  _Tp
      71  __pattern_transform_reduce(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Tp, _BinaryOperation,
      72                             _UnaryOperation, _IsVector,
      73                             /*is_parallel=*/std::true_type);
      74  
      75  //------------------------------------------------------------------------
      76  // transform_exclusive_scan
      77  //
      78  // walk3 evaluates f(x,y,z) for (x,y,z) drawn from [first1,last1), [first2,...), [first3,...)
      79  //------------------------------------------------------------------------
      80  
      81  template <class _ForwardIterator, class _OutputIterator, class _UnaryOperation, class _Tp, class _BinaryOperation>
      82  std::pair<_OutputIterator, _Tp> __brick_transform_scan(_ForwardIterator, _ForwardIterator, _OutputIterator,
      83                                                         _UnaryOperation, _Tp, _BinaryOperation,
      84                                                         /*Inclusive*/ std::false_type) noexcept;
      85  
      86  template <class _ForwardIterator, class _OutputIterator, class _UnaryOperation, class _Tp, class _BinaryOperation>
      87  std::pair<_OutputIterator, _Tp> __brick_transform_scan(_ForwardIterator, _ForwardIterator, _OutputIterator,
      88                                                         _UnaryOperation, _Tp, _BinaryOperation,
      89                                                         /*Inclusive*/ std::true_type) noexcept;
      90  
      91  template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _UnaryOperation, class _Tp,
      92            class _BinaryOperation, class _Inclusive, class _IsVector>
      93  _OutputIterator
      94  __pattern_transform_scan(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _OutputIterator, _UnaryOperation, _Tp,
      95                           _BinaryOperation, _Inclusive, _IsVector,
      96                           /*is_parallel=*/std::false_type) noexcept;
      97  
      98  template <class _ExecutionPolicy, class _RandomAccessIterator, class _OutputIterator, class _UnaryOperation, class _Tp,
      99            class _BinaryOperation, class _Inclusive, class _IsVector>
     100  typename std::enable_if<!std::is_floating_point<_Tp>::value, _OutputIterator>::type
     101  __pattern_transform_scan(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _OutputIterator,
     102                           _UnaryOperation, _Tp, _BinaryOperation, _Inclusive, _IsVector, /*is_parallel=*/std::true_type);
     103  
     104  template <class _ExecutionPolicy, class _RandomAccessIterator, class _OutputIterator, class _UnaryOperation, class _Tp,
     105            class _BinaryOperation, class _Inclusive, class _IsVector>
     106  typename std::enable_if<std::is_floating_point<_Tp>::value, _OutputIterator>::type
     107  __pattern_transform_scan(_ExecutionPolicy&&, _RandomAccessIterator, _RandomAccessIterator, _OutputIterator,
     108                           _UnaryOperation, _Tp, _BinaryOperation, _Inclusive, _IsVector, /*is_parallel=*/std::true_type);
     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 _ForwardIterator, class _OutputIterator, class _BinaryOperation>
     119  _OutputIterator __brick_adjacent_difference(_ForwardIterator, _ForwardIterator, _OutputIterator, _BinaryOperation,
     120                                              /*is_vector*/ std::true_type) noexcept;
     121  
     122  template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _BinaryOperation,
     123            class _IsVector>
     124  _OutputIterator
     125  __pattern_adjacent_difference(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _OutputIterator, _BinaryOperation,
     126                                _IsVector, /*is_parallel*/ std::false_type) noexcept;
     127  
     128  template <class _ExecutionPolicy, class _ForwardIterator, class _OutputIterator, class _BinaryOperation,
     129            class _IsVector>
     130  _OutputIterator
     131  __pattern_adjacent_difference(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _OutputIterator, _BinaryOperation,
     132                                _IsVector, /*is_parallel*/ std::true_type);
     133  
     134  } // namespace __internal
     135  } // namespace __pstl
     136  #endif /* _PSTL_NUMERIC_FWD_H */