(root)/
gcc-13.2.0/
libstdc++-v3/
include/
pstl/
parallel_backend_serial.h
       1  // -*- C++ -*-
       2  //===-- parallel_backend_serial.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_PARALLEL_BACKEND_SERIAL_H
      11  #define _PSTL_PARALLEL_BACKEND_SERIAL_H
      12  
      13  #include <algorithm>
      14  #include <cstddef>
      15  #include <memory>
      16  #include <numeric>
      17  #include <utility>
      18  
      19  namespace __pstl
      20  {
      21  namespace __serial_backend
      22  {
      23  
      24  template <typename _Tp>
      25  class __buffer
      26  {
      27      std::allocator<_Tp> __allocator_;
      28      _Tp* __ptr_;
      29      const std::size_t __buf_size_;
      30      __buffer(const __buffer&) = delete;
      31      void
      32      operator=(const __buffer&) = delete;
      33  
      34    public:
      35      __buffer(std::size_t __n) : __allocator_(), __ptr_(__allocator_.allocate(__n)), __buf_size_(__n) {}
      36  
      37      operator bool() const { return __ptr_ != nullptr; }
      38      _Tp*
      39      get() const
      40      {
      41          return __ptr_;
      42      }
      43      ~__buffer() { __allocator_.deallocate(__ptr_, __buf_size_); }
      44  };
      45  
      46  inline void
      47  __cancel_execution()
      48  {
      49  }
      50  
      51  template <class _ExecutionPolicy, class _Index, class _Fp>
      52  void
      53  __parallel_for(_ExecutionPolicy&&, _Index __first, _Index __last, _Fp __f)
      54  {
      55      __f(__first, __last);
      56  }
      57  
      58  template <class _ExecutionPolicy, class _Value, class _Index, typename _RealBody, typename _Reduction>
      59  _Value
      60  __parallel_reduce(_ExecutionPolicy&&, _Index __first, _Index __last, const _Value& __identity,
      61                    const _RealBody& __real_body, const _Reduction&)
      62  {
      63      if (__first == __last)
      64      {
      65          return __identity;
      66      }
      67      else
      68      {
      69          return __real_body(__first, __last, __identity);
      70      }
      71  }
      72  
      73  template <class _ExecutionPolicy, class _Index, class _UnaryOp, class _Tp, class _BinaryOp, class _Reduce>
      74  _Tp
      75  __parallel_transform_reduce(_ExecutionPolicy&&, _Index __first, _Index __last, _UnaryOp, _Tp __init, _BinaryOp,
      76                              _Reduce __reduce)
      77  {
      78      return __reduce(__first, __last, __init);
      79  }
      80  
      81  template <class _ExecutionPolicy, typename _Index, typename _Tp, typename _Rp, typename _Cp, typename _Sp, typename _Ap>
      82  void
      83  __parallel_strict_scan(_ExecutionPolicy&&, _Index __n, _Tp __initial, _Rp __reduce, _Cp __combine, _Sp __scan,
      84                         _Ap __apex)
      85  {
      86      _Tp __sum = __initial;
      87      if (__n)
      88          __sum = __combine(__sum, __reduce(_Index(0), __n));
      89      __apex(__sum);
      90      if (__n)
      91          __scan(_Index(0), __n, __initial);
      92  }
      93  
      94  template <class _ExecutionPolicy, class _Index, class _UnaryOp, class _Tp, class _BinaryOp, class _Reduce, class _Scan>
      95  _Tp
      96  __parallel_transform_scan(_ExecutionPolicy&&, _Index __n, _UnaryOp, _Tp __init, _BinaryOp, _Reduce, _Scan __scan)
      97  {
      98      return __scan(_Index(0), __n, __init);
      99  }
     100  
     101  template <class _ExecutionPolicy, typename _RandomAccessIterator, typename _Compare, typename _LeafSort>
     102  void
     103  __parallel_stable_sort(_ExecutionPolicy&&, _RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp,
     104                         _LeafSort __leaf_sort, std::size_t = 0)
     105  {
     106      __leaf_sort(__first, __last, __comp);
     107  }
     108  
     109  template <class _ExecutionPolicy, typename _RandomAccessIterator1, typename _RandomAccessIterator2,
     110            typename _RandomAccessIterator3, typename _Compare, typename _LeafMerge>
     111  void
     112  __parallel_merge(_ExecutionPolicy&&, _RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1,
     113                   _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _RandomAccessIterator3 __outit,
     114                   _Compare __comp, _LeafMerge __leaf_merge)
     115  {
     116      __leaf_merge(__first1, __last1, __first2, __last2, __outit, __comp);
     117  }
     118  
     119  template <class _ExecutionPolicy, typename _F1, typename _F2>
     120  void
     121  __parallel_invoke(_ExecutionPolicy&&, _F1&& __f1, _F2&& __f2)
     122  {
     123      std::forward<_F1>(__f1)();
     124      std::forward<_F2>(__f2)();
     125  }
     126  
     127  } // namespace __serial_backend
     128  } // namespace __pstl
     129  
     130  #endif /* _PSTL_PARALLEL_BACKEND_SERIAL_H */