-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmacroexpansion.hpp
159 lines (144 loc) · 14.1 KB
/
macroexpansion.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#pragma once
#define CONCATENATE1(arg1, arg2) CONCATENATE2(arg1, arg2)
#define CONCATENATE2(arg1, arg2) arg1##arg2
#define CONCATENATE(x, y) x##y
#define FOR_EACH_NARG(...) FOR_EACH_NARG_(__VA_ARGS__, FOR_EACH_RSEQ_N())
#define FOR_EACH_NARG_(...) EXPAND(FOR_EACH_ARG_N(__VA_ARGS__))
#define FOR_EACH_ARG_N(_01, _02, _03, _04, _05, _06, _07, _08, _09, _10, _11, _12, _13, _14, _15, _16, N, ...) N
#define FOR_EACH_RSEQ_N() 16, 15, 14, 13, 12, 11, 10, 09, 08, 07, 06, 05, 04, 03, 02, 01, 00
#define EXPAND(...) __VA_ARGS__
#define COMMA ,
// Bad hack ==========================================================================================================================
#define FOR_EACH_WITH1_01(what, with, x, ...) what(with, x)
#define FOR_EACH_WITH1_02(what, with, x, ...) what(with, x) EXPAND(FOR_EACH_WITH1_01(what, with, __VA_ARGS__))
#define FOR_EACH_WITH1_03(what, with, x, ...) what(with, x) EXPAND(FOR_EACH_WITH1_02(what, with, __VA_ARGS__))
#define FOR_EACH_WITH1_04(what, with, x, ...) what(with, x) EXPAND(FOR_EACH_WITH1_03(what, with, __VA_ARGS__))
#define FOR_EACH_WITH1_05(what, with, x, ...) what(with, x) EXPAND(FOR_EACH_WITH1_04(what, with, __VA_ARGS__))
#define FOR_EACH_WITH1_06(what, with, x, ...) what(with, x) EXPAND(FOR_EACH_WITH1_05(what, with, __VA_ARGS__))
#define FOR_EACH_WITH1_07(what, with, x, ...) what(with, x) EXPAND(FOR_EACH_WITH1_06(what, with, __VA_ARGS__))
#define FOR_EACH_WITH1_08(what, with, x, ...) what(with, x) EXPAND(FOR_EACH_WITH1_07(what, with, __VA_ARGS__))
#define FOR_EACH_WITH1_09(what, with, x, ...) what(with, x) EXPAND(FOR_EACH_WITH1_08(what, with, __VA_ARGS__))
#define FOR_EACH_WITH1_10(what, with, x, ...) what(with, x) EXPAND(FOR_EACH_WITH1_09(what, with, __VA_ARGS__))
#define FOR_EACH_WITH1_11(what, with, x, ...) what(with, x) EXPAND(FOR_EACH_WITH1_10(what, with, __VA_ARGS__))
#define FOR_EACH_WITH1_12(what, with, x, ...) what(with, x) EXPAND(FOR_EACH_WITH1_11(what, with, __VA_ARGS__))
#define FOR_EACH_WITH1_13(what, with, x, ...) what(with, x) EXPAND(FOR_EACH_WITH1_12(what, with, __VA_ARGS__))
#define FOR_EACH_WITH1_14(what, with, x, ...) what(with, x) EXPAND(FOR_EACH_WITH1_13(what, with, __VA_ARGS__))
#define FOR_EACH_WITH1_15(what, with, x, ...) what(with, x) EXPAND(FOR_EACH_WITH1_14(what, with, __VA_ARGS__))
#define FOR_EACH_WITH1_16(what, with, x, ...) what(with, x) EXPAND(FOR_EACH_WITH1_15(what, with, __VA_ARGS__))
#define FOR_EACH_WITH1_(N, what, with, ...) EXPAND(CONCATENATE(FOR_EACH_WITH1_, N)(what, with, __VA_ARGS__))
#define FOR_EACH_WITH1(what, with, ...) FOR_EACH_WITH1_(FOR_EACH_NARG(__VA_ARGS__), what, with, __VA_ARGS__)
// Bad hack ==========================================================================================================================
#define FOR_EACH_WITH2_01(what, w1, w2, x) what(w1, w2, x)
#define FOR_EACH_WITH2_02(what, w1, w2, x, ...) what(w1, w2, x) EXPAND(FOR_EACH_WITH2_01(what, w1, w2, __VA_ARGS__))
#define FOR_EACH_WITH2_03(what, w1, w2, x, ...) what(w1, w2, x) EXPAND(FOR_EACH_WITH2_02(what, w1, w2, __VA_ARGS__))
#define FOR_EACH_WITH2_04(what, w1, w2, x, ...) what(w1, w2, x) EXPAND(FOR_EACH_WITH2_03(what, w1, w2, __VA_ARGS__))
#define FOR_EACH_WITH2_05(what, w1, w2, x, ...) what(w1, w2, x) EXPAND(FOR_EACH_WITH2_04(what, w1, w2, __VA_ARGS__))
#define FOR_EACH_WITH2_06(what, w1, w2, x, ...) what(w1, w2, x) EXPAND(FOR_EACH_WITH2_05(what, w1, w2, __VA_ARGS__))
#define FOR_EACH_WITH2_07(what, w1, w2, x, ...) what(w1, w2, x) EXPAND(FOR_EACH_WITH2_06(what, w1, w2, __VA_ARGS__))
#define FOR_EACH_WITH2_08(what, w1, w2, x, ...) what(w1, w2, x) EXPAND(FOR_EACH_WITH2_07(what, w1, w2, __VA_ARGS__))
#define FOR_EACH_WITH2_09(what, w1, w2, x, ...) what(w1, w2, x) EXPAND(FOR_EACH_WITH2_08(what, w1, w2, __VA_ARGS__))
#define FOR_EACH_WITH2_10(what, w1, w2, x, ...) what(w1, w2, x) EXPAND(FOR_EACH_WITH2_09(what, w1, w2, __VA_ARGS__))
#define FOR_EACH_WITH2_11(what, w1, w2, x, ...) what(w1, w2, x) EXPAND(FOR_EACH_WITH2_10(what, w1, w2, __VA_ARGS__))
#define FOR_EACH_WITH2_12(what, w1, w2, x, ...) what(w1, w2, x) EXPAND(FOR_EACH_WITH2_11(what, w1, w2, __VA_ARGS__))
#define FOR_EACH_WITH2_13(what, w1, w2, x, ...) what(w1, w2, x) EXPAND(FOR_EACH_WITH2_12(what, w1, w2, __VA_ARGS__))
#define FOR_EACH_WITH2_14(what, w1, w2, x, ...) what(w1, w2, x) EXPAND(FOR_EACH_WITH2_13(what, w1, w2, __VA_ARGS__))
#define FOR_EACH_WITH2_15(what, w1, w2, x, ...) what(w1, w2, x) EXPAND(FOR_EACH_WITH2_14(what, w1, w2, __VA_ARGS__))
#define FOR_EACH_WITH2_16(what, w1, w2, x, ...) what(w1, w2, x) EXPAND(FOR_EACH_WITH2_15(what, w1, w2, __VA_ARGS__))
#define FOR_EACH_WITH2_(N, what, w1, w2, ...) EXPAND(CONCATENATE(FOR_EACH_WITH2_, N)(what, w1, w2, __VA_ARGS__))
#define FOR_EACH_WITH2(what, w1, w2, ...) FOR_EACH_WITH2_(FOR_EACH_NARG(__VA_ARGS__), what, w1, w2, __VA_ARGS__)
// Bad hack ==========================================================================================================================
#define FOR_EACH_WITH3_01(what, w1, w2, w3, x) what(w1, w2, w3, x)
#define FOR_EACH_WITH3_02(what, w1, w2, w3, x, ...) what(w1, w2, w3, x) EXPAND(FOR_EACH_WITH3_01(what, w1, w2, w3, __VA_ARGS__))
#define FOR_EACH_WITH3_03(what, w1, w2, w3, x, ...) what(w1, w2, w3, x) EXPAND(FOR_EACH_WITH3_02(what, w1, w2, w3, __VA_ARGS__))
#define FOR_EACH_WITH3_04(what, w1, w2, w3, x, ...) what(w1, w2, w3, x) EXPAND(FOR_EACH_WITH3_03(what, w1, w2, w3, __VA_ARGS__))
#define FOR_EACH_WITH3_05(what, w1, w2, w3, x, ...) what(w1, w2, w3, x) EXPAND(FOR_EACH_WITH3_04(what, w1, w2, w3, __VA_ARGS__))
#define FOR_EACH_WITH3_06(what, w1, w2, w3, x, ...) what(w1, w2, w3, x) EXPAND(FOR_EACH_WITH3_05(what, w1, w2, w3, __VA_ARGS__))
#define FOR_EACH_WITH3_07(what, w1, w2, w3, x, ...) what(w1, w2, w3, x) EXPAND(FOR_EACH_WITH3_06(what, w1, w2, w3, __VA_ARGS__))
#define FOR_EACH_WITH3_08(what, w1, w2, w3, x, ...) what(w1, w2, w3, x) EXPAND(FOR_EACH_WITH3_07(what, w1, w2, w3, __VA_ARGS__))
#define FOR_EACH_WITH3_09(what, w1, w2, w3, x, ...) what(w1, w2, w3, x) EXPAND(FOR_EACH_WITH3_08(what, w1, w2, w3, __VA_ARGS__))
#define FOR_EACH_WITH3_10(what, w1, w2, w3, x, ...) what(w1, w2, w3, x) EXPAND(FOR_EACH_WITH3_09(what, w1, w2, w3, __VA_ARGS__))
#define FOR_EACH_WITH3_11(what, w1, w2, w3, x, ...) what(w1, w2, w3, x) EXPAND(FOR_EACH_WITH3_10(what, w1, w2, w3, __VA_ARGS__))
#define FOR_EACH_WITH3_12(what, w1, w2, w3, x, ...) what(w1, w2, w3, x) EXPAND(FOR_EACH_WITH3_11(what, w1, w2, w3, __VA_ARGS__))
#define FOR_EACH_WITH3_13(what, w1, w2, w3, x, ...) what(w1, w2, w3, x) EXPAND(FOR_EACH_WITH3_12(what, w1, w2, w3, __VA_ARGS__))
#define FOR_EACH_WITH3_14(what, w1, w2, w3, x, ...) what(w1, w2, w3, x) EXPAND(FOR_EACH_WITH3_13(what, w1, w2, w3, __VA_ARGS__))
#define FOR_EACH_WITH3_15(what, w1, w2, w3, x, ...) what(w1, w2, w3, x) EXPAND(FOR_EACH_WITH3_14(what, w1, w2, w3, __VA_ARGS__))
#define FOR_EACH_WITH3_16(what, w1, w2, w3, x, ...) what(w1, w2, w3, x) EXPAND(FOR_EACH_WITH3_15(what, w1, w2, w3, __VA_ARGS__))
#define FOR_EACH_WITH3_(N, what, w1, w2, w3, ...) EXPAND(CONCATENATE(FOR_EACH_WITH3_, N)(what, w1, w2, w3, __VA_ARGS__))
#define FOR_EACH_WITH3(what, w1, w2, w3, ...) FOR_EACH_WITH3_(FOR_EACH_NARG(__VA_ARGS__), what, w1, w2, w3, __VA_ARGS__)
// Bad hack ==========================================================================================================================
#define FOR_EACH_01(what, x, ...) what(x)
#define FOR_EACH_02(what, x, ...) what(x) EXPAND(FOR_EACH_01(what, __VA_ARGS__))
#define FOR_EACH_03(what, x, ...) what(x) EXPAND(FOR_EACH_02(what, __VA_ARGS__))
#define FOR_EACH_04(what, x, ...) what(x) EXPAND(FOR_EACH_03(what, __VA_ARGS__))
#define FOR_EACH_05(what, x, ...) what(x) EXPAND(FOR_EACH_04(what, __VA_ARGS__))
#define FOR_EACH_06(what, x, ...) what(x) EXPAND(FOR_EACH_05(what, __VA_ARGS__))
#define FOR_EACH_07(what, x, ...) what(x) EXPAND(FOR_EACH_06(what, __VA_ARGS__))
#define FOR_EACH_08(what, x, ...) what(x) EXPAND(FOR_EACH_07(what, __VA_ARGS__))
#define FOR_EACH_09(what, x, ...) what(x) EXPAND(FOR_EACH_08(what, __VA_ARGS__))
#define FOR_EACH_10(what, x, ...) what(x) EXPAND(FOR_EACH_09(what, __VA_ARGS__))
#define FOR_EACH_11(what, x, ...) what(x) EXPAND(FOR_EACH_10(what, __VA_ARGS__))
#define FOR_EACH_12(what, x, ...) what(x) EXPAND(FOR_EACH_11(what, __VA_ARGS__))
#define FOR_EACH_13(what, x, ...) what(x) EXPAND(FOR_EACH_12(what, __VA_ARGS__))
#define FOR_EACH_14(what, x, ...) what(x) EXPAND(FOR_EACH_13(what, __VA_ARGS__))
#define FOR_EACH_15(what, x, ...) what(x) EXPAND(FOR_EACH_14(what, __VA_ARGS__))
#define FOR_EACH_16(what, x, ...) what(x) EXPAND(FOR_EACH_15(what, __VA_ARGS__))
#define FOR_EACH_(N, what, ...) EXPAND(CONCATENATE(FOR_EACH_, N)(what, __VA_ARGS__))
#define FOR_EACH(what, ...) FOR_EACH_(FOR_EACH_NARG(__VA_ARGS__), what, __VA_ARGS__)
// Bad hack ==========================================================================================================================
#define _2X_FOR_EACH_01(what, x, ...) what(x)
#define _2X_FOR_EACH_02(what, x, ...) what(x) EXPAND(_2X_FOR_EACH_01(what, __VA_ARGS__))
#define _2X_FOR_EACH_03(what, x, ...) what(x) EXPAND(_2X_FOR_EACH_02(what, __VA_ARGS__))
#define _2X_FOR_EACH_04(what, x, ...) what(x) EXPAND(_2X_FOR_EACH_03(what, __VA_ARGS__))
#define _2X_FOR_EACH_05(what, x, ...) what(x) EXPAND(_2X_FOR_EACH_04(what, __VA_ARGS__))
#define _2X_FOR_EACH_06(what, x, ...) what(x) EXPAND(_2X_FOR_EACH_05(what, __VA_ARGS__))
#define _2X_FOR_EACH_07(what, x, ...) what(x) EXPAND(_2X_FOR_EACH_06(what, __VA_ARGS__))
#define _2X_FOR_EACH_08(what, x, ...) what(x) EXPAND(_2X_FOR_EACH_07(what, __VA_ARGS__))
#define _2X_FOR_EACH_09(what, x, ...) what(x) EXPAND(_2X_FOR_EACH_08(what, __VA_ARGS__))
#define _2X_FOR_EACH_10(what, x, ...) what(x) EXPAND(_2X_FOR_EACH_09(what, __VA_ARGS__))
#define _2X_FOR_EACH_11(what, x, ...) what(x) EXPAND(_2X_FOR_EACH_10(what, __VA_ARGS__))
#define _2X_FOR_EACH_12(what, x, ...) what(x) EXPAND(_2X_FOR_EACH_11(what, __VA_ARGS__))
#define _2X_FOR_EACH_13(what, x, ...) what(x) EXPAND(_2X_FOR_EACH_12(what, __VA_ARGS__))
#define _2X_FOR_EACH_14(what, x, ...) what(x) EXPAND(_2X_FOR_EACH_13(what, __VA_ARGS__))
#define _2X_FOR_EACH_15(what, x, ...) what(x) EXPAND(_2X_FOR_EACH_14(what, __VA_ARGS__))
#define _2X_FOR_EACH_16(what, x, ...) what(x) EXPAND(_2X_FOR_EACH_15(what, __VA_ARGS__))
#define _2X_FOR_EACH_(N, what, ...) EXPAND(CONCATENATE(_2X_FOR_EACH_, N)(what, __VA_ARGS__))
#define _2X_FOR_EACH(what, ...) _2X_FOR_EACH_(FOR_EACH_NARG(__VA_ARGS__), what, __VA_ARGS__)
#define FOR_EACH_2(what, ...) _2X_FOR_EACH(what, __VA_ARGS__)
// Bad hack ==========================================================================================================================
#define _3X_FOR_EACH_01(what, x, ...) what(x)
#define _3X_FOR_EACH_02(what, x, ...) what(x) EXPAND(_3X_FOR_EACH_01(what, __VA_ARGS__))
#define _3X_FOR_EACH_03(what, x, ...) what(x) EXPAND(_3X_FOR_EACH_02(what, __VA_ARGS__))
#define _3X_FOR_EACH_04(what, x, ...) what(x) EXPAND(_3X_FOR_EACH_03(what, __VA_ARGS__))
#define _3X_FOR_EACH_05(what, x, ...) what(x) EXPAND(_3X_FOR_EACH_04(what, __VA_ARGS__))
#define _3X_FOR_EACH_06(what, x, ...) what(x) EXPAND(_3X_FOR_EACH_05(what, __VA_ARGS__))
#define _3X_FOR_EACH_07(what, x, ...) what(x) EXPAND(_3X_FOR_EACH_06(what, __VA_ARGS__))
#define _3X_FOR_EACH_08(what, x, ...) what(x) EXPAND(_3X_FOR_EACH_07(what, __VA_ARGS__))
#define _3X_FOR_EACH_09(what, x, ...) what(x) EXPAND(_3X_FOR_EACH_08(what, __VA_ARGS__))
#define _3X_FOR_EACH_10(what, x, ...) what(x) EXPAND(_3X_FOR_EACH_09(what, __VA_ARGS__))
#define _3X_FOR_EACH_11(what, x, ...) what(x) EXPAND(_3X_FOR_EACH_10(what, __VA_ARGS__))
#define _3X_FOR_EACH_12(what, x, ...) what(x) EXPAND(_3X_FOR_EACH_11(what, __VA_ARGS__))
#define _3X_FOR_EACH_13(what, x, ...) what(x) EXPAND(_3X_FOR_EACH_12(what, __VA_ARGS__))
#define _3X_FOR_EACH_14(what, x, ...) what(x) EXPAND(_3X_FOR_EACH_13(what, __VA_ARGS__))
#define _3X_FOR_EACH_15(what, x, ...) what(x) EXPAND(_3X_FOR_EACH_14(what, __VA_ARGS__))
#define _3X_FOR_EACH_16(what, x, ...) what(x) EXPAND(_3X_FOR_EACH_15(what, __VA_ARGS__))
#define _3X_FOR_EACH_(N, what, ...) EXPAND(CONCATENATE(_3X_FOR_EACH_, N)(what, __VA_ARGS__))
#define _3X_FOR_EACH(what, ...) _3X_FOR_EACH_(FOR_EACH_NARG(__VA_ARGS__), what, __VA_ARGS__)
#define FOR_EACH_3(what, ...) _3X_FOR_EACH(what, __VA_ARGS__)
#define FOR_EACH_DELIM_01(what, delimiter, x, ...) what(x)
#define FOR_EACH_DELIM_02(what, delimiter, x, ...) what(x) delimiter EXPAND(FOR_EACH_DELIM_01(what, delimiter, __VA_ARGS__))
#define FOR_EACH_DELIM_03(what, delimiter, x, ...) what(x) delimiter EXPAND(FOR_EACH_DELIM_02(what, delimiter, __VA_ARGS__))
#define FOR_EACH_DELIM_04(what, delimiter, x, ...) what(x) delimiter EXPAND(FOR_EACH_DELIM_03(what, delimiter, __VA_ARGS__))
#define FOR_EACH_DELIM_05(what, delimiter, x, ...) what(x) delimiter EXPAND(FOR_EACH_DELIM_04(what, delimiter, __VA_ARGS__))
#define FOR_EACH_DELIM_06(what, delimiter, x, ...) what(x) delimiter EXPAND(FOR_EACH_DELIM_05(what, delimiter, __VA_ARGS__))
#define FOR_EACH_DELIM_07(what, delimiter, x, ...) what(x) delimiter EXPAND(FOR_EACH_DELIM_06(what, delimiter, __VA_ARGS__))
#define FOR_EACH_DELIM_08(what, delimiter, x, ...) what(x) delimiter EXPAND(FOR_EACH_DELIM_07(what, delimiter, __VA_ARGS__))
#define FOR_EACH_DELIM_09(what, delimiter, x, ...) what(x) delimiter EXPAND(FOR_EACH_DELIM_08(what, delimiter, __VA_ARGS__))
#define FOR_EACH_DELIM_10(what, delimiter, x, ...) what(x) delimiter EXPAND(FOR_EACH_DELIM_09(what, delimiter, __VA_ARGS__))
#define FOR_EACH_DELIM_11(what, delimiter, x, ...) what(x) delimiter EXPAND(FOR_EACH_DELIM_10(what, delimiter, __VA_ARGS__))
#define FOR_EACH_DELIM_12(what, delimiter, x, ...) what(x) delimiter EXPAND(FOR_EACH_DELIM_11(what, delimiter, __VA_ARGS__))
#define FOR_EACH_DELIM_13(what, delimiter, x, ...) what(x) delimiter EXPAND(FOR_EACH_DELIM_12(what, delimiter, __VA_ARGS__))
#define FOR_EACH_DELIM_14(what, delimiter, x, ...) what(x) delimiter EXPAND(FOR_EACH_DELIM_13(what, delimiter, __VA_ARGS__))
#define FOR_EACH_DELIM_15(what, delimiter, x, ...) what(x) delimiter EXPAND(FOR_EACH_DELIM_14(what, delimiter, __VA_ARGS__))
#define FOR_EACH_DELIM_16(what, delimiter, x, ...) what(x) delimiter EXPAND(FOR_EACH_DELIM_15(what, delimiter, __VA_ARGS__))
#define FOR_EACH_DELIM_(N, what, delimiter, ...) EXPAND(CONCATENATE(FOR_EACH_DELIM_, N)(what, delimiter, __VA_ARGS__))
#define FOR_EACH_DELIM(what, delimiter, ...) FOR_EACH_DELIM_(FOR_EACH_NARG(__VA_ARGS__), what, delimiter, __VA_ARGS__)