xref: /llvm-project/libcxx/include/__cxx03/execution (revision ce7771902dc50d900de639d499a60486b83f70e0)
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