1e78f53d1SNikolas Klauser //===----------------------------------------------------------------------===// 2e78f53d1SNikolas Klauser // 3e78f53d1SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e78f53d1SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 5e78f53d1SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e78f53d1SNikolas Klauser // 7e78f53d1SNikolas Klauser //===----------------------------------------------------------------------===// 8e78f53d1SNikolas Klauser 9*ce777190SNikolas Klauser #ifndef _LIBCPP___CXX03___PSTL_BACKENDS_STD_THREAD_H 10*ce777190SNikolas Klauser #define _LIBCPP___CXX03___PSTL_BACKENDS_STD_THREAD_H 11e78f53d1SNikolas Klauser 1273fbae83SNikolas Klauser #include <__cxx03/__config> 1373fbae83SNikolas Klauser #include <__cxx03/__pstl/backend_fwd.h> 1473fbae83SNikolas Klauser #include <__cxx03/__pstl/cpu_algos/any_of.h> 1573fbae83SNikolas Klauser #include <__cxx03/__pstl/cpu_algos/cpu_traits.h> 1673fbae83SNikolas Klauser #include <__cxx03/__pstl/cpu_algos/fill.h> 1773fbae83SNikolas Klauser #include <__cxx03/__pstl/cpu_algos/find_if.h> 1873fbae83SNikolas Klauser #include <__cxx03/__pstl/cpu_algos/for_each.h> 1973fbae83SNikolas Klauser #include <__cxx03/__pstl/cpu_algos/merge.h> 2073fbae83SNikolas Klauser #include <__cxx03/__pstl/cpu_algos/stable_sort.h> 2173fbae83SNikolas Klauser #include <__cxx03/__pstl/cpu_algos/transform.h> 2273fbae83SNikolas Klauser #include <__cxx03/__pstl/cpu_algos/transform_reduce.h> 2373fbae83SNikolas Klauser #include <__cxx03/__utility/empty.h> 2473fbae83SNikolas Klauser #include <__cxx03/__utility/move.h> 2573fbae83SNikolas Klauser #include <__cxx03/cstddef> 2673fbae83SNikolas Klauser #include <__cxx03/optional> 27e78f53d1SNikolas Klauser 28e78f53d1SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 29e78f53d1SNikolas Klauser # pragma GCC system_header 30e78f53d1SNikolas Klauser #endif 31e78f53d1SNikolas Klauser 32e78f53d1SNikolas Klauser _LIBCPP_PUSH_MACROS 3373fbae83SNikolas Klauser #include <__cxx03/__undef_macros> 34e78f53d1SNikolas Klauser 35e78f53d1SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD 36e78f53d1SNikolas Klauser namespace __pstl { 37e78f53d1SNikolas Klauser 38e78f53d1SNikolas Klauser // 39e78f53d1SNikolas Klauser // This partial backend implementation is for testing purposes only and not meant for production use. This will be 40e78f53d1SNikolas Klauser // replaced by a proper implementation once the PSTL implementation is somewhat stable. 41e78f53d1SNikolas Klauser // 42e78f53d1SNikolas Klauser // This is intended to be used on top of the "default backend". 43e78f53d1SNikolas Klauser // 44e78f53d1SNikolas Klauser 45e78f53d1SNikolas Klauser template <> 46e78f53d1SNikolas Klauser struct __cpu_traits<__std_thread_backend_tag> { 47e78f53d1SNikolas Klauser template <class _RandomAccessIterator, class _Fp> 48e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI static optional<__empty> 49e78f53d1SNikolas Klauser __for_each(_RandomAccessIterator __first, _RandomAccessIterator __last, _Fp __f) { 50e78f53d1SNikolas Klauser __f(__first, __last); 51e78f53d1SNikolas Klauser return __empty{}; 52e78f53d1SNikolas Klauser } 53e78f53d1SNikolas Klauser 54e78f53d1SNikolas Klauser template <class _Index, class _UnaryOp, class _Tp, class _BinaryOp, class _Reduce> 55e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI static optional<_Tp> 56e78f53d1SNikolas Klauser __transform_reduce(_Index __first, _Index __last, _UnaryOp, _Tp __init, _BinaryOp, _Reduce __reduce) { 57e78f53d1SNikolas Klauser return __reduce(std::move(__first), std::move(__last), std::move(__init)); 58e78f53d1SNikolas Klauser } 59e78f53d1SNikolas Klauser 60e78f53d1SNikolas Klauser template <class _RandomAccessIterator, class _Compare, class _LeafSort> 61e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI static optional<__empty> 62e78f53d1SNikolas Klauser __stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp, _LeafSort __leaf_sort) { 63e78f53d1SNikolas Klauser __leaf_sort(__first, __last, __comp); 64e78f53d1SNikolas Klauser return __empty{}; 65e78f53d1SNikolas Klauser } 66e78f53d1SNikolas Klauser 67e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI static void __cancel_execution() {} 68e78f53d1SNikolas Klauser 69e78f53d1SNikolas Klauser template <class _RandomAccessIterator1, 70e78f53d1SNikolas Klauser class _RandomAccessIterator2, 71e78f53d1SNikolas Klauser class _RandomAccessIterator3, 72e78f53d1SNikolas Klauser class _Compare, 73e78f53d1SNikolas Klauser class _LeafMerge> 74e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI static optional<__empty> 75e78f53d1SNikolas Klauser __merge(_RandomAccessIterator1 __first1, 76e78f53d1SNikolas Klauser _RandomAccessIterator1 __last1, 77e78f53d1SNikolas Klauser _RandomAccessIterator2 __first2, 78e78f53d1SNikolas Klauser _RandomAccessIterator2 __last2, 79e78f53d1SNikolas Klauser _RandomAccessIterator3 __outit, 80e78f53d1SNikolas Klauser _Compare __comp, 81e78f53d1SNikolas Klauser _LeafMerge __leaf_merge) { 82e78f53d1SNikolas Klauser __leaf_merge(__first1, __last1, __first2, __last2, __outit, __comp); 83e78f53d1SNikolas Klauser return __empty{}; 84e78f53d1SNikolas Klauser } 85e78f53d1SNikolas Klauser 86e78f53d1SNikolas Klauser static constexpr size_t __lane_size = 64; 87e78f53d1SNikolas Klauser }; 88e78f53d1SNikolas Klauser 89e78f53d1SNikolas Klauser // Mandatory implementations of the computational basis 90e78f53d1SNikolas Klauser template <class _ExecutionPolicy> 91e78f53d1SNikolas Klauser struct __find_if<__std_thread_backend_tag, _ExecutionPolicy> 92e78f53d1SNikolas Klauser : __cpu_parallel_find_if<__std_thread_backend_tag, _ExecutionPolicy> {}; 93e78f53d1SNikolas Klauser 94e78f53d1SNikolas Klauser template <class _ExecutionPolicy> 95e78f53d1SNikolas Klauser struct __for_each<__std_thread_backend_tag, _ExecutionPolicy> 96e78f53d1SNikolas Klauser : __cpu_parallel_for_each<__std_thread_backend_tag, _ExecutionPolicy> {}; 97e78f53d1SNikolas Klauser 98e78f53d1SNikolas Klauser template <class _ExecutionPolicy> 99e78f53d1SNikolas Klauser struct __merge<__std_thread_backend_tag, _ExecutionPolicy> 100e78f53d1SNikolas Klauser : __cpu_parallel_merge<__std_thread_backend_tag, _ExecutionPolicy> {}; 101e78f53d1SNikolas Klauser 102e78f53d1SNikolas Klauser template <class _ExecutionPolicy> 103e78f53d1SNikolas Klauser struct __stable_sort<__std_thread_backend_tag, _ExecutionPolicy> 104e78f53d1SNikolas Klauser : __cpu_parallel_stable_sort<__std_thread_backend_tag, _ExecutionPolicy> {}; 105e78f53d1SNikolas Klauser 106e78f53d1SNikolas Klauser template <class _ExecutionPolicy> 107e78f53d1SNikolas Klauser struct __transform<__std_thread_backend_tag, _ExecutionPolicy> 108e78f53d1SNikolas Klauser : __cpu_parallel_transform<__std_thread_backend_tag, _ExecutionPolicy> {}; 109e78f53d1SNikolas Klauser 110e78f53d1SNikolas Klauser template <class _ExecutionPolicy> 111e78f53d1SNikolas Klauser struct __transform_binary<__std_thread_backend_tag, _ExecutionPolicy> 112e78f53d1SNikolas Klauser : __cpu_parallel_transform_binary<__std_thread_backend_tag, _ExecutionPolicy> {}; 113e78f53d1SNikolas Klauser 114e78f53d1SNikolas Klauser template <class _ExecutionPolicy> 115e78f53d1SNikolas Klauser struct __transform_reduce<__std_thread_backend_tag, _ExecutionPolicy> 116e78f53d1SNikolas Klauser : __cpu_parallel_transform_reduce<__std_thread_backend_tag, _ExecutionPolicy> {}; 117e78f53d1SNikolas Klauser 118e78f53d1SNikolas Klauser template <class _ExecutionPolicy> 119e78f53d1SNikolas Klauser struct __transform_reduce_binary<__std_thread_backend_tag, _ExecutionPolicy> 120e78f53d1SNikolas Klauser : __cpu_parallel_transform_reduce_binary<__std_thread_backend_tag, _ExecutionPolicy> {}; 121e78f53d1SNikolas Klauser 122e78f53d1SNikolas Klauser // Not mandatory, but better optimized 123e78f53d1SNikolas Klauser template <class _ExecutionPolicy> 124e78f53d1SNikolas Klauser struct __any_of<__std_thread_backend_tag, _ExecutionPolicy> 125e78f53d1SNikolas Klauser : __cpu_parallel_any_of<__std_thread_backend_tag, _ExecutionPolicy> {}; 126e78f53d1SNikolas Klauser 127e78f53d1SNikolas Klauser template <class _ExecutionPolicy> 128e78f53d1SNikolas Klauser struct __fill<__std_thread_backend_tag, _ExecutionPolicy> 129e78f53d1SNikolas Klauser : __cpu_parallel_fill<__std_thread_backend_tag, _ExecutionPolicy> {}; 130e78f53d1SNikolas Klauser 131e78f53d1SNikolas Klauser } // namespace __pstl 132e78f53d1SNikolas Klauser _LIBCPP_END_NAMESPACE_STD 133e78f53d1SNikolas Klauser 134e78f53d1SNikolas Klauser _LIBCPP_POP_MACROS 135e78f53d1SNikolas Klauser 136*ce777190SNikolas Klauser #endif // _LIBCPP___CXX03___PSTL_BACKENDS_STD_THREAD_H 137