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 35e40139ffSDimitry Andric#include <__config> 36*06c3fb27SDimitry Andric#include <__type_traits/is_execution_policy.h> 37*06c3fb27SDimitry Andric#include <__type_traits/is_same.h> 38*06c3fb27SDimitry Andric#include <__type_traits/remove_cvref.h> 3904eeddc0SDimitry Andric#include <version> 40e40139ffSDimitry Andric 410eae32dcSDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 420eae32dcSDimitry Andric# pragma GCC system_header 430eae32dcSDimitry Andric#endif 440eae32dcSDimitry Andric 45*06c3fb27SDimitry Andric#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 46*06c3fb27SDimitry Andric 47*06c3fb27SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD 48*06c3fb27SDimitry Andric 49*06c3fb27SDimitry Andricnamespace execution { 50*06c3fb27SDimitry Andricstruct sequenced_policy { 51*06c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr explicit sequenced_policy(__disable_user_instantiations_tag) {} 52*06c3fb27SDimitry Andric sequenced_policy(const sequenced_policy&) = delete; 53*06c3fb27SDimitry Andric sequenced_policy& operator=(const sequenced_policy&) = delete; 54*06c3fb27SDimitry Andric}; 55*06c3fb27SDimitry Andric 56*06c3fb27SDimitry Andricinline constexpr sequenced_policy seq{__disable_user_instantiations_tag{}}; 57*06c3fb27SDimitry Andric 58*06c3fb27SDimitry Andricstruct parallel_policy { 59*06c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr explicit parallel_policy(__disable_user_instantiations_tag) {} 60*06c3fb27SDimitry Andric parallel_policy(const parallel_policy&) = delete; 61*06c3fb27SDimitry Andric parallel_policy& operator=(const parallel_policy&) = delete; 62*06c3fb27SDimitry Andric}; 63*06c3fb27SDimitry Andric 64*06c3fb27SDimitry Andricinline constexpr parallel_policy par{__disable_user_instantiations_tag{}}; 65*06c3fb27SDimitry Andric 66*06c3fb27SDimitry Andricstruct parallel_unsequenced_policy { 67*06c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr explicit parallel_unsequenced_policy(__disable_user_instantiations_tag) {} 68*06c3fb27SDimitry Andric parallel_unsequenced_policy(const parallel_unsequenced_policy&) = delete; 69*06c3fb27SDimitry Andric parallel_unsequenced_policy& operator=(const parallel_unsequenced_policy&) = delete; 70*06c3fb27SDimitry Andric}; 71*06c3fb27SDimitry Andric 72*06c3fb27SDimitry Andricinline constexpr parallel_unsequenced_policy par_unseq{__disable_user_instantiations_tag{}}; 73*06c3fb27SDimitry Andric 74*06c3fb27SDimitry Andricstruct __unsequenced_policy { 75*06c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr explicit __unsequenced_policy(__disable_user_instantiations_tag) {} 76*06c3fb27SDimitry Andric __unsequenced_policy(const __unsequenced_policy&) = delete; 77*06c3fb27SDimitry Andric __unsequenced_policy& operator=(const __unsequenced_policy&) = delete; 78*06c3fb27SDimitry Andric}; 79*06c3fb27SDimitry Andric 80*06c3fb27SDimitry Andricconstexpr __unsequenced_policy __unseq{__disable_user_instantiations_tag{}}; 81*06c3fb27SDimitry Andric 82*06c3fb27SDimitry Andric# if _LIBCPP_STD_VER >= 20 83*06c3fb27SDimitry Andric 84*06c3fb27SDimitry Andricstruct unsequenced_policy { 85*06c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr explicit unsequenced_policy(__disable_user_instantiations_tag) {} 86*06c3fb27SDimitry Andric unsequenced_policy(const unsequenced_policy&) = delete; 87*06c3fb27SDimitry Andric unsequenced_policy& operator=(const unsequenced_policy&) = delete; 88*06c3fb27SDimitry Andric}; 89*06c3fb27SDimitry Andric 90*06c3fb27SDimitry Andricinline constexpr unsequenced_policy unseq{__disable_user_instantiations_tag{}}; 91*06c3fb27SDimitry Andric 92*06c3fb27SDimitry Andric# endif // _LIBCPP_STD_VER >= 20 93*06c3fb27SDimitry Andric 94*06c3fb27SDimitry Andric} // namespace execution 95*06c3fb27SDimitry Andric 96*06c3fb27SDimitry Andrictemplate <> 97*06c3fb27SDimitry Andricinline constexpr bool is_execution_policy_v<execution::sequenced_policy> = true; 98*06c3fb27SDimitry Andric 99*06c3fb27SDimitry Andrictemplate <> 100*06c3fb27SDimitry Andricinline constexpr bool is_execution_policy_v<execution::parallel_policy> = true; 101*06c3fb27SDimitry Andric 102*06c3fb27SDimitry Andrictemplate <> 103*06c3fb27SDimitry Andricinline constexpr bool is_execution_policy_v<execution::parallel_unsequenced_policy> = true; 104*06c3fb27SDimitry Andric 105*06c3fb27SDimitry Andrictemplate <> 106*06c3fb27SDimitry Andricinline constexpr bool is_execution_policy_v<execution::__unsequenced_policy> = true; 107*06c3fb27SDimitry Andric 108*06c3fb27SDimitry Andrictemplate <> 109*06c3fb27SDimitry Andricinline constexpr bool __is_parallel_execution_policy_impl<execution::parallel_policy> = true; 110*06c3fb27SDimitry Andric 111*06c3fb27SDimitry Andrictemplate <> 112*06c3fb27SDimitry Andricinline constexpr bool __is_parallel_execution_policy_impl<execution::parallel_unsequenced_policy> = true; 113*06c3fb27SDimitry Andric 114*06c3fb27SDimitry Andrictemplate <> 115*06c3fb27SDimitry Andricinline constexpr bool __is_unsequenced_execution_policy_impl<execution::__unsequenced_policy> = true; 116*06c3fb27SDimitry Andric 117*06c3fb27SDimitry Andrictemplate <> 118*06c3fb27SDimitry Andricinline constexpr bool __is_unsequenced_execution_policy_impl<execution::parallel_unsequenced_policy> = true; 119*06c3fb27SDimitry Andric 120*06c3fb27SDimitry Andric# if _LIBCPP_STD_VER >= 20 121*06c3fb27SDimitry Andrictemplate <> 122*06c3fb27SDimitry Andricinline constexpr bool is_execution_policy_v<execution::unsequenced_policy> = true; 123*06c3fb27SDimitry Andric 124*06c3fb27SDimitry Andrictemplate <> 125*06c3fb27SDimitry Andricinline constexpr bool __is_unsequenced_execution_policy_impl<execution::unsequenced_policy> = true; 126*06c3fb27SDimitry Andric 127*06c3fb27SDimitry Andric# endif 128*06c3fb27SDimitry Andric 129*06c3fb27SDimitry Andrictemplate <class _Tp> 130*06c3fb27SDimitry Andricstruct is_execution_policy : bool_constant<is_execution_policy_v<_Tp>> {}; 131*06c3fb27SDimitry Andric 132*06c3fb27SDimitry Andrictemplate <class _ExecutionPolicy> 133*06c3fb27SDimitry Andric_LIBCPP_HIDE_FROM_ABI auto __remove_parallel_policy(const _ExecutionPolicy&) { 134*06c3fb27SDimitry Andric if constexpr (is_same_v<_ExecutionPolicy, execution::parallel_policy>) { 135*06c3fb27SDimitry Andric return execution::sequenced_policy(execution::__disable_user_instantiations_tag{}); 136*06c3fb27SDimitry Andric } else if constexpr (is_same_v<_ExecutionPolicy, execution::parallel_unsequenced_policy>) { 137*06c3fb27SDimitry Andric return execution::__unsequenced_policy{execution::__disable_user_instantiations_tag{}}; 138*06c3fb27SDimitry Andric } 139*06c3fb27SDimitry Andric} 140*06c3fb27SDimitry Andric 141*06c3fb27SDimitry Andric_LIBCPP_END_NAMESPACE_STD 142*06c3fb27SDimitry Andric 143*06c3fb27SDimitry Andric#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 144*06c3fb27SDimitry Andric 145e40139ffSDimitry Andric#endif // _LIBCPP_EXECUTION 146