xref: /openbmc/sdbusplus/include/sdbusplus/async/stdexec/__detail/__execution_legacy.hpp (revision 10d0b4b7d1498cfd5c3d37edea271a54d1984e41)
1*10d0b4b7SPatrick Williams /*
2*10d0b4b7SPatrick Williams  * Copyright (c) 2025 Lucian Radu Teodorescu
3*10d0b4b7SPatrick Williams  *
4*10d0b4b7SPatrick Williams  * Licensed under the Apache License Version 2.0 with LLVM Exceptions
5*10d0b4b7SPatrick Williams  * (the "License"); you may not use this file except in compliance with
6*10d0b4b7SPatrick Williams  * the License. You may obtain a copy of the License at
7*10d0b4b7SPatrick Williams  *
8*10d0b4b7SPatrick Williams  *   https://llvm.org/LICENSE.txt
9*10d0b4b7SPatrick Williams  *
10*10d0b4b7SPatrick Williams  * Unless required by applicable law or agreed to in writing, software
11*10d0b4b7SPatrick Williams  * distributed under the License is distributed on an "AS IS" BASIS,
12*10d0b4b7SPatrick Williams  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*10d0b4b7SPatrick Williams  * See the License for the specific language governing permissions and
14*10d0b4b7SPatrick Williams  * limitations under the License.
15*10d0b4b7SPatrick Williams  */
16*10d0b4b7SPatrick Williams #pragma once
17*10d0b4b7SPatrick Williams 
18*10d0b4b7SPatrick Williams #include "__config.hpp"
19*10d0b4b7SPatrick Williams 
20*10d0b4b7SPatrick Williams #if STDEXEC_HAS_EXECUTION_POLICY()
21*10d0b4b7SPatrick Williams #  include <execution>
22*10d0b4b7SPatrick Williams #endif
23*10d0b4b7SPatrick Williams 
24*10d0b4b7SPatrick Williams namespace stdexec {
25*10d0b4b7SPatrick Williams 
26*10d0b4b7SPatrick Williams #if STDEXEC_HAS_EXECUTION_POLICY()
27*10d0b4b7SPatrick Williams 
28*10d0b4b7SPatrick Williams   using sequenced_policy = std::execution::sequenced_policy;
29*10d0b4b7SPatrick Williams   using parallel_policy = std::execution::parallel_policy;
30*10d0b4b7SPatrick Williams   using parallel_unsequenced_policy = std::execution::parallel_unsequenced_policy;
31*10d0b4b7SPatrick Williams 
32*10d0b4b7SPatrick Williams   constexpr auto seq = std::execution::seq;
33*10d0b4b7SPatrick Williams   constexpr auto par = std::execution::par;
34*10d0b4b7SPatrick Williams   constexpr auto par_unseq = std::execution::par_unseq;
35*10d0b4b7SPatrick Williams 
36*10d0b4b7SPatrick Williams   using std::is_execution_policy_v;
37*10d0b4b7SPatrick Williams   using std::is_execution_policy;
38*10d0b4b7SPatrick Williams 
39*10d0b4b7SPatrick Williams #else
40*10d0b4b7SPatrick Williams 
41*10d0b4b7SPatrick Williams   struct __hidden_construction { };
42*10d0b4b7SPatrick Williams 
43*10d0b4b7SPatrick Williams   struct sequenced_policy {
44*10d0b4b7SPatrick Williams     constexpr explicit sequenced_policy(__hidden_construction) { };
45*10d0b4b7SPatrick Williams     sequenced_policy(const sequenced_policy&) = delete;
46*10d0b4b7SPatrick Williams     sequenced_policy& operator=(const sequenced_policy&) = delete;
47*10d0b4b7SPatrick Williams   };
48*10d0b4b7SPatrick Williams 
49*10d0b4b7SPatrick Williams   struct parallel_policy {
50*10d0b4b7SPatrick Williams     constexpr explicit parallel_policy(__hidden_construction) { };
51*10d0b4b7SPatrick Williams     parallel_policy(const parallel_policy&) = delete;
52*10d0b4b7SPatrick Williams     parallel_policy& operator=(const parallel_policy&) = delete;
53*10d0b4b7SPatrick Williams   };
54*10d0b4b7SPatrick Williams 
55*10d0b4b7SPatrick Williams   struct parallel_unsequenced_policy {
56*10d0b4b7SPatrick Williams     constexpr explicit parallel_unsequenced_policy(__hidden_construction) { };
57*10d0b4b7SPatrick Williams     parallel_unsequenced_policy(const parallel_unsequenced_policy&) = delete;
58*10d0b4b7SPatrick Williams     parallel_unsequenced_policy& operator=(const parallel_unsequenced_policy&) = delete;
59*10d0b4b7SPatrick Williams   };
60*10d0b4b7SPatrick Williams 
61*10d0b4b7SPatrick Williams   inline constexpr sequenced_policy seq{__hidden_construction{}};
62*10d0b4b7SPatrick Williams   inline constexpr parallel_policy par{__hidden_construction{}};
63*10d0b4b7SPatrick Williams   inline constexpr parallel_unsequenced_policy par_unseq{__hidden_construction{}};
64*10d0b4b7SPatrick Williams 
65*10d0b4b7SPatrick Williams   template <typename>
66*10d0b4b7SPatrick Williams   inline constexpr bool is_execution_policy_v = false;
67*10d0b4b7SPatrick Williams 
68*10d0b4b7SPatrick Williams   template <>
69*10d0b4b7SPatrick Williams   inline constexpr bool is_execution_policy_v<sequenced_policy> = true;
70*10d0b4b7SPatrick Williams 
71*10d0b4b7SPatrick Williams   template <>
72*10d0b4b7SPatrick Williams   inline constexpr bool is_execution_policy_v<parallel_policy> = true;
73*10d0b4b7SPatrick Williams 
74*10d0b4b7SPatrick Williams   template <>
75*10d0b4b7SPatrick Williams   inline constexpr bool is_execution_policy_v<parallel_unsequenced_policy> = true;
76*10d0b4b7SPatrick Williams 
77*10d0b4b7SPatrick Williams   template <class _T>
78*10d0b4b7SPatrick Williams   struct is_execution_policy : std::bool_constant<is_execution_policy_v<_T>> { };
79*10d0b4b7SPatrick Williams 
80*10d0b4b7SPatrick Williams #endif
81*10d0b4b7SPatrick Williams 
82*10d0b4b7SPatrick Williams #if STDEXEC_HAS_UNSEQUENCED_EXECUTION_POLICY()
83*10d0b4b7SPatrick Williams 
84*10d0b4b7SPatrick Williams   using unsequenced_policy = std::execution::unsequenced_policy;
85*10d0b4b7SPatrick Williams 
86*10d0b4b7SPatrick Williams   constexpr auto unseq = std::execution::unseq;
87*10d0b4b7SPatrick Williams 
88*10d0b4b7SPatrick Williams #else
89*10d0b4b7SPatrick Williams 
90*10d0b4b7SPatrick Williams #  if STDEXEC_HAS_EXECUTION_POLICY()
91*10d0b4b7SPatrick Williams   // already defined above
92*10d0b4b7SPatrick Williams   struct __hidden_construction { };
93*10d0b4b7SPatrick Williams #  endif
94*10d0b4b7SPatrick Williams 
95*10d0b4b7SPatrick Williams   struct unsequenced_policy {
unsequenced_policystdexec::unsequenced_policy96*10d0b4b7SPatrick Williams     constexpr explicit unsequenced_policy(__hidden_construction) { };
97*10d0b4b7SPatrick Williams     unsequenced_policy(const unsequenced_policy&) = delete;
98*10d0b4b7SPatrick Williams     unsequenced_policy& operator=(const unsequenced_policy&) = delete;
99*10d0b4b7SPatrick Williams   };
100*10d0b4b7SPatrick Williams 
101*10d0b4b7SPatrick Williams   inline constexpr unsequenced_policy unseq{__hidden_construction{}};
102*10d0b4b7SPatrick Williams 
103*10d0b4b7SPatrick Williams   template <>
104*10d0b4b7SPatrick Williams   inline constexpr bool is_execution_policy_v<unsequenced_policy> = true;
105*10d0b4b7SPatrick Williams 
106*10d0b4b7SPatrick Williams #endif
107*10d0b4b7SPatrick Williams 
108*10d0b4b7SPatrick Williams } // namespace stdexec