xref: /llvm-project/libcxx/include/execution (revision 24e70e3930724ce499ad05d669bfbc4423c542e0)
10a06eb91SLouis Dionne// -*- C++ -*-
2eb8650a7SLouis Dionne//===----------------------------------------------------------------------===//
30a06eb91SLouis Dionne//
40a06eb91SLouis Dionne// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
50a06eb91SLouis Dionne// See https://llvm.org/LICENSE.txt for license information.
60a06eb91SLouis Dionne// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
70a06eb91SLouis Dionne//
80a06eb91SLouis Dionne//===----------------------------------------------------------------------===//
90a06eb91SLouis Dionne
100a06eb91SLouis Dionne#ifndef _LIBCPP_EXECUTION
110a06eb91SLouis Dionne#define _LIBCPP_EXECUTION
120a06eb91SLouis Dionne
13ebc05b93SNikolas Klauser/*
14ebc05b93SNikolas Klausernamespace std::execution {
15ebc05b93SNikolas Klauser  struct sequenced_policy;
16ebc05b93SNikolas Klauser  struct parallel_policy;
17ebc05b93SNikolas Klauser  struct parallel_unsequenced_policy;
18ebc05b93SNikolas Klauser  struct unsequenced_policy; // since C++20
19ebc05b93SNikolas Klauser
20ebc05b93SNikolas Klauser  inline constexpr sequenced_policy seq = implementation-defined;
21ebc05b93SNikolas Klauser  inline constexpr parallel_policy par = implementation-defined;
22ebc05b93SNikolas Klauser  inline constexpr parallel_unsequenced_policy par_unseq = implementation-defined;
23ebc05b93SNikolas Klauser  inline constexpr unsequenced_policy unseq = implementation-defined; // since C++20
24ebc05b93SNikolas Klauser}
25ebc05b93SNikolas Klauser
26ebc05b93SNikolas Klausernamespace std {
27ebc05b93SNikolas Klauser  template <class T>
28ebc05b93SNikolas Klauser  struct is_execution_policy;
29ebc05b93SNikolas Klauser
30ebc05b93SNikolas Klauser  template <class T>
31ebc05b93SNikolas Klauser  inline constexpr bool is_execution_policy_v;
32ebc05b93SNikolas Klauser}
33ebc05b93SNikolas Klauser*/
34ebc05b93SNikolas Klauser
35b9a2658aSNikolas Klauser#if __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
36b9a2658aSNikolas Klauser#  include <__cxx03/execution>
37b9a2658aSNikolas Klauser#else
380a06eb91SLouis Dionne#  include <__config>
398af259e8SNikolas Klauser#  include <__type_traits/is_execution_policy.h>
408af259e8SNikolas Klauser#  include <__type_traits/is_same.h>
418af259e8SNikolas Klauser#  include <__type_traits/remove_cvref.h>
42bd6e6846SMark de Wever#  include <version>
430a06eb91SLouis Dionne
44413c3c4fSArthur O'Dwyer#  if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
45413c3c4fSArthur O'Dwyer#    pragma GCC system_header
46413c3c4fSArthur O'Dwyer#  endif
47413c3c4fSArthur O'Dwyer
48*24e70e39SNikolas Klauser#  if _LIBCPP_HAS_EXPERIMENTAL_PSTL && _LIBCPP_STD_VER >= 17
49ebc05b93SNikolas Klauser
50ebc05b93SNikolas Klauser_LIBCPP_BEGIN_NAMESPACE_STD
51ebc05b93SNikolas Klauser
52ebc05b93SNikolas Klausernamespace execution {
53ebc05b93SNikolas Klauserstruct sequenced_policy {
54819d1e86SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI constexpr explicit sequenced_policy(__disable_user_instantiations_tag) {}
55ebc05b93SNikolas Klauser  sequenced_policy(const sequenced_policy&)            = delete;
56ebc05b93SNikolas Klauser  sequenced_policy& operator=(const sequenced_policy&) = delete;
57ebc05b93SNikolas Klauser};
58ebc05b93SNikolas Klauser
59ebc05b93SNikolas Klauserinline constexpr sequenced_policy seq{__disable_user_instantiations_tag{}};
60ebc05b93SNikolas Klauser
61ebc05b93SNikolas Klauserstruct parallel_policy {
62819d1e86SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI constexpr explicit parallel_policy(__disable_user_instantiations_tag) {}
63ebc05b93SNikolas Klauser  parallel_policy(const parallel_policy&)            = delete;
64ebc05b93SNikolas Klauser  parallel_policy& operator=(const parallel_policy&) = delete;
65ebc05b93SNikolas Klauser};
66ebc05b93SNikolas Klauser
67ebc05b93SNikolas Klauserinline constexpr parallel_policy par{__disable_user_instantiations_tag{}};
68ebc05b93SNikolas Klauser
69ebc05b93SNikolas Klauserstruct parallel_unsequenced_policy {
70819d1e86SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI constexpr explicit parallel_unsequenced_policy(__disable_user_instantiations_tag) {}
71ebc05b93SNikolas Klauser  parallel_unsequenced_policy(const parallel_unsequenced_policy&)            = delete;
72ebc05b93SNikolas Klauser  parallel_unsequenced_policy& operator=(const parallel_unsequenced_policy&) = delete;
73ebc05b93SNikolas Klauser};
74ebc05b93SNikolas Klauser
75ebc05b93SNikolas Klauserinline constexpr parallel_unsequenced_policy par_unseq{__disable_user_instantiations_tag{}};
76ebc05b93SNikolas Klauser
778af259e8SNikolas Klauserstruct __unsequenced_policy {
78819d1e86SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI constexpr explicit __unsequenced_policy(__disable_user_instantiations_tag) {}
798af259e8SNikolas Klauser  __unsequenced_policy(const __unsequenced_policy&)            = delete;
808af259e8SNikolas Klauser  __unsequenced_policy& operator=(const __unsequenced_policy&) = delete;
818af259e8SNikolas Klauser};
828af259e8SNikolas Klauser
838af259e8SNikolas Klauserconstexpr __unsequenced_policy __unseq{__disable_user_instantiations_tag{}};
848af259e8SNikolas Klauser
85ebc05b93SNikolas Klauser#    if _LIBCPP_STD_VER >= 20
86ebc05b93SNikolas Klauser
87ebc05b93SNikolas Klauserstruct unsequenced_policy {
887e7bd983SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI constexpr explicit unsequenced_policy(__disable_user_instantiations_tag) {}
89ebc05b93SNikolas Klauser  unsequenced_policy(const unsequenced_policy&)            = delete;
90ebc05b93SNikolas Klauser  unsequenced_policy& operator=(const unsequenced_policy&) = delete;
91ebc05b93SNikolas Klauser};
92ebc05b93SNikolas Klauser
93ebc05b93SNikolas Klauserinline constexpr unsequenced_policy unseq{__disable_user_instantiations_tag{}};
94ebc05b93SNikolas Klauser
95ebc05b93SNikolas Klauser#    endif // _LIBCPP_STD_VER >= 20
96ebc05b93SNikolas Klauser
97ebc05b93SNikolas Klauser} // namespace execution
98ebc05b93SNikolas Klauser
996f684816SNikolas Klauser_LIBCPP_DIAGNOSTIC_PUSH
1006f684816SNikolas Klauser#    if __has_warning("-Winvalid-specialization")
1016f684816SNikolas Klauser_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Winvalid-specialization")
1026f684816SNikolas Klauser#    endif
103ebc05b93SNikolas Klausertemplate <>
104ebc05b93SNikolas Klauserinline constexpr bool is_execution_policy_v<execution::sequenced_policy> = true;
105ebc05b93SNikolas Klauser
106ebc05b93SNikolas Klausertemplate <>
107ebc05b93SNikolas Klauserinline constexpr bool is_execution_policy_v<execution::parallel_policy> = true;
108ebc05b93SNikolas Klauser
109ebc05b93SNikolas Klausertemplate <>
110ebc05b93SNikolas Klauserinline constexpr bool is_execution_policy_v<execution::parallel_unsequenced_policy> = true;
111ebc05b93SNikolas Klauser
1128af259e8SNikolas Klausertemplate <>
1138af259e8SNikolas Klauserinline constexpr bool is_execution_policy_v<execution::__unsequenced_policy> = true;
1146f684816SNikolas Klauser_LIBCPP_DIAGNOSTIC_POP
1158af259e8SNikolas Klauser
1168af259e8SNikolas Klausertemplate <>
1178af259e8SNikolas Klauserinline constexpr bool __is_parallel_execution_policy_impl<execution::parallel_policy> = true;
1188af259e8SNikolas Klauser
1198af259e8SNikolas Klausertemplate <>
1208af259e8SNikolas Klauserinline constexpr bool __is_parallel_execution_policy_impl<execution::parallel_unsequenced_policy> = true;
1218af259e8SNikolas Klauser
1228af259e8SNikolas Klausertemplate <>
1238af259e8SNikolas Klauserinline constexpr bool __is_unsequenced_execution_policy_impl<execution::__unsequenced_policy> = true;
1248af259e8SNikolas Klauser
1258af259e8SNikolas Klausertemplate <>
1268af259e8SNikolas Klauserinline constexpr bool __is_unsequenced_execution_policy_impl<execution::parallel_unsequenced_policy> = true;
1278af259e8SNikolas Klauser
128ebc05b93SNikolas Klauser#    if _LIBCPP_STD_VER >= 20
1296f684816SNikolas Klauser_LIBCPP_DIAGNOSTIC_PUSH
1306f684816SNikolas Klauser#      if __has_warning("-Winvalid-specialization")
1316f684816SNikolas Klauser_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Winvalid-specialization")
1326f684816SNikolas Klauser#      endif
133ebc05b93SNikolas Klausertemplate <>
134ebc05b93SNikolas Klauserinline constexpr bool is_execution_policy_v<execution::unsequenced_policy> = true;
1356f684816SNikolas Klauser_LIBCPP_DIAGNOSTIC_POP
1368af259e8SNikolas Klauser
1378af259e8SNikolas Klausertemplate <>
1388af259e8SNikolas Klauserinline constexpr bool __is_unsequenced_execution_policy_impl<execution::unsequenced_policy> = true;
1398af259e8SNikolas Klauser
140ebc05b93SNikolas Klauser#    endif
141ebc05b93SNikolas Klauser
142ebc05b93SNikolas Klausertemplate <class _Tp>
1436f684816SNikolas Klauserstruct _LIBCPP_NO_SPECIALIZATIONS is_execution_policy : bool_constant<is_execution_policy_v<_Tp>> {};
144ebc05b93SNikolas Klauser
1458af259e8SNikolas Klausertemplate <class _ExecutionPolicy>
1468e2d09c3SLouis Dionne_LIBCPP_HIDE_FROM_ABI auto __remove_parallel_policy(const _ExecutionPolicy&) {
1478e2d09c3SLouis Dionne  if constexpr (is_same_v<_ExecutionPolicy, execution::parallel_policy>) {
1488e2d09c3SLouis Dionne    return execution::sequenced_policy(execution::__disable_user_instantiations_tag{});
1498e2d09c3SLouis Dionne  } else if constexpr (is_same_v<_ExecutionPolicy, execution::parallel_unsequenced_policy>) {
1508e2d09c3SLouis Dionne    return execution::__unsequenced_policy{execution::__disable_user_instantiations_tag{}};
1518af259e8SNikolas Klauser  }
1528af259e8SNikolas Klauser}
1538af259e8SNikolas Klauser
154ebc05b93SNikolas Klauser_LIBCPP_END_NAMESPACE_STD
155ebc05b93SNikolas Klauser
156*24e70e39SNikolas Klauser#  endif // _LIBCPP_HAS_EXPERIMENTAL_PSTL && _LIBCPP_STD_VER >= 17
157ebc05b93SNikolas Klauser
158a10aa448SNikolas Klauser#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
159a10aa448SNikolas Klauser#    include <cstddef>
160a10aa448SNikolas Klauser#  endif
161b9a2658aSNikolas Klauser#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
162a10aa448SNikolas Klauser
1630a06eb91SLouis Dionne#endif // _LIBCPP_EXECUTION
164