|
1 | 1 | // 2020/08/30 - Created by netcan: https://github.com/netcan
|
| 2 | +// ref https://github.com/Erlkoenig90/map-macro/ |
2 | 3 | #pragma once
|
3 |
| -#ifdef _MSC_VER |
4 |
| -#define TF_EMPTY() |
5 |
| -#define TF_GET_ARG_COUNT_(...) \ |
6 |
| - TF_PASTE(TF_GET_ARG_COUNT_I( \ |
7 |
| - __VA_ARGS__, 120, 119, 118, \ |
8 |
| - 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, \ |
9 |
| - 104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, \ |
10 |
| - 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, \ |
11 |
| - 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, \ |
12 |
| - 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, \ |
13 |
| - 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, \ |
14 |
| - 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, \ |
15 |
| - 8, 7, 6, 5, 4, 3, 2, 1, 0, ), \ |
16 |
| - TF_EMPTY()) |
| 4 | +#define TF_EVAL0(...) __VA_ARGS__ |
| 5 | +#define TF_EVAL1(...) TF_EVAL0(TF_EVAL0(TF_EVAL0(__VA_ARGS__))) |
| 6 | +#define TF_EVAL2(...) TF_EVAL1(TF_EVAL1(TF_EVAL1(__VA_ARGS__))) |
| 7 | +#define TF_EVAL3(...) TF_EVAL2(TF_EVAL2(TF_EVAL2(__VA_ARGS__))) |
| 8 | +#define TF_EVAL4(...) TF_EVAL3(TF_EVAL3(TF_EVAL3(__VA_ARGS__))) |
| 9 | +#define TF_EVAL5(...) TF_EVAL4(TF_EVAL4(TF_EVAL4(__VA_ARGS__))) |
17 | 10 |
|
| 11 | +#ifdef _MSC_VER |
| 12 | +// MSVC needs more evaluations |
| 13 | +#define TF_EVAL6(...) TF_EVAL5(TF_EVAL5(TF_EVAL5(__VA_ARGS__))) |
| 14 | +#define TF_EVAL(...) TF_EVAL6(TF_EVAL6(__VA_ARGS__)) |
18 | 15 | #else
|
19 |
| -#define TF_GET_ARG_COUNT_(...) \ |
20 |
| - TF_GET_ARG_COUNT_I( \ |
21 |
| - __VA_ARGS__, 120, 119, 118, 117, 116, \ |
22 |
| - 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, \ |
23 |
| - 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, \ |
24 |
| - 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, \ |
25 |
| - 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, \ |
26 |
| - 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, \ |
27 |
| - 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, \ |
28 |
| - 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, ) |
29 |
| - |
| 16 | +#define TF_EVAL(...) TF_EVAL5(__VA_ARGS__) |
30 | 17 | #endif
|
31 | 18 |
|
32 |
| -#define TF_GET_ARG_COUNT(...) TF_GET_ARG_COUNT_(__dummy__, ##__VA_ARGS__) |
33 |
| -#define TF_GET_ARG_COUNT_I( \ |
34 |
| - e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, \ |
35 |
| - e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, \ |
36 |
| - e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, \ |
37 |
| - e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, \ |
38 |
| - e62, e63, e64, e65, e66, e67, e68, e69, e70, e71, e72, e73, e74, e75, e76, \ |
39 |
| - e77, e78, e79, e80, e81, e82, e83, e84, e85, e86, e87, e88, e89, e90, e91, \ |
40 |
| - e92, e93, e94, e95, e96, e97, e98, e99, e100, e101, e102, e103, e104, \ |
41 |
| - e105, e106, e107, e108, e109, e110, e111, e112, e113, e114, e115, e116, \ |
42 |
| - e117, e118, e119, e120, size, \ |
43 |
| - ...) \ |
44 |
| - size |
| 19 | +#define TF_MAP_END(...) |
| 20 | +#define TF_MAP_OUT |
| 21 | + |
| 22 | +#define EMPTY() |
| 23 | +#define DEFER(id) id EMPTY() |
| 24 | + |
| 25 | +#define TF_MAP_GET_END2() 0, TF_MAP_END |
| 26 | +#define TF_MAP_GET_END1(...) TF_MAP_GET_END2 |
| 27 | +#define TF_MAP_GET_END(...) TF_MAP_GET_END1 |
| 28 | +#define TF_MAP_NEXT0(test, next, ...) next TF_MAP_OUT |
| 29 | +#define TF_MAP_NEXT1(test, next) DEFER(TF_MAP_NEXT0)(test, next, 0) |
| 30 | +#define TF_MAP_NEXT(test, next) TF_MAP_NEXT1(TF_MAP_GET_END test, next) |
45 | 31 |
|
46 |
| -#define TF_REPEAT_0(func, i, arg) |
47 |
| -#define TF_REPEAT_1(func, i, arg) func(i, arg) |
48 |
| -#define TF_REPEAT_2(func, i, arg, ...) \ |
49 |
| - func(i, arg) TF_REPEAT_1(func, i + 1, __VA_ARGS__) |
50 |
| -#define TF_REPEAT_3(func, i, arg, ...) \ |
51 |
| - func(i, arg) TF_REPEAT_2(func, i + 1, __VA_ARGS__) |
52 |
| -#define TF_REPEAT_4(func, i, arg, ...) \ |
53 |
| - func(i, arg) TF_REPEAT_3(func, i + 1, __VA_ARGS__) |
54 |
| -#define TF_REPEAT_5(func, i, arg, ...) \ |
55 |
| - func(i, arg) TF_REPEAT_4(func, i + 1, __VA_ARGS__) |
56 |
| -#define TF_REPEAT_6(func, i, arg, ...) \ |
57 |
| - func(i, arg) TF_REPEAT_5(func, i + 1, __VA_ARGS__) |
58 |
| -#define TF_REPEAT_7(func, i, arg, ...) \ |
59 |
| - func(i, arg) TF_REPEAT_6(func, i + 1, __VA_ARGS__) |
60 |
| -#define TF_REPEAT_8(func, i, arg, ...) \ |
61 |
| - func(i, arg) TF_REPEAT_7(func, i + 1, __VA_ARGS__) |
62 |
| -#define TF_REPEAT_9(func, i, arg, ...) \ |
63 |
| - func(i, arg) TF_REPEAT_8(func, i + 1, __VA_ARGS__) |
64 |
| -#define TF_REPEAT_10(func, i, arg, ...) \ |
65 |
| - func(i, arg) TF_REPEAT_9(func, i + 1, __VA_ARGS__) |
66 |
| -#define TF_REPEAT_11(func, i, arg, ...) \ |
67 |
| - func(i, arg) TF_REPEAT_10(func, i + 1, __VA_ARGS__) |
68 |
| -#define TF_REPEAT_12(func, i, arg, ...) \ |
69 |
| - func(i, arg) TF_REPEAT_11(func, i + 1, __VA_ARGS__) |
70 |
| -#define TF_REPEAT_13(func, i, arg, ...) \ |
71 |
| - func(i, arg) TF_REPEAT_12(func, i + 1, __VA_ARGS__) |
72 |
| -#define TF_REPEAT_14(func, i, arg, ...) \ |
73 |
| - func(i, arg) TF_REPEAT_13(func, i + 1, __VA_ARGS__) |
74 |
| -#define TF_REPEAT_15(func, i, arg, ...) \ |
75 |
| - func(i, arg) TF_REPEAT_14(func, i + 1, __VA_ARGS__) |
76 |
| -#define TF_REPEAT_16(func, i, arg, ...) \ |
77 |
| - func(i, arg) TF_REPEAT_15(func, i + 1, __VA_ARGS__) |
78 |
| -#define TF_REPEAT_17(func, i, arg, ...) \ |
79 |
| - func(i, arg) TF_REPEAT_16(func, i + 1, __VA_ARGS__) |
80 |
| -#define TF_REPEAT_18(func, i, arg, ...) \ |
81 |
| - func(i, arg) TF_REPEAT_17(func, i + 1, __VA_ARGS__) |
82 |
| -#define TF_REPEAT_19(func, i, arg, ...) \ |
83 |
| - func(i, arg) TF_REPEAT_18(func, i + 1, __VA_ARGS__) |
84 |
| -#define TF_REPEAT_20(func, i, arg, ...) \ |
85 |
| - func(i, arg) TF_REPEAT_19(func, i + 1, __VA_ARGS__) |
86 |
| -#define TF_REPEAT_21(func, i, arg, ...) \ |
87 |
| - func(i, arg) TF_REPEAT_20(func, i + 1, __VA_ARGS__) |
88 |
| -#define TF_REPEAT_22(func, i, arg, ...) \ |
89 |
| - func(i, arg) TF_REPEAT_21(func, i + 1, __VA_ARGS__) |
90 |
| -#define TF_REPEAT_23(func, i, arg, ...) \ |
91 |
| - func(i, arg) TF_REPEAT_22(func, i + 1, __VA_ARGS__) |
92 |
| -#define TF_REPEAT_24(func, i, arg, ...) \ |
93 |
| - func(i, arg) TF_REPEAT_23(func, i + 1, __VA_ARGS__) |
94 |
| -#define TF_REPEAT_25(func, i, arg, ...) \ |
95 |
| - func(i, arg) TF_REPEAT_24(func, i + 1, __VA_ARGS__) |
96 |
| -#define TF_REPEAT_26(func, i, arg, ...) \ |
97 |
| - func(i, arg) TF_REPEAT_25(func, i + 1, __VA_ARGS__) |
98 |
| -#define TF_REPEAT_27(func, i, arg, ...) \ |
99 |
| - func(i, arg) TF_REPEAT_26(func, i + 1, __VA_ARGS__) |
100 |
| -#define TF_REPEAT_28(func, i, arg, ...) \ |
101 |
| - func(i, arg) TF_REPEAT_27(func, i + 1, __VA_ARGS__) |
102 |
| -#define TF_REPEAT_29(func, i, arg, ...) \ |
103 |
| - func(i, arg) TF_REPEAT_28(func, i + 1, __VA_ARGS__) |
104 |
| -#define TF_REPEAT_30(func, i, arg, ...) \ |
105 |
| - func(i, arg) TF_REPEAT_29(func, i + 1, __VA_ARGS__) |
106 |
| -#define TF_REPEAT_31(func, i, arg, ...) \ |
107 |
| - func(i, arg) TF_REPEAT_30(func, i + 1, __VA_ARGS__) |
108 |
| -#define TF_REPEAT_32(func, i, arg, ...) \ |
109 |
| - func(i, arg) TF_REPEAT_31(func, i + 1, __VA_ARGS__) |
110 |
| -#define TF_REPEAT_33(func, i, arg, ...) \ |
111 |
| - func(i, arg) TF_REPEAT_32(func, i + 1, __VA_ARGS__) |
112 |
| -#define TF_REPEAT_34(func, i, arg, ...) \ |
113 |
| - func(i, arg) TF_REPEAT_33(func, i + 1, __VA_ARGS__) |
114 |
| -#define TF_REPEAT_35(func, i, arg, ...) \ |
115 |
| - func(i, arg) TF_REPEAT_34(func, i + 1, __VA_ARGS__) |
116 |
| -#define TF_REPEAT_36(func, i, arg, ...) \ |
117 |
| - func(i, arg) TF_REPEAT_35(func, i + 1, __VA_ARGS__) |
118 |
| -#define TF_REPEAT_37(func, i, arg, ...) \ |
119 |
| - func(i, arg) TF_REPEAT_36(func, i + 1, __VA_ARGS__) |
120 |
| -#define TF_REPEAT_38(func, i, arg, ...) \ |
121 |
| - func(i, arg) TF_REPEAT_37(func, i + 1, __VA_ARGS__) |
122 |
| -#define TF_REPEAT_39(func, i, arg, ...) \ |
123 |
| - func(i, arg) TF_REPEAT_38(func, i + 1, __VA_ARGS__) |
124 |
| -#define TF_REPEAT_40(func, i, arg, ...) \ |
125 |
| - func(i, arg) TF_REPEAT_39(func, i + 1, __VA_ARGS__) |
126 |
| -#define TF_REPEAT_41(func, i, arg, ...) \ |
127 |
| - func(i, arg) TF_REPEAT_40(func, i + 1, __VA_ARGS__) |
128 |
| -#define TF_REPEAT_42(func, i, arg, ...) \ |
129 |
| - func(i, arg) TF_REPEAT_41(func, i + 1, __VA_ARGS__) |
130 |
| -#define TF_REPEAT_43(func, i, arg, ...) \ |
131 |
| - func(i, arg) TF_REPEAT_42(func, i + 1, __VA_ARGS__) |
132 |
| -#define TF_REPEAT_44(func, i, arg, ...) \ |
133 |
| - func(i, arg) TF_REPEAT_43(func, i + 1, __VA_ARGS__) |
134 |
| -#define TF_REPEAT_45(func, i, arg, ...) \ |
135 |
| - func(i, arg) TF_REPEAT_44(func, i + 1, __VA_ARGS__) |
136 |
| -#define TF_REPEAT_46(func, i, arg, ...) \ |
137 |
| - func(i, arg) TF_REPEAT_45(func, i + 1, __VA_ARGS__) |
138 |
| -#define TF_REPEAT_47(func, i, arg, ...) \ |
139 |
| - func(i, arg) TF_REPEAT_46(func, i + 1, __VA_ARGS__) |
140 |
| -#define TF_REPEAT_48(func, i, arg, ...) \ |
141 |
| - func(i, arg) TF_REPEAT_47(func, i + 1, __VA_ARGS__) |
142 |
| -#define TF_REPEAT_49(func, i, arg, ...) \ |
143 |
| - func(i, arg) TF_REPEAT_48(func, i + 1, __VA_ARGS__) |
144 |
| -#define TF_REPEAT_50(func, i, arg, ...) \ |
145 |
| - func(i, arg) TF_REPEAT_49(func, i + 1, __VA_ARGS__) |
146 |
| -#define TF_REPEAT_51(func, i, arg, ...) \ |
147 |
| - func(i, arg) TF_REPEAT_50(func, i + 1, __VA_ARGS__) |
148 |
| -#define TF_REPEAT_52(func, i, arg, ...) \ |
149 |
| - func(i, arg) TF_REPEAT_51(func, i + 1, __VA_ARGS__) |
150 |
| -#define TF_REPEAT_53(func, i, arg, ...) \ |
151 |
| - func(i, arg) TF_REPEAT_52(func, i + 1, __VA_ARGS__) |
152 |
| -#define TF_REPEAT_54(func, i, arg, ...) \ |
153 |
| - func(i, arg) TF_REPEAT_53(func, i + 1, __VA_ARGS__) |
154 |
| -#define TF_REPEAT_55(func, i, arg, ...) \ |
155 |
| - func(i, arg) TF_REPEAT_54(func, i + 1, __VA_ARGS__) |
156 |
| -#define TF_REPEAT_56(func, i, arg, ...) \ |
157 |
| - func(i, arg) TF_REPEAT_55(func, i + 1, __VA_ARGS__) |
158 |
| -#define TF_REPEAT_57(func, i, arg, ...) \ |
159 |
| - func(i, arg) TF_REPEAT_56(func, i + 1, __VA_ARGS__) |
160 |
| -#define TF_REPEAT_58(func, i, arg, ...) \ |
161 |
| - func(i, arg) TF_REPEAT_57(func, i + 1, __VA_ARGS__) |
162 |
| -#define TF_REPEAT_59(func, i, arg, ...) \ |
163 |
| - func(i, arg) TF_REPEAT_58(func, i + 1, __VA_ARGS__) |
164 |
| -#define TF_REPEAT_60(func, i, arg, ...) \ |
165 |
| - func(i, arg) TF_REPEAT_59(func, i + 1, __VA_ARGS__) |
166 |
| -#define TF_REPEAT_61(func, i, arg, ...) \ |
167 |
| - func(i, arg) TF_REPEAT_60(func, i + 1, __VA_ARGS__) |
168 |
| -#define TF_REPEAT_62(func, i, arg, ...) \ |
169 |
| - func(i, arg) TF_REPEAT_61(func, i + 1, __VA_ARGS__) |
170 |
| -#define TF_REPEAT_63(func, i, arg, ...) \ |
171 |
| - func(i, arg) TF_REPEAT_62(func, i + 1, __VA_ARGS__) |
172 |
| -#define TF_REPEAT_64(func, i, arg, ...) \ |
173 |
| - func(i, arg) TF_REPEAT_63(func, i + 1, __VA_ARGS__) |
| 32 | +#define TF_MAP0(f, x, peek, ...) \ |
| 33 | + f(x) DEFER(TF_MAP_NEXT(peek, TF_MAP1))(f, peek, __VA_ARGS__) |
| 34 | +#define TF_MAP1(f, x, peek, ...) \ |
| 35 | + f(x) DEFER(TF_MAP_NEXT(peek, TF_MAP0))(f, peek, __VA_ARGS__) |
174 | 36 |
|
175 |
| -#define TF_CONCATE(x, y) x##y |
176 |
| -#define TF_PASTE(x, y) TF_CONCATE(x, y) |
| 37 | +#define TF_MAP(f, ...) \ |
| 38 | + TF_EVAL(TF_MAP1(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0)) |
0 commit comments