| @@ -0,0 +1,117 @@ |
| 1 | +#define M_DEFERRED_COMMA , |
| 2 | + |
| 3 | +#define M_EAT(...) |
| 4 | +#define M_APPLY(a, ...) a (__VA_ARGS__) |
| 5 | +#define M_ID(...) __VA_ARGS__ |
| 6 | + |
| 7 | +#define M_C2I(a, ...) a ## __VA_ARGS__ |
| 8 | +#define M_C(a, ...) M_C2I(a, __VA_ARGS__) |
| 9 | +#define M_C3I(a, b, ...) a ## b ## __VA_ARGS__ |
| 10 | +#define M_C3(a, b, ...) M_C3I(a ,b, __VA_ARGS__) |
| 11 | +#define M_C4I(a, b, c, ...) a ## b ## c ## __VA_ARGS__ |
| 12 | +#define M_C4(a, b, c, ...) M_C4I(a ,b, c, __VA_ARGS__) |
| 13 | + |
| 14 | +#define M_INVI_0 1 |
| 15 | +#define M_INVI_1 0 |
| 16 | +#define M_INV(x) M_C(M_INVI_, x) |
| 17 | + |
| 18 | +#define M_ANDI_00 0 |
| 19 | +#define M_ANDI_01 0 |
| 20 | +#define M_ANDI_10 0 |
| 21 | +#define M_ANDI_11 1 |
| 22 | +#define M_AND(x,y) M_C3(M_ANDI_, x, y) |
| 23 | + |
| 24 | +#define M_ANDI_000 0 |
| 25 | +#define M_ANDI_001 0 |
| 26 | +#define M_ANDI_010 0 |
| 27 | +#define M_ANDI_011 0 |
| 28 | +#define M_ANDI_100 0 |
| 29 | +#define M_ANDI_101 0 |
| 30 | +#define M_ANDI_110 0 |
| 31 | +#define M_ANDI_111 1 |
| 32 | +#define M_AND3(x,y,z) M_C4(M_ANDI_, x, y, z) |
| 33 | + |
| 34 | +#define M_ORI_00 0 |
| 35 | +#define M_ORI_01 1 |
| 36 | +#define M_ORI_10 1 |
| 37 | +#define M_ORI_11 1 |
| 38 | +#define M_OR(x,y) M_C3(M_ORI_, x, y) |
| 39 | + |
| 40 | +#define M_ORI_000 0 |
| 41 | +#define M_ORI_001 1 |
| 42 | +#define M_ORI_010 1 |
| 43 | +#define M_ORI_011 1 |
| 44 | +#define M_ORI_100 1 |
| 45 | +#define M_ORI_101 1 |
| 46 | +#define M_ORI_110 1 |
| 47 | +#define M_ORI_111 1 |
| 48 | +#define M_OR3(x,y,z) M_C4(M_ORI_, x, y, z) |
| 49 | + |
| 50 | +#define M_RETI_ARG2(_1, _2, ...) _2 |
| 51 | +#define M_RET_ARG2(...) M_RETI_ARG2(__VA_ARGS__,) |
| 52 | + |
| 53 | +#define M_RETI_ARG4(_1, _2, _3, _4, ...) _4 |
| 54 | +#define M_RET_ARG4(...) M_RETI_ARG4(__VA_ARGS__,) |
| 55 | + |
| 56 | +#define M_TOBOOLI_0 1, 0, |
| 57 | +#define M_BOOL(x) M_RET_ARG2(M_C(M_TOBOOLI_, x), 1, useless) |
| 58 | + |
| 59 | +#define M_IFI_0(true_c, ...) __VA_ARGS__ |
| 60 | +#define M_IFI_1(true_c, ...) true_c |
| 61 | +#define M_IF(c) M_C(M_IFI_, M_BOOL(c)) |
| 62 | + |
| 63 | +#define M_NARGS(...) M_RET_ARG4(__VA_ARGS__, 3, 2, 1, useless) |
| 64 | + |
| 65 | +#define M_MAP(...) M_MAP_0(__VA_ARGS__) |
| 66 | +#define M_MAP_0(f, ...) M_C(M_MAP_, M_NARGS(__VA_ARGS__))(f, __VA_ARGS__) |
| 67 | +#define M_MAP_1(f, _1) f(_1) |
| 68 | +#define M_MAP_2(f, _1, _2) f(_1) f(_2) |
| 69 | +#define M_MAP_3(f, _1, _2, _3) f(_1) f(_2) f(_3) |
| 70 | + |
| 71 | +#define M_MAP2(...) M_MAP2I_0(__VA_ARGS__) |
| 72 | +#define M_MAP2I_0(f, d, ...) M_C(M_MAP2I_, M_NARGS(__VA_ARGS__))(f, d, __VA_ARGS__) |
| 73 | +#define M_MAP2I_1(f, d, _1) f(d, _1) |
| 74 | +#define M_MAP2I_2(f, d, _1, _2) f(d, _1) f(d, _2) |
| 75 | +#define M_MAP2I_3(f, d, _1, _2, _3) f(d, _1) f(d, _2) f(d, _3) |
| 76 | + |
| 77 | +#define M_CROSS_MAP(f, alist, blist) M_CROSSI_MAP1(f, alist, blist) |
| 78 | +#define M_CROSSI_MAP1(f, alist, blist) M_C(M_CROSSI_MAP1_, M_NARGS alist)(f, blist, M_ID alist) |
| 79 | +#define M_CROSSI_MAP1_1(...) M_CROSSI_MAP1_1b(__VA_ARGS__) |
| 80 | +#define M_CROSSI_MAP1_1b(f, blist, a1) M_MAP2(f, a1, M_ID blist) |
| 81 | +#define M_CROSSI_MAP1_2(...) M_CROSSI_MAP1_2b(__VA_ARGS__) |
| 82 | +#define M_CROSSI_MAP1_2b(f, blist, a1, a2) M_MAP2(f, a1, M_ID blist) M_MAP2(f, a2, M_ID blist) |
| 83 | +#define M_CROSSI_MAP1_3(...) M_CROSSI_MAP1_3b(__VA_ARGS__) |
| 84 | +#define M_CROSSI_MAP1_3b(f, blist, a1, a2, a3) M_MAP2(f, a1, M_ID blist) M_MAP2(f, a2, M_ID blist) M_MAP2(f, a3, M_ID blist) |
| 85 | + |
| 86 | +#define M_COMMA_P(...) M_RETI_ARG4(__VA_ARGS__, 1, 1, 0, useless) |
| 87 | + |
| 88 | +#define M_PARENTHESISI_DETECT1(...) , |
| 89 | +#define M_PARENTHESIS_P(...) \ |
| 90 | + M_AND3(M_COMMA_P(M_PARENTHESISI_DETECT1 __VA_ARGS__), \ |
| 91 | + M_INV(M_COMMA_P(__VA_ARGS__)), \ |
| 92 | + M_EMPTY_P(M_EAT __VA_ARGS__)) |
| 93 | + |
| 94 | +#define M_EMPTYI_DETECT(...) , |
| 95 | +#define M_EMPTYI_P_C1(...) M_COMMA_P(M_EMPTYI_DETECT __VA_ARGS__ () ) |
| 96 | +#define M_EMPTYI_P_C2(...) M_COMMA_P(M_EMPTYI_DETECT __VA_ARGS__) |
| 97 | +#define M_EMPTYI_P_C3(...) M_COMMA_P(__VA_ARGS__ () ) |
| 98 | +#define M_EMPTY_P(...) M_AND(M_EMPTYI_P_C1(__VA_ARGS__), M_INV(M_OR3(M_EMPTYI_P_C2(__VA_ARGS__), M_COMMA_P(__VA_ARGS__),M_EMPTYI_P_C3(__VA_ARGS__)))) |
| 99 | + |
| 100 | +#define M_G3N_IS_PRESENT(num) \ |
| 101 | + M_IF(M_PARENTHESIS_P(M_C(M_GENERIC_ORG_, num)() ))(M_DEFERRED_COMMA M_ID M_C(M_GENERIC_ORG_, num)(), ) |
| 102 | + |
| 103 | +#define M_G3N_IS_PRESENT2(el1, num) \ |
| 104 | + M_IF(M_PARENTHESIS_P(M_C4(M_GENERIC_ORG_, el1, _COMP_, num)()))(M_DEFERRED_COMMA M_APPLY(M_C3, el1, _COMP_, M_ID M_C4(M_GENERIC_ORG_, el1, _COMP_, num)()), ) |
| 105 | + |
| 106 | +#define FLT1 (GENTYPE(float), TYPE(float) ) |
| 107 | + |
| 108 | +#define M_GENERIC_ORG_2() (USER) |
| 109 | +#define M_GENERIC_ORG_USER_COMP_1() (CORE) |
| 110 | +#define M_GENERIC_ORG_USER_COMP_CORE_OPLIST_6() FLT1 |
| 111 | + |
| 112 | +// Shall expand to ", USER" |
| 113 | +M_MAP(M_G3N_IS_PRESENT, 1, 2, 3) |
| 114 | +// Shall expand to ", USER_COMP_CORE" |
| 115 | +M_CROSS_MAP(M_G3N_IS_PRESENT2, (MLIB , USER), ( 1, 2, 3 ) ) |
| 116 | +// Shall expand to ", USER_COMP_CORE" (composition of both) [fail] |
| 117 | +M_CROSS_MAP(M_G3N_IS_PRESENT2, (MLIB M_MAP(M_G3N_IS_PRESENT, 1, 2, 3)), ( 1, 2, 3 ) ) |