1e78f53d1SNikolas Klauser// -*- C++ -*- 2e78f53d1SNikolas Klauser//===----------------------------------------------------------------------===// 3e78f53d1SNikolas Klauser// 4e78f53d1SNikolas Klauser// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5e78f53d1SNikolas Klauser// See https://llvm.org/LICENSE.txt for license information. 6e78f53d1SNikolas Klauser// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7e78f53d1SNikolas Klauser// 8e78f53d1SNikolas Klauser//===----------------------------------------------------------------------===// 9e78f53d1SNikolas Klauser 10*ce777190SNikolas Klauser#ifndef _LIBCPP___CXX03_EXECUTION 11*ce777190SNikolas Klauser#define _LIBCPP___CXX03_EXECUTION 12e78f53d1SNikolas Klauser 13e78f53d1SNikolas Klauser/* 14e78f53d1SNikolas Klausernamespace std::execution { 15e78f53d1SNikolas Klauser struct sequenced_policy; 16e78f53d1SNikolas Klauser struct parallel_policy; 17e78f53d1SNikolas Klauser struct parallel_unsequenced_policy; 18e78f53d1SNikolas Klauser struct unsequenced_policy; // since C++20 19e78f53d1SNikolas Klauser 20e78f53d1SNikolas Klauser inline constexpr sequenced_policy seq = implementation-defined; 21e78f53d1SNikolas Klauser inline constexpr parallel_policy par = implementation-defined; 22e78f53d1SNikolas Klauser inline constexpr parallel_unsequenced_policy par_unseq = implementation-defined; 23e78f53d1SNikolas Klauser inline constexpr unsequenced_policy unseq = implementation-defined; // since C++20 24e78f53d1SNikolas Klauser} 25e78f53d1SNikolas Klauser 26e78f53d1SNikolas Klausernamespace std { 27e78f53d1SNikolas Klauser template <class T> 28e78f53d1SNikolas Klauser struct is_execution_policy; 29e78f53d1SNikolas Klauser 30e78f53d1SNikolas Klauser template <class T> 31e78f53d1SNikolas Klauser inline constexpr bool is_execution_policy_v; 32e78f53d1SNikolas Klauser} 33e78f53d1SNikolas Klauser*/ 34e78f53d1SNikolas Klauser 3573fbae83SNikolas Klauser#include <__cxx03/__config> 3673fbae83SNikolas Klauser#include <__cxx03/__type_traits/is_execution_policy.h> 3773fbae83SNikolas Klauser#include <__cxx03/__type_traits/is_same.h> 3873fbae83SNikolas Klauser#include <__cxx03/__type_traits/remove_cvref.h> 3973fbae83SNikolas Klauser#include <__cxx03/version> 40e78f53d1SNikolas Klauser 41e78f53d1SNikolas Klauser#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 42e78f53d1SNikolas Klauser# pragma GCC system_header 43e78f53d1SNikolas Klauser#endif 44e78f53d1SNikolas Klauser 45e78f53d1SNikolas Klauser#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 46e78f53d1SNikolas Klauser 47e78f53d1SNikolas Klauser_LIBCPP_BEGIN_NAMESPACE_STD 48e78f53d1SNikolas Klauser 49e78f53d1SNikolas Klausernamespace execution { 50e78f53d1SNikolas Klauserstruct sequenced_policy { 51e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr explicit sequenced_policy(__disable_user_instantiations_tag) {} 52e78f53d1SNikolas Klauser sequenced_policy(const sequenced_policy&) = delete; 53e78f53d1SNikolas Klauser sequenced_policy& operator=(const sequenced_policy&) = delete; 54e78f53d1SNikolas Klauser}; 55e78f53d1SNikolas Klauser 56e78f53d1SNikolas Klauserinline constexpr sequenced_policy seq{__disable_user_instantiations_tag{}}; 57e78f53d1SNikolas Klauser 58e78f53d1SNikolas Klauserstruct parallel_policy { 59e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr explicit parallel_policy(__disable_user_instantiations_tag) {} 60e78f53d1SNikolas Klauser parallel_policy(const parallel_policy&) = delete; 61e78f53d1SNikolas Klauser parallel_policy& operator=(const parallel_policy&) = delete; 62e78f53d1SNikolas Klauser}; 63e78f53d1SNikolas Klauser 64e78f53d1SNikolas Klauserinline constexpr parallel_policy par{__disable_user_instantiations_tag{}}; 65e78f53d1SNikolas Klauser 66e78f53d1SNikolas Klauserstruct parallel_unsequenced_policy { 67e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr explicit parallel_unsequenced_policy(__disable_user_instantiations_tag) {} 68e78f53d1SNikolas Klauser parallel_unsequenced_policy(const parallel_unsequenced_policy&) = delete; 69e78f53d1SNikolas Klauser parallel_unsequenced_policy& operator=(const parallel_unsequenced_policy&) = delete; 70e78f53d1SNikolas Klauser}; 71e78f53d1SNikolas Klauser 72e78f53d1SNikolas Klauserinline constexpr parallel_unsequenced_policy par_unseq{__disable_user_instantiations_tag{}}; 73e78f53d1SNikolas Klauser 74e78f53d1SNikolas Klauserstruct __unsequenced_policy { 75e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr explicit __unsequenced_policy(__disable_user_instantiations_tag) {} 76e78f53d1SNikolas Klauser __unsequenced_policy(const __unsequenced_policy&) = delete; 77e78f53d1SNikolas Klauser __unsequenced_policy& operator=(const __unsequenced_policy&) = delete; 78e78f53d1SNikolas Klauser}; 79e78f53d1SNikolas Klauser 80e78f53d1SNikolas Klauserconstexpr __unsequenced_policy __unseq{__disable_user_instantiations_tag{}}; 81e78f53d1SNikolas Klauser 82e78f53d1SNikolas Klauser# if _LIBCPP_STD_VER >= 20 83e78f53d1SNikolas Klauser 84e78f53d1SNikolas Klauserstruct unsequenced_policy { 85e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr explicit unsequenced_policy(__disable_user_instantiations_tag) {} 86e78f53d1SNikolas Klauser unsequenced_policy(const unsequenced_policy&) = delete; 87e78f53d1SNikolas Klauser unsequenced_policy& operator=(const unsequenced_policy&) = delete; 88e78f53d1SNikolas Klauser}; 89e78f53d1SNikolas Klauser 90e78f53d1SNikolas Klauserinline constexpr unsequenced_policy unseq{__disable_user_instantiations_tag{}}; 91e78f53d1SNikolas Klauser 92e78f53d1SNikolas Klauser# endif // _LIBCPP_STD_VER >= 20 93e78f53d1SNikolas Klauser 94e78f53d1SNikolas Klauser} // namespace execution 95e78f53d1SNikolas Klauser 96e78f53d1SNikolas Klausertemplate <> 97e78f53d1SNikolas Klauserinline constexpr bool is_execution_policy_v<execution::sequenced_policy> = true; 98e78f53d1SNikolas Klauser 99e78f53d1SNikolas Klausertemplate <> 100e78f53d1SNikolas Klauserinline constexpr bool is_execution_policy_v<execution::parallel_policy> = true; 101e78f53d1SNikolas Klauser 102e78f53d1SNikolas Klausertemplate <> 103e78f53d1SNikolas Klauserinline constexpr bool is_execution_policy_v<execution::parallel_unsequenced_policy> = true; 104e78f53d1SNikolas Klauser 105e78f53d1SNikolas Klausertemplate <> 106e78f53d1SNikolas Klauserinline constexpr bool is_execution_policy_v<execution::__unsequenced_policy> = true; 107e78f53d1SNikolas Klauser 108e78f53d1SNikolas Klausertemplate <> 109e78f53d1SNikolas Klauserinline constexpr bool __is_parallel_execution_policy_impl<execution::parallel_policy> = true; 110e78f53d1SNikolas Klauser 111e78f53d1SNikolas Klausertemplate <> 112e78f53d1SNikolas Klauserinline constexpr bool __is_parallel_execution_policy_impl<execution::parallel_unsequenced_policy> = true; 113e78f53d1SNikolas Klauser 114e78f53d1SNikolas Klausertemplate <> 115e78f53d1SNikolas Klauserinline constexpr bool __is_unsequenced_execution_policy_impl<execution::__unsequenced_policy> = true; 116e78f53d1SNikolas Klauser 117e78f53d1SNikolas Klausertemplate <> 118e78f53d1SNikolas Klauserinline constexpr bool __is_unsequenced_execution_policy_impl<execution::parallel_unsequenced_policy> = true; 119e78f53d1SNikolas Klauser 120e78f53d1SNikolas Klauser# if _LIBCPP_STD_VER >= 20 121e78f53d1SNikolas Klausertemplate <> 122e78f53d1SNikolas Klauserinline constexpr bool is_execution_policy_v<execution::unsequenced_policy> = true; 123e78f53d1SNikolas Klauser 124e78f53d1SNikolas Klausertemplate <> 125e78f53d1SNikolas Klauserinline constexpr bool __is_unsequenced_execution_policy_impl<execution::unsequenced_policy> = true; 126e78f53d1SNikolas Klauser 127e78f53d1SNikolas Klauser# endif 128e78f53d1SNikolas Klauser 129e78f53d1SNikolas Klausertemplate <class _Tp> 130e78f53d1SNikolas Klauserstruct is_execution_policy : bool_constant<is_execution_policy_v<_Tp>> {}; 131e78f53d1SNikolas Klauser 132e78f53d1SNikolas Klausertemplate <class _ExecutionPolicy> 133e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI auto __remove_parallel_policy(const _ExecutionPolicy&) { 134e78f53d1SNikolas Klauser if constexpr (is_same_v<_ExecutionPolicy, execution::parallel_policy>) { 135e78f53d1SNikolas Klauser return execution::sequenced_policy(execution::__disable_user_instantiations_tag{}); 136e78f53d1SNikolas Klauser } else if constexpr (is_same_v<_ExecutionPolicy, execution::parallel_unsequenced_policy>) { 137e78f53d1SNikolas Klauser return execution::__unsequenced_policy{execution::__disable_user_instantiations_tag{}}; 138e78f53d1SNikolas Klauser } 139e78f53d1SNikolas Klauser} 140e78f53d1SNikolas Klauser 141e78f53d1SNikolas Klauser_LIBCPP_END_NAMESPACE_STD 142e78f53d1SNikolas Klauser 143e78f53d1SNikolas Klauser#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 144e78f53d1SNikolas Klauser 145e78f53d1SNikolas Klauser#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 14673fbae83SNikolas Klauser# include <__cxx03/cstddef> 147e78f53d1SNikolas Klauser#endif 148e78f53d1SNikolas Klauser 149*ce777190SNikolas Klauser#endif // _LIBCPP___CXX03_EXECUTION 150