diff options
author | kartofen <mladenovnasko0@gmail.com> | 2025-06-08 23:16:33 +0300 |
---|---|---|
committer | kartofen <mladenovnasko0@gmail.com> | 2025-06-08 23:16:33 +0300 |
commit | 227f73622b4576bf21719fcc9ea99416056d8a71 (patch) | |
tree | 1ab6d7c0e8dab40aa26def1a2ea6098134e82ea8 /transpose.h |
Diffstat (limited to 'transpose.h')
-rw-r--r-- | transpose.h | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/transpose.h b/transpose.h new file mode 100644 index 0000000..02471ff --- /dev/null +++ b/transpose.h @@ -0,0 +1,54 @@ +#define EMPTY() +#define EXPAND(...) __VA_ARGS__ +#define DEFER(id) id EMPTY() +#define OBSTRUCT(...) __VA_ARGS__ DEFER(EMPTY)() +#define CAR(a, ...) a +#define CDR(a, ...) __VA_OPT__((__VA_ARGS__)) + +#define I_A() A +#define I_B() B +#define I_C() C + +#ifndef DELIM + #define DELIM COMMA +#endif +#ifndef P + #define P(...) { __VA_ARGS__ } COMMA +#endif + +#define COMMA , +#define HAS(b, ...) __VA_OPT__(__VA_ARGS__ b) + +#define EVAL(...) EVAL1(EVAL1(EVAL1(__VA_ARGS__))) +#define EVAL1(...) EVAL2(EVAL2(EVAL2(__VA_ARGS__))) +#define EVAL2(...) EVAL3(EVAL3(EVAL3(__VA_ARGS__))) +#define EVAL3(...) EVAL4(EVAL4(EVAL4(__VA_ARGS__))) +#define EVAL4(...) EVAL5(EVAL5(EVAL5(__VA_ARGS__))) +#define EVAL5(...) EVAL6(EVAL6(EVAL6(__VA_ARGS__))) +#define EVAL6(...) EVAL7(EVAL7(EVAL7(__VA_ARGS__))) +#define EVAL7(...) __VA_ARGS__ + +// #define DEFER0(...) DEFER1(DEFER1(DEFER1(__VA_ARGS__))) +// #define DEFER1(...) DEFER2(DEFER2(DEFER2(__VA_ARGS__))) +// #define DEFER2(...) DEFER3(DEFER3(DEFER3(__VA_ARGS__))) +// #define DEFER3(...) DEFER4(DEFER4(DEFER4(__VA_ARGS__))) +// #define DEFER4(...) DEFER5(DEFER5(DEFER5(__VA_ARGS__))) +// #define DEFER5(...) DEFER6(DEFER6(DEFER6(__VA_ARGS__))) +// #define DEFER6(...) DEFER (DEFER (DEFER (__VA_ARGS__))) + +#define A(a, ...) HAS(__VA_OPT__(DELIM OBSTRUCT(I_A)()(__VA_ARGS__)), CAR a) +#define B(a, ...) HAS(__VA_OPT__(COMMA OBSTRUCT(I_B)()(__VA_ARGS__)), CDR a) +#define C(...) __VA_OPT__(P(A(__VA_ARGS__)) DEFER(OBSTRUCT(I_C)())DEFER(EXPAND)((B(__VA_ARGS__)))) + +#define TRANSPOSE(...) EVAL(C(__VA_ARGS__)) + +// #define TEST +#ifdef TEST + TRANSPOSE((1, 2, 3), (4, 5, 6)) + TRANSPOSE((1, 2, 3), (4, 5, 6), (4, 5, 6), (4, 5, 6), (4, 5, 6)) + // EXPAND(EXPAND(EXPAND(EXPAND(EXPAND(EXPAND(B((1, 4), (2, 6)))))))) +#endif + + + + |