1e40139ffSDimitry Andric// -*- C++ -*- 2349cc55cSDimitry Andric//===----------------------------------------------------------------------===// 3e40139ffSDimitry Andric// 4e40139ffSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5e40139ffSDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 6e40139ffSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7e40139ffSDimitry Andric// 8e40139ffSDimitry Andric//===----------------------------------------------------------------------===// 9e40139ffSDimitry Andric 10e40139ffSDimitry Andric#ifndef _LIBCPP_EXECUTION 11e40139ffSDimitry Andric#define _LIBCPP_EXECUTION 12e40139ffSDimitry Andric 13*06c3fb27SDimitry Andric/* 14*06c3fb27SDimitry Andricnamespace std::execution { 15*06c3fb27SDimitry Andric struct sequenced_policy; 16*06c3fb27SDimitry Andric struct parallel_policy; 17*06c3fb27SDimitry Andric struct parallel_unsequenced_policy; 18*06c3fb27SDimitry Andric struct unsequenced_policy; // since C++20 19*06c3fb27SDimitry Andric 20*06c3fb27SDimitry Andric inline constexpr sequenced_policy seq = implementation-defined; 21*06c3fb27SDimitry Andric inline constexpr parallel_policy par = implementation-defined; 22*06c3fb27SDimitry Andric inline constexpr parallel_unsequenced_policy par_unseq = implementation-defined; 23*06c3fb27SDimitry Andric inline constexpr unsequenced_policy unseq = implementation-defined; // since C++20 24*06c3fb27SDimitry Andric} 25*06c3fb27SDimitry Andric 26*06c3fb27SDimitry Andricnamespace std { 27*06c3fb27SDimitry Andric template <class T> 28*06c3fb27SDimitry Andric struct is_execution_policy; 29*06c3fb27SDimitry Andric 30*06c3fb27SDimitry Andric template <class T> 31*06c3fb27SDimitry Andric inline constexpr bool is_execution_policy_v; 32*06c3fb27SDimitry Andric} 33*06c3fb27SDimitry Andric*/ 34*06c3fb27SDimitry Andric 3581ad6265SDimitry Andric#include <__assert> // all public C++ headers provide the assertion handler 36e40139ffSDimitry Andric#include <__config> 37*06c3fb27SDimitry Andric#include <__type_traits/is_execution_policy.h> 38*06c3fb27SDimitry Andric#include <__type_traits/is_same.h> 39*06c3fb27SDimitry Andric#include <__type_traits/remove_cvref.h> 4004eeddc0SDimitry Andric#include <version> 41e40139ffSDimitry Andric 420eae32dcSDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 430eae32dcSDimitry Andric# pragma GCC system_header 440eae32dcSDimitry Andric#endif 450eae32dcSDimitry Andric 46*06c3fb27SDimitry Andric#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 47*06c3fb27SDimitry Andric 48*06c3fb27SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD 49*06c3fb27SDimitry Andric 50*06c3fb27SDimitry Andricnamespace execution { 51*06c3fb27SDimitry Andricstruct sequenced_policy { 52*06c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr explicit sequenced_policy(__disable_user_instantiations_tag) {} 53*06c3fb27SDimitry Andric sequenced_policy(const sequenced_policy&) = delete; 54*06c3fb27SDimitry Andric sequenced_policy& operator=(const sequenced_policy&) = delete; 55*06c3fb27SDimitry Andric}; 56*06c3fb27SDimitry Andric 57*06c3fb27SDimitry Andricinline constexpr sequenced_policy seq{__disable_user_instantiations_tag{}}; 58*06c3fb27SDimitry Andric 59*06c3fb27SDimitry Andricstruct parallel_policy { 60*06c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr explicit parallel_policy(__disable_user_instantiations_tag) {} 61*06c3fb27SDimitry Andric parallel_policy(const parallel_policy&) = delete; 62*06c3fb27SDimitry Andric parallel_policy& operator=(const parallel_policy&) = delete; 63*06c3fb27SDimitry Andric}; 64*06c3fb27SDimitry Andric 65*06c3fb27SDimitry Andricinline constexpr parallel_policy par{__disable_user_instantiations_tag{}}; 66*06c3fb27SDimitry Andric 67*06c3fb27SDimitry Andricstruct parallel_unsequenced_policy { 68*06c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr explicit parallel_unsequenced_policy(__disable_user_instantiations_tag) {} 69*06c3fb27SDimitry Andric parallel_unsequenced_policy(const parallel_unsequenced_policy&) = delete; 70*06c3fb27SDimitry Andric parallel_unsequenced_policy& operator=(const parallel_unsequenced_policy&) = delete; 71*06c3fb27SDimitry Andric}; 72*06c3fb27SDimitry Andric 73*06c3fb27SDimitry Andricinline constexpr parallel_unsequenced_policy par_unseq{__disable_user_instantiations_tag{}}; 74*06c3fb27SDimitry Andric 75*06c3fb27SDimitry Andricstruct __unsequenced_policy { 76*06c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr explicit __unsequenced_policy(__disable_user_instantiations_tag) {} 77*06c3fb27SDimitry Andric __unsequenced_policy(const __unsequenced_policy&) = delete; 78*06c3fb27SDimitry Andric __unsequenced_policy& operator=(const __unsequenced_policy&) = delete; 79*06c3fb27SDimitry Andric}; 80*06c3fb27SDimitry Andric 81*06c3fb27SDimitry Andricconstexpr __unsequenced_policy __unseq{__disable_user_instantiations_tag{}}; 82*06c3fb27SDimitry Andric 83*06c3fb27SDimitry Andric# if _LIBCPP_STD_VER >= 20 84*06c3fb27SDimitry Andric 85*06c3fb27SDimitry Andricstruct unsequenced_policy { 86*06c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr explicit unsequenced_policy(__disable_user_instantiations_tag) {} 87*06c3fb27SDimitry Andric unsequenced_policy(const unsequenced_policy&) = delete; 88*06c3fb27SDimitry Andric unsequenced_policy& operator=(const unsequenced_policy&) = delete; 89*06c3fb27SDimitry Andric}; 90*06c3fb27SDimitry Andric 91*06c3fb27SDimitry Andricinline constexpr unsequenced_policy unseq{__disable_user_instantiations_tag{}}; 92*06c3fb27SDimitry Andric 93*06c3fb27SDimitry Andric# endif // _LIBCPP_STD_VER >= 20 94*06c3fb27SDimitry Andric 95*06c3fb27SDimitry Andric} // namespace execution 96*06c3fb27SDimitry Andric 97*06c3fb27SDimitry Andrictemplate <> 98*06c3fb27SDimitry Andricinline constexpr bool is_execution_policy_v<execution::sequenced_policy> = true; 99*06c3fb27SDimitry Andric 100*06c3fb27SDimitry Andrictemplate <> 101*06c3fb27SDimitry Andricinline constexpr bool is_execution_policy_v<execution::parallel_policy> = true; 102*06c3fb27SDimitry Andric 103*06c3fb27SDimitry Andrictemplate <> 104*06c3fb27SDimitry Andricinline constexpr bool is_execution_policy_v<execution::parallel_unsequenced_policy> = true; 105*06c3fb27SDimitry Andric 106*06c3fb27SDimitry Andrictemplate <> 107*06c3fb27SDimitry Andricinline constexpr bool is_execution_policy_v<execution::__unsequenced_policy> = true; 108*06c3fb27SDimitry Andric 109*06c3fb27SDimitry Andrictemplate <> 110*06c3fb27SDimitry Andricinline constexpr bool __is_parallel_execution_policy_impl<execution::parallel_policy> = true; 111*06c3fb27SDimitry Andric 112*06c3fb27SDimitry Andrictemplate <> 113*06c3fb27SDimitry Andricinline constexpr bool __is_parallel_execution_policy_impl<execution::parallel_unsequenced_policy> = true; 114*06c3fb27SDimitry Andric 115*06c3fb27SDimitry Andrictemplate <> 116*06c3fb27SDimitry Andricinline constexpr bool __is_unsequenced_execution_policy_impl<execution::__unsequenced_policy> = true; 117*06c3fb27SDimitry Andric 118*06c3fb27SDimitry Andrictemplate <> 119*06c3fb27SDimitry Andricinline constexpr bool __is_unsequenced_execution_policy_impl<execution::parallel_unsequenced_policy> = true; 120*06c3fb27SDimitry Andric 121*06c3fb27SDimitry Andric# if _LIBCPP_STD_VER >= 20 122*06c3fb27SDimitry Andrictemplate <> 123*06c3fb27SDimitry Andricinline constexpr bool is_execution_policy_v<execution::unsequenced_policy> = true; 124*06c3fb27SDimitry Andric 125*06c3fb27SDimitry Andrictemplate <> 126*06c3fb27SDimitry Andricinline constexpr bool __is_unsequenced_execution_policy_impl<execution::unsequenced_policy> = true; 127*06c3fb27SDimitry Andric 128*06c3fb27SDimitry Andric# endif 129*06c3fb27SDimitry Andric 130*06c3fb27SDimitry Andrictemplate <class _Tp> 131*06c3fb27SDimitry Andricstruct is_execution_policy : bool_constant<is_execution_policy_v<_Tp>> {}; 132*06c3fb27SDimitry Andric 133*06c3fb27SDimitry Andrictemplate <class _ExecutionPolicy> 134*06c3fb27SDimitry Andric_LIBCPP_HIDE_FROM_ABI auto __remove_parallel_policy(const _ExecutionPolicy&) { 135*06c3fb27SDimitry Andric if constexpr (is_same_v<_ExecutionPolicy, execution::parallel_policy>) { 136*06c3fb27SDimitry Andric return execution::sequenced_policy(execution::__disable_user_instantiations_tag{}); 137*06c3fb27SDimitry Andric } else if constexpr (is_same_v<_ExecutionPolicy, execution::parallel_unsequenced_policy>) { 138*06c3fb27SDimitry Andric return execution::__unsequenced_policy{execution::__disable_user_instantiations_tag{}}; 139*06c3fb27SDimitry Andric } 140*06c3fb27SDimitry Andric} 141*06c3fb27SDimitry Andric 142*06c3fb27SDimitry Andric_LIBCPP_END_NAMESPACE_STD 143*06c3fb27SDimitry Andric 144*06c3fb27SDimitry Andric#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 145*06c3fb27SDimitry Andric 146e40139ffSDimitry Andric#endif // _LIBCPP_EXECUTION 147