Skip to content

Commit 9b1c8df

Browse files
committed
Better detection of execution policies.
1 parent 6c1f415 commit 9b1c8df

2 files changed

Lines changed: 34 additions & 11 deletions

File tree

include/stdexec/__detail/__config.hpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,12 +420,18 @@ namespace stdexec {
420420
# define STDEXEC_HAS_STD_MEMORY_RESOURCE() 0
421421
#endif
422422

423-
#if STDEXEC_HAS_FEATURE(__cpp_lib_execution)
423+
#if defined(__cpp_lib_execution) && __cpp_lib_execution >= 201603L
424424
# define STDEXEC_HAS_EXECUTION_POLICY() 1
425425
#else
426426
# define STDEXEC_HAS_EXECUTION_POLICY() 0
427427
#endif
428428

429+
#if defined(__cpp_lib_execution) && __cpp_lib_execution >= 201902L
430+
# define STDEXEC_HAS_UNSEQUENCED_EXECUTION_POLICY() 1
431+
#else
432+
# define STDEXEC_HAS_UNSEQUENCED_EXECUTION_POLICY() 0
433+
#endif
434+
429435
#ifdef STDEXEC_ASSERT
430436
# error "Redefinition of STDEXEC_ASSERT is not permitted. Define STDEXEC_ASSERT_FN instead."
431437
#endif

include/stdexec/__detail/__execution_legacy.hpp

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -56,16 +56,9 @@ namespace stdexec {
5656
parallel_unsequenced_policy& operator=(const parallel_unsequenced_policy&) = delete;
5757
};
5858

59-
struct unsequenced_policy {
60-
constexpr explicit unsequenced_policy(__hidden_construction) { };
61-
unsequenced_policy(const unsequenced_policy&) = delete;
62-
unsequenced_policy& operator=(const unsequenced_policy&) = delete;
63-
};
64-
6559
inline constexpr sequenced_policy seq{__hidden_construction{}};
6660
inline constexpr parallel_policy par{__hidden_construction{}};
6761
inline constexpr parallel_unsequenced_policy par_unseq{__hidden_construction{}};
68-
inline constexpr unsequenced_policy unseq{__hidden_construction{}};
6962

7063
template <typename>
7164
inline constexpr bool is_execution_policy_v = false;
@@ -79,11 +72,35 @@ namespace stdexec {
7972
template <>
8073
inline constexpr bool is_execution_policy_v<parallel_unsequenced_policy> = true;
8174

82-
template <>
83-
inline constexpr bool is_execution_policy_v<unsequenced_policy> = true;
84-
8575
template <class _T>
8676
struct is_execution_policy : std::bool_constant<is_execution_policy_v<_T>> { };
8777

8878
#endif
79+
80+
#if STDEXEC_HAS_UNSEQUENCED_EXECUTION_POLICY()
81+
82+
using unsequenced_policy = std::execution::unsequenced_policy;
83+
84+
using unseq = std::execution::unseq;
85+
86+
#else
87+
88+
#if STDEXEC_HAS_EXECUTION_POLICY()
89+
// already defined above
90+
struct __hidden_construction { };
91+
#endif
92+
93+
struct unsequenced_policy {
94+
constexpr explicit unsequenced_policy(__hidden_construction) { };
95+
unsequenced_policy(const unsequenced_policy&) = delete;
96+
unsequenced_policy& operator=(const unsequenced_policy&) = delete;
97+
};
98+
99+
inline constexpr unsequenced_policy unseq{__hidden_construction{}};
100+
101+
template <>
102+
inline constexpr bool is_execution_policy_v<unsequenced_policy> = true;
103+
104+
#endif
105+
89106
} // namespace stdexec

0 commit comments

Comments
 (0)