Skip to content

Commit af2b313

Browse files
lucteoericniebler
andauthored
Better detection of execution policies. (#1559)
--------- Co-authored-by: Eric Niebler <[email protected]>
1 parent c92e78e commit af2b313

File tree

3 files changed

+48
-19
lines changed

3 files changed

+48
-19
lines changed

CMakeLists.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,7 @@ if (STDEXEC_ENABLE_TBB)
379379
include(rapids-find)
380380
rapids_find_package(
381381
TBB REQUIRED
382+
COMPONENTS tbb
382383
BUILD_EXPORT_SET stdexec-exports
383384
INSTALL_EXPORT_SET stdexec-exports
384385
)
@@ -397,10 +398,13 @@ if (STDEXEC_ENABLE_TBB)
397398
FILES ${tbbpool_headers}
398399
)
399400

401+
target_link_libraries(stdexec INTERFACE
402+
TBB::tbb
403+
)
404+
400405
target_link_libraries(tbbpool
401406
INTERFACE
402407
STDEXEC::stdexec
403-
TBB::tbb
404408
)
405409

406410
install(TARGETS tbbpool

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: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,24 @@
1717

1818
#include "__config.hpp"
1919

20+
#if STDEXEC_HAS_EXECUTION_POLICY()
21+
#include <execution>
22+
#endif
23+
2024
namespace stdexec {
2125

2226
#if STDEXEC_HAS_EXECUTION_POLICY()
2327

2428
using sequenced_policy = std::execution::sequenced_policy;
2529
using parallel_policy = std::execution::parallel_policy;
2630
using parallel_unsequenced_policy = std::execution::parallel_unsequenced_policy;
27-
using unsequenced_policy = std::execution::unsequenced_policy;
2831

29-
using seq = std::execution::seq;
30-
using par = std::execution::par;
31-
using par_unseq = std::execution::par_unseq;
32-
using unseq = std::execution::unseq;
32+
constexpr auto seq = std::execution::seq;
33+
constexpr auto par = std::execution::par;
34+
constexpr auto par_unseq = std::execution::par_unseq;
3335

34-
using std::execution::is_execution_policy_v;
35-
using std::execution::is_execution_policy;
36+
using std::is_execution_policy_v;
37+
using std::is_execution_policy;
3638

3739
#else
3840

@@ -56,16 +58,9 @@ namespace stdexec {
5658
parallel_unsequenced_policy& operator=(const parallel_unsequenced_policy&) = delete;
5759
};
5860

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-
6561
inline constexpr sequenced_policy seq{__hidden_construction{}};
6662
inline constexpr parallel_policy par{__hidden_construction{}};
6763
inline constexpr parallel_unsequenced_policy par_unseq{__hidden_construction{}};
68-
inline constexpr unsequenced_policy unseq{__hidden_construction{}};
6964

7065
template <typename>
7166
inline constexpr bool is_execution_policy_v = false;
@@ -79,11 +74,35 @@ namespace stdexec {
7974
template <>
8075
inline constexpr bool is_execution_policy_v<parallel_unsequenced_policy> = true;
8176

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

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

0 commit comments

Comments
 (0)