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