- Add support for legacy CUDA versions; now compatible with CUDA 12.3 and newer - Add support for NVRTC compilation - Other fixes and code refactoring
49 lines
1.7 KiB
Plaintext
49 lines
1.7 KiB
Plaintext
#pragma once
|
|
|
|
namespace cute {
|
|
|
|
struct ignore_t {
|
|
template <typename T>
|
|
constexpr const ignore_t& operator=(T&&) const noexcept {
|
|
return *this;
|
|
}
|
|
};
|
|
|
|
inline constexpr ignore_t ignore{};
|
|
|
|
} // namespace cute
|
|
|
|
#define CUTE_TIE_CONCAT_IMPL(A, B) A##B
|
|
#define CUTE_TIE_CONCAT(A, B) CUTE_TIE_CONCAT_IMPL(A, B)
|
|
|
|
#define CUTE_TIE_GET_NTH_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N
|
|
#define CUTE_TIE_COUNT_ARGS(...) \
|
|
CUTE_TIE_GET_NTH_ARG(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
|
|
|
|
#define CUTE_TIE_OP_DECL(I, TUPLE, VAR) auto VAR = ::cute::get<I>(TUPLE)
|
|
#define CUTE_TIE_OP_ASSIGN(I, TUPLE, VAR) VAR = ::cute::get<I>(TUPLE)
|
|
|
|
#define CUTE_TIE_APPLY_OP_1(OP, T, V1) OP(0, T, V1);
|
|
#define CUTE_TIE_APPLY_OP_2(OP, T, V1, V2) OP(0, T, V1); OP(1, T, V2);
|
|
#define CUTE_TIE_APPLY_OP_3(OP, T, V1, V2, V3) OP(0, T, V1); OP(1, T, V2); OP(2, T, V3);
|
|
#define CUTE_TIE_APPLY_OP_4(OP, T, V1, V2, V3, V4) OP(0, T, V1); OP(1, T, V2); OP(2, T, V3); OP(3, T, V4);
|
|
#define CUTE_TIE_APPLY_OP_5(OP, T, V1, V2, V3, V4, V5) OP(0, T, V1); OP(1, T, V2); OP(2, T, V3); OP(3, T, V4); OP(4, T, V5);
|
|
|
|
#define CUTE_TIE_DECL(TUPLE_EXPR, ...) \
|
|
auto&& CUTE_TIE_CONCAT(cute_tie__temp_tuple_, __LINE__) = (TUPLE_EXPR); \
|
|
CUTE_TIE_CONCAT(CUTE_TIE_APPLY_OP_, CUTE_TIE_COUNT_ARGS(__VA_ARGS__)) ( \
|
|
CUTE_TIE_OP_DECL, \
|
|
CUTE_TIE_CONCAT(cute_tie__temp_tuple_, __LINE__), \
|
|
__VA_ARGS__ \
|
|
)
|
|
|
|
#define CUTE_TIE(TUPLE_EXPR, ...) \
|
|
do { \
|
|
auto&& CUTE_TIE_CONCAT(cute_tie__temp_tuple_, __LINE__) = (TUPLE_EXPR); \
|
|
CUTE_TIE_CONCAT(CUTE_TIE_APPLY_OP_, CUTE_TIE_COUNT_ARGS(__VA_ARGS__)) ( \
|
|
CUTE_TIE_OP_ASSIGN, \
|
|
CUTE_TIE_CONCAT(cute_tie__temp_tuple_, __LINE__), \
|
|
__VA_ARGS__ \
|
|
); \
|
|
} while (0)
|