|
33 | 33 |
|
34 | 34 | #define STDEXEC_EXPAND(...) __VA_ARGS__
|
35 | 35 | #define STDEXEC_EVAL(_MACRO, ...) _MACRO(__VA_ARGS__)
|
| 36 | +#define STDEXEC_EAT(...) |
36 | 37 |
|
37 | 38 | #define STDEXEC_NOT(_XP) STDEXEC_CAT(STDEXEC_NOT_, _XP)
|
38 | 39 | #define STDEXEC_NOT_0 1
|
|
50 | 51 | #define STDEXEC_CHECK_N(_XP, _NP, ...) _NP
|
51 | 52 | #define STDEXEC_PROBE(_XP) _XP, 1,
|
52 | 53 |
|
| 54 | +// If tail is non-empty, expand to the tail. Otherwise, expand to the head |
| 55 | +#define STDEXEC_HEAD_OR_TAIL(_XP, ...) STDEXEC_EXPAND __VA_OPT__((__VA_ARGS__)STDEXEC_EAT)(_XP) |
| 56 | + |
| 57 | +// If tail is non-empty, expand to nothing. Otherwise, expand to the head |
| 58 | +#define STDEXEC_HEAD_OR_NULL(_XP, ...) STDEXEC_EXPAND __VA_OPT__(()STDEXEC_EAT)(_XP) |
| 59 | + |
| 60 | +// When used with no arguments, these macros expand to 1 if the current |
| 61 | +// compiler corresponds to the macro name; 0, otherwise. When used with arguments, |
| 62 | +// they expand to the arguments if if the current compiler corresponds to the |
| 63 | +// macro name; nothing, otherwise. |
53 | 64 | #if defined(__NVCC__)
|
54 |
| -#define STDEXEC_NVCC() 1 |
| 65 | +#define STDEXEC_NVCC(...) STDEXEC_HEAD_OR_TAIL(1, __VA_ARGS__) |
55 | 66 | #elif defined(__NVCOMPILER)
|
56 |
| -#define STDEXEC_NVHPC() 1 |
| 67 | +#define STDEXEC_NVHPC(...) STDEXEC_HEAD_OR_TAIL(1, __VA_ARGS__) |
57 | 68 | #elif defined(__EDG__)
|
58 |
| -#define LEGATE_EDG() 1 |
| 69 | +#define STDEXEC_EDG(...) STDEXEC_HEAD_OR_TAIL(1, __VA_ARGS__) |
59 | 70 | #elif defined(__clang__)
|
60 |
| -#define STDEXEC_CLANG() 1 |
| 71 | +#define STDEXEC_CLANG(...) STDEXEC_HEAD_OR_TAIL(1, __VA_ARGS__) |
| 72 | +#if defined(_MSC_VER) |
| 73 | +#define STDEXEC_CLANG_CL(...) STDEXEC_HEAD_OR_TAIL(1, __VA_ARGS__) |
| 74 | +#endif |
61 | 75 | #elif defined(__GNUC__)
|
62 |
| -#define STDEXEC_GCC() 1 |
| 76 | +#define STDEXEC_GCC(...) STDEXEC_HEAD_OR_TAIL(1, __VA_ARGS__) |
63 | 77 | #elif defined(_MSC_VER)
|
64 |
| -#define STDEXEC_MSVC() 1 |
| 78 | +#define STDEXEC_MSVC(...) STDEXEC_HEAD_OR_TAIL(1, __VA_ARGS__) |
65 | 79 | #endif
|
66 | 80 |
|
67 | 81 | #ifndef STDEXEC_NVCC
|
68 |
| -#define STDEXEC_NVCC() 0 |
| 82 | +#define STDEXEC_NVCC(...) STDEXEC_HEAD_OR_NULL(0, __VA_ARGS__) |
69 | 83 | #endif
|
70 | 84 | #ifndef STDEXEC_NVHPC
|
71 |
| -#define STDEXEC_NVHPC() 0 |
| 85 | +#define STDEXEC_NVHPC(...) STDEXEC_HEAD_OR_NULL(0, __VA_ARGS__) |
72 | 86 | #endif
|
73 | 87 | #ifndef STDEXEC_EDG
|
74 |
| -#define STDEXEC_EDG() 0 |
| 88 | +#define STDEXEC_EDG(...) STDEXEC_HEAD_OR_NULL(0, __VA_ARGS__) |
75 | 89 | #endif
|
76 | 90 | #ifndef STDEXEC_CLANG
|
77 |
| -#define STDEXEC_CLANG() 0 |
| 91 | +#define STDEXEC_CLANG(...) STDEXEC_HEAD_OR_NULL(0, __VA_ARGS__) |
| 92 | +#endif |
| 93 | +#ifndef STDEXEC_CLANG_CL |
| 94 | +#define STDEXEC_CLANG_CL(...) STDEXEC_HEAD_OR_NULL(0, __VA_ARGS__) |
78 | 95 | #endif
|
79 | 96 | #ifndef STDEXEC_GCC
|
80 |
| -#define STDEXEC_GCC() 0 |
| 97 | +#define STDEXEC_GCC(...) STDEXEC_HEAD_OR_NULL(0, __VA_ARGS__) |
81 | 98 | #endif
|
82 | 99 | #ifndef STDEXEC_MSVC
|
83 |
| -#define STDEXEC_MSVC() 0 |
| 100 | +#define STDEXEC_MSVC(...) STDEXEC_HEAD_OR_NULL(0, __VA_ARGS__) |
84 | 101 | #endif
|
85 | 102 |
|
86 | 103 | #define STDEXEC_STRINGIZE(_ARG) #_ARG
|
|
0 commit comments