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 1306c3fb27SDimitry Andric/* 1406c3fb27SDimitry Andricnamespace std::execution { 1506c3fb27SDimitry Andric struct sequenced_policy; 1606c3fb27SDimitry Andric struct parallel_policy; 1706c3fb27SDimitry Andric struct parallel_unsequenced_policy; 1806c3fb27SDimitry Andric struct unsequenced_policy; // since C++20 1906c3fb27SDimitry Andric 2006c3fb27SDimitry Andric inline constexpr sequenced_policy seq = implementation-defined; 2106c3fb27SDimitry Andric inline constexpr parallel_policy par = implementation-defined; 2206c3fb27SDimitry Andric inline constexpr parallel_unsequenced_policy par_unseq = implementation-defined; 2306c3fb27SDimitry Andric inline constexpr unsequenced_policy unseq = implementation-defined; // since C++20 2406c3fb27SDimitry Andric} 2506c3fb27SDimitry Andric 2606c3fb27SDimitry Andricnamespace std { 2706c3fb27SDimitry Andric template <class T> 2806c3fb27SDimitry Andric struct is_execution_policy; 2906c3fb27SDimitry Andric 3006c3fb27SDimitry Andric template <class T> 3106c3fb27SDimitry Andric inline constexpr bool is_execution_policy_v; 3206c3fb27SDimitry Andric} 3306c3fb27SDimitry Andric*/ 3406c3fb27SDimitry Andric 35*700637cbSDimitry Andric#if __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS) 36*700637cbSDimitry Andric# include <__cxx03/__config> 37*700637cbSDimitry Andric#else 38e40139ffSDimitry Andric# include <__config> 3906c3fb27SDimitry Andric# include <__type_traits/is_execution_policy.h> 4006c3fb27SDimitry Andric# include <__type_traits/is_same.h> 4106c3fb27SDimitry Andric# include <__type_traits/remove_cvref.h> 4204eeddc0SDimitry Andric# include <version> 43e40139ffSDimitry Andric 440eae32dcSDimitry Andric# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 450eae32dcSDimitry Andric# pragma GCC system_header 460eae32dcSDimitry Andric# endif 470eae32dcSDimitry Andric 48*700637cbSDimitry Andric# if _LIBCPP_HAS_EXPERIMENTAL_PSTL && _LIBCPP_STD_VER >= 17 4906c3fb27SDimitry Andric 5006c3fb27SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD 5106c3fb27SDimitry Andric 5206c3fb27SDimitry Andricnamespace execution { 5306c3fb27SDimitry Andricstruct sequenced_policy { 5406c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr explicit sequenced_policy(__disable_user_instantiations_tag) {} 5506c3fb27SDimitry Andric sequenced_policy(const sequenced_policy&) = delete; 5606c3fb27SDimitry Andric sequenced_policy& operator=(const sequenced_policy&) = delete; 5706c3fb27SDimitry Andric}; 5806c3fb27SDimitry Andric 5906c3fb27SDimitry Andricinline constexpr sequenced_policy seq{__disable_user_instantiations_tag{}}; 6006c3fb27SDimitry Andric 6106c3fb27SDimitry Andricstruct parallel_policy { 6206c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr explicit parallel_policy(__disable_user_instantiations_tag) {} 6306c3fb27SDimitry Andric parallel_policy(const parallel_policy&) = delete; 6406c3fb27SDimitry Andric parallel_policy& operator=(const parallel_policy&) = delete; 6506c3fb27SDimitry Andric}; 6606c3fb27SDimitry Andric 6706c3fb27SDimitry Andricinline constexpr parallel_policy par{__disable_user_instantiations_tag{}}; 6806c3fb27SDimitry Andric 6906c3fb27SDimitry Andricstruct parallel_unsequenced_policy { 7006c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr explicit parallel_unsequenced_policy(__disable_user_instantiations_tag) {} 7106c3fb27SDimitry Andric parallel_unsequenced_policy(const parallel_unsequenced_policy&) = delete; 7206c3fb27SDimitry Andric parallel_unsequenced_policy& operator=(const parallel_unsequenced_policy&) = delete; 7306c3fb27SDimitry Andric}; 7406c3fb27SDimitry Andric 7506c3fb27SDimitry Andricinline constexpr parallel_unsequenced_policy par_unseq{__disable_user_instantiations_tag{}}; 7606c3fb27SDimitry Andric 7706c3fb27SDimitry Andricstruct __unsequenced_policy { 7806c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr explicit __unsequenced_policy(__disable_user_instantiations_tag) {} 7906c3fb27SDimitry Andric __unsequenced_policy(const __unsequenced_policy&) = delete; 8006c3fb27SDimitry Andric __unsequenced_policy& operator=(const __unsequenced_policy&) = delete; 8106c3fb27SDimitry Andric}; 8206c3fb27SDimitry Andric 8306c3fb27SDimitry Andricconstexpr __unsequenced_policy __unseq{__disable_user_instantiations_tag{}}; 8406c3fb27SDimitry Andric 8506c3fb27SDimitry Andric# if _LIBCPP_STD_VER >= 20 8606c3fb27SDimitry Andric 8706c3fb27SDimitry Andricstruct unsequenced_policy { 8806c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI constexpr explicit unsequenced_policy(__disable_user_instantiations_tag) {} 8906c3fb27SDimitry Andric unsequenced_policy(const unsequenced_policy&) = delete; 9006c3fb27SDimitry Andric unsequenced_policy& operator=(const unsequenced_policy&) = delete; 9106c3fb27SDimitry Andric}; 9206c3fb27SDimitry Andric 9306c3fb27SDimitry Andricinline constexpr unsequenced_policy unseq{__disable_user_instantiations_tag{}}; 9406c3fb27SDimitry Andric 9506c3fb27SDimitry Andric# endif // _LIBCPP_STD_VER >= 20 9606c3fb27SDimitry Andric 9706c3fb27SDimitry Andric} // namespace execution 9806c3fb27SDimitry Andric 99*700637cbSDimitry Andric_LIBCPP_DIAGNOSTIC_PUSH 100*700637cbSDimitry Andric# if __has_warning("-Winvalid-specialization") 101*700637cbSDimitry Andric_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Winvalid-specialization") 102*700637cbSDimitry Andric# endif 10306c3fb27SDimitry Andrictemplate <> 10406c3fb27SDimitry Andricinline constexpr bool is_execution_policy_v<execution::sequenced_policy> = true; 10506c3fb27SDimitry Andric 10606c3fb27SDimitry Andrictemplate <> 10706c3fb27SDimitry Andricinline constexpr bool is_execution_policy_v<execution::parallel_policy> = true; 10806c3fb27SDimitry Andric 10906c3fb27SDimitry Andrictemplate <> 11006c3fb27SDimitry Andricinline constexpr bool is_execution_policy_v<execution::parallel_unsequenced_policy> = true; 11106c3fb27SDimitry Andric 11206c3fb27SDimitry Andrictemplate <> 11306c3fb27SDimitry Andricinline constexpr bool is_execution_policy_v<execution::__unsequenced_policy> = true; 114*700637cbSDimitry Andric_LIBCPP_DIAGNOSTIC_POP 11506c3fb27SDimitry Andric 11606c3fb27SDimitry Andrictemplate <> 11706c3fb27SDimitry Andricinline constexpr bool __is_parallel_execution_policy_impl<execution::parallel_policy> = true; 11806c3fb27SDimitry Andric 11906c3fb27SDimitry Andrictemplate <> 12006c3fb27SDimitry Andricinline constexpr bool __is_parallel_execution_policy_impl<execution::parallel_unsequenced_policy> = true; 12106c3fb27SDimitry Andric 12206c3fb27SDimitry Andrictemplate <> 12306c3fb27SDimitry Andricinline constexpr bool __is_unsequenced_execution_policy_impl<execution::__unsequenced_policy> = true; 12406c3fb27SDimitry Andric 12506c3fb27SDimitry Andrictemplate <> 12606c3fb27SDimitry Andricinline constexpr bool __is_unsequenced_execution_policy_impl<execution::parallel_unsequenced_policy> = true; 12706c3fb27SDimitry Andric 12806c3fb27SDimitry Andric# if _LIBCPP_STD_VER >= 20 129*700637cbSDimitry Andric_LIBCPP_DIAGNOSTIC_PUSH 130*700637cbSDimitry Andric# if __has_warning("-Winvalid-specialization") 131*700637cbSDimitry Andric_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Winvalid-specialization") 132*700637cbSDimitry Andric# endif 13306c3fb27SDimitry Andrictemplate <> 13406c3fb27SDimitry Andricinline constexpr bool is_execution_policy_v<execution::unsequenced_policy> = true; 135*700637cbSDimitry Andric_LIBCPP_DIAGNOSTIC_POP 13606c3fb27SDimitry Andric 13706c3fb27SDimitry Andrictemplate <> 13806c3fb27SDimitry Andricinline constexpr bool __is_unsequenced_execution_policy_impl<execution::unsequenced_policy> = true; 13906c3fb27SDimitry Andric 14006c3fb27SDimitry Andric# endif 14106c3fb27SDimitry Andric 14206c3fb27SDimitry Andrictemplate <class _Tp> 143*700637cbSDimitry Andricstruct _LIBCPP_NO_SPECIALIZATIONS is_execution_policy : bool_constant<is_execution_policy_v<_Tp>> {}; 14406c3fb27SDimitry Andric 14506c3fb27SDimitry Andrictemplate <class _ExecutionPolicy> 14606c3fb27SDimitry Andric_LIBCPP_HIDE_FROM_ABI auto __remove_parallel_policy(const _ExecutionPolicy&) { 14706c3fb27SDimitry Andric if constexpr (is_same_v<_ExecutionPolicy, execution::parallel_policy>) { 14806c3fb27SDimitry Andric return execution::sequenced_policy(execution::__disable_user_instantiations_tag{}); 14906c3fb27SDimitry Andric } else if constexpr (is_same_v<_ExecutionPolicy, execution::parallel_unsequenced_policy>) { 15006c3fb27SDimitry Andric return execution::__unsequenced_policy{execution::__disable_user_instantiations_tag{}}; 15106c3fb27SDimitry Andric } 15206c3fb27SDimitry Andric} 15306c3fb27SDimitry Andric 15406c3fb27SDimitry Andric_LIBCPP_END_NAMESPACE_STD 15506c3fb27SDimitry Andric 156*700637cbSDimitry Andric# endif // _LIBCPP_HAS_EXPERIMENTAL_PSTL && _LIBCPP_STD_VER >= 17 15706c3fb27SDimitry Andric 1583ac42330SDimitry Andric# if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 1593ac42330SDimitry Andric# include <cstddef> 1603ac42330SDimitry Andric# endif 161*700637cbSDimitry Andric#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS) 1623ac42330SDimitry Andric 163e40139ffSDimitry Andric#endif // _LIBCPP_EXECUTION 164