forked from ares-emulator/ares
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcase-range.hpp
279 lines (275 loc) · 15.3 KB
/
case-range.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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
#pragma once
//GNU case range extension simulated with preprocessor macros
//
// usage expands to
// ------------------ -----------------------------------
// caseN(X): => case X:
// case X + 1:
// ...
// case X + N - 1:
//
// case rangeN(X, Y): => case X:
// static_assert(Y - X + 1 == N);
// case X + 1:
// ...
// case Y:
//
//the range macro more closely resembles the GNU extension syntax at the cost of
//redundancy. it embeds a static assert between the first two case labels to
//ensure consistency between the chosen macro and the provided macro arguments.
#define check_case_range(x, y, n) static_assert((y) - (x) + 1 == n, "range does not contain " #n " elements"); [[fallthrough]];
#define case1(x) case (x)
#define case2(x) case1(x): case1((x) + 1)
#define case3(x) case1(x): case2((x) + 1)
#define case4(x) case2(x): case2((x) + 2)
#define case5(x) case2(x): case3((x) + 2)
#define case6(x) case3(x): case3((x) + 3)
#define case7(x) case3(x): case4((x) + 3)
#define case8(x) case4(x): case4((x) + 4)
#define case9(x) case4(x): case5((x) + 4)
#define case10(x) case5(x): case5((x) + 5)
#define case11(x) case5(x): case6((x) + 5)
#define case12(x) case6(x): case6((x) + 6)
#define case13(x) case6(x): case7((x) + 6)
#define case14(x) case7(x): case7((x) + 7)
#define case15(x) case7(x): case8((x) + 7)
#define case16(x) case8(x): case8((x) + 8)
#define case17(x) case8(x): case9((x) + 8)
#define case18(x) case9(x): case9((x) + 9)
#define case19(x) case9(x): case10((x) + 9)
#define case20(x) case10(x): case10((x) + 10)
#define case21(x) case10(x): case11((x) + 10)
#define case22(x) case11(x): case11((x) + 11)
#define case23(x) case11(x): case12((x) + 11)
#define case24(x) case12(x): case12((x) + 12)
#define case25(x) case12(x): case13((x) + 12)
#define case26(x) case13(x): case13((x) + 13)
#define case27(x) case13(x): case14((x) + 13)
#define case28(x) case14(x): case14((x) + 14)
#define case29(x) case14(x): case15((x) + 14)
#define case30(x) case15(x): case15((x) + 15)
#define case31(x) case15(x): case16((x) + 15)
#define case32(x) case16(x): case16((x) + 16)
#define case33(x) case16(x): case17((x) + 16)
#define case34(x) case17(x): case17((x) + 17)
#define case35(x) case17(x): case18((x) + 17)
#define case36(x) case18(x): case18((x) + 18)
#define case37(x) case18(x): case19((x) + 18)
#define case38(x) case19(x): case19((x) + 19)
#define case39(x) case19(x): case20((x) + 19)
#define case40(x) case20(x): case20((x) + 20)
#define case41(x) case20(x): case21((x) + 20)
#define case42(x) case21(x): case21((x) + 21)
#define case43(x) case21(x): case22((x) + 21)
#define case44(x) case22(x): case22((x) + 22)
#define case45(x) case22(x): case23((x) + 22)
#define case46(x) case23(x): case23((x) + 23)
#define case47(x) case23(x): case24((x) + 23)
#define case48(x) case24(x): case24((x) + 24)
#define case49(x) case24(x): case25((x) + 24)
#define case50(x) case25(x): case25((x) + 25)
#define case51(x) case25(x): case26((x) + 25)
#define case52(x) case26(x): case26((x) + 26)
#define case53(x) case26(x): case27((x) + 26)
#define case54(x) case27(x): case27((x) + 27)
#define case55(x) case27(x): case28((x) + 27)
#define case56(x) case28(x): case28((x) + 28)
#define case57(x) case28(x): case29((x) + 28)
#define case58(x) case29(x): case29((x) + 29)
#define case59(x) case29(x): case30((x) + 29)
#define case60(x) case30(x): case30((x) + 30)
#define case61(x) case30(x): case31((x) + 30)
#define case62(x) case31(x): case31((x) + 31)
#define case63(x) case31(x): case32((x) + 31)
#define case64(x) case32(x): case32((x) + 32)
#define case65(x) case32(x): case33((x) + 32)
#define case66(x) case33(x): case33((x) + 33)
#define case67(x) case33(x): case34((x) + 33)
#define case68(x) case34(x): case34((x) + 34)
#define case69(x) case34(x): case35((x) + 34)
#define case70(x) case35(x): case35((x) + 35)
#define case71(x) case35(x): case36((x) + 35)
#define case72(x) case36(x): case36((x) + 36)
#define case73(x) case36(x): case37((x) + 36)
#define case74(x) case37(x): case37((x) + 37)
#define case75(x) case37(x): case38((x) + 37)
#define case76(x) case38(x): case38((x) + 38)
#define case77(x) case38(x): case39((x) + 38)
#define case78(x) case39(x): case39((x) + 39)
#define case79(x) case39(x): case40((x) + 39)
#define case80(x) case40(x): case40((x) + 40)
#define case81(x) case40(x): case41((x) + 40)
#define case82(x) case41(x): case41((x) + 41)
#define case83(x) case41(x): case42((x) + 41)
#define case84(x) case42(x): case42((x) + 42)
#define case85(x) case42(x): case43((x) + 42)
#define case86(x) case43(x): case43((x) + 43)
#define case87(x) case43(x): case44((x) + 43)
#define case88(x) case44(x): case44((x) + 44)
#define case89(x) case44(x): case45((x) + 44)
#define case90(x) case45(x): case45((x) + 45)
#define case91(x) case45(x): case46((x) + 45)
#define case92(x) case46(x): case46((x) + 46)
#define case93(x) case46(x): case47((x) + 46)
#define case94(x) case47(x): case47((x) + 47)
#define case95(x) case47(x): case48((x) + 47)
#define case96(x) case48(x): case48((x) + 48)
#define case97(x) case48(x): case49((x) + 48)
#define case98(x) case49(x): case49((x) + 49)
#define case99(x) case49(x): case50((x) + 49)
#define case100(x) case50(x): case50((x) + 50)
#define case101(x) case50(x): case51((x) + 50)
#define case102(x) case51(x): case51((x) + 51)
#define case103(x) case51(x): case52((x) + 51)
#define case104(x) case52(x): case52((x) + 52)
#define case105(x) case52(x): case53((x) + 52)
#define case106(x) case53(x): case53((x) + 53)
#define case107(x) case53(x): case54((x) + 53)
#define case108(x) case54(x): case54((x) + 54)
#define case109(x) case54(x): case55((x) + 54)
#define case110(x) case55(x): case55((x) + 55)
#define case111(x) case55(x): case56((x) + 55)
#define case112(x) case56(x): case56((x) + 56)
#define case113(x) case56(x): case57((x) + 56)
#define case114(x) case57(x): case57((x) + 57)
#define case115(x) case57(x): case58((x) + 57)
#define case116(x) case58(x): case58((x) + 58)
#define case117(x) case58(x): case59((x) + 58)
#define case118(x) case59(x): case59((x) + 59)
#define case119(x) case59(x): case60((x) + 59)
#define case120(x) case60(x): case60((x) + 60)
#define case121(x) case60(x): case61((x) + 60)
#define case122(x) case61(x): case61((x) + 61)
#define case123(x) case61(x): case62((x) + 61)
#define case124(x) case62(x): case62((x) + 62)
#define case125(x) case62(x): case63((x) + 62)
#define case126(x) case63(x): case63((x) + 63)
#define case127(x) case63(x): case64((x) + 63)
#define case128(x) case64(x): case64((x) + 64)
#define range2(x, y) (x): check_case_range(x, y, 2) case1((x) + 1)
#define range3(x, y) (x): check_case_range(x, y, 3) case2((x) + 1)
#define range4(x, y) (x): check_case_range(x, y, 4) case3((x) + 1)
#define range5(x, y) (x): check_case_range(x, y, 5) case4((x) + 1)
#define range6(x, y) (x): check_case_range(x, y, 6) case5((x) + 1)
#define range7(x, y) (x): check_case_range(x, y, 7) case6((x) + 1)
#define range8(x, y) (x): check_case_range(x, y, 8) case7((x) + 1)
#define range9(x, y) (x): check_case_range(x, y, 9) case8((x) + 1)
#define range10(x, y) (x): check_case_range(x, y, 10) case9((x) + 1)
#define range11(x, y) (x): check_case_range(x, y, 11) case10((x) + 1)
#define range12(x, y) (x): check_case_range(x, y, 12) case11((x) + 1)
#define range13(x, y) (x): check_case_range(x, y, 13) case12((x) + 1)
#define range14(x, y) (x): check_case_range(x, y, 14) case13((x) + 1)
#define range15(x, y) (x): check_case_range(x, y, 15) case14((x) + 1)
#define range16(x, y) (x): check_case_range(x, y, 16) case15((x) + 1)
#define range17(x, y) (x): check_case_range(x, y, 17) case16((x) + 1)
#define range18(x, y) (x): check_case_range(x, y, 18) case17((x) + 1)
#define range19(x, y) (x): check_case_range(x, y, 19) case18((x) + 1)
#define range20(x, y) (x): check_case_range(x, y, 20) case19((x) + 1)
#define range21(x, y) (x): check_case_range(x, y, 21) case20((x) + 1)
#define range22(x, y) (x): check_case_range(x, y, 22) case21((x) + 1)
#define range23(x, y) (x): check_case_range(x, y, 23) case22((x) + 1)
#define range24(x, y) (x): check_case_range(x, y, 24) case23((x) + 1)
#define range25(x, y) (x): check_case_range(x, y, 25) case24((x) + 1)
#define range26(x, y) (x): check_case_range(x, y, 26) case25((x) + 1)
#define range27(x, y) (x): check_case_range(x, y, 27) case26((x) + 1)
#define range28(x, y) (x): check_case_range(x, y, 28) case27((x) + 1)
#define range29(x, y) (x): check_case_range(x, y, 29) case28((x) + 1)
#define range30(x, y) (x): check_case_range(x, y, 30) case29((x) + 1)
#define range31(x, y) (x): check_case_range(x, y, 31) case30((x) + 1)
#define range32(x, y) (x): check_case_range(x, y, 32) case31((x) + 1)
#define range33(x, y) (x): check_case_range(x, y, 33) case32((x) + 1)
#define range34(x, y) (x): check_case_range(x, y, 34) case33((x) + 1)
#define range35(x, y) (x): check_case_range(x, y, 35) case34((x) + 1)
#define range36(x, y) (x): check_case_range(x, y, 36) case35((x) + 1)
#define range37(x, y) (x): check_case_range(x, y, 37) case36((x) + 1)
#define range38(x, y) (x): check_case_range(x, y, 38) case37((x) + 1)
#define range39(x, y) (x): check_case_range(x, y, 39) case38((x) + 1)
#define range40(x, y) (x): check_case_range(x, y, 40) case39((x) + 1)
#define range41(x, y) (x): check_case_range(x, y, 41) case40((x) + 1)
#define range42(x, y) (x): check_case_range(x, y, 42) case41((x) + 1)
#define range43(x, y) (x): check_case_range(x, y, 43) case42((x) + 1)
#define range44(x, y) (x): check_case_range(x, y, 44) case43((x) + 1)
#define range45(x, y) (x): check_case_range(x, y, 45) case44((x) + 1)
#define range46(x, y) (x): check_case_range(x, y, 46) case45((x) + 1)
#define range47(x, y) (x): check_case_range(x, y, 47) case46((x) + 1)
#define range48(x, y) (x): check_case_range(x, y, 48) case47((x) + 1)
#define range49(x, y) (x): check_case_range(x, y, 49) case48((x) + 1)
#define range50(x, y) (x): check_case_range(x, y, 50) case49((x) + 1)
#define range51(x, y) (x): check_case_range(x, y, 51) case50((x) + 1)
#define range52(x, y) (x): check_case_range(x, y, 52) case51((x) + 1)
#define range53(x, y) (x): check_case_range(x, y, 53) case52((x) + 1)
#define range54(x, y) (x): check_case_range(x, y, 54) case53((x) + 1)
#define range55(x, y) (x): check_case_range(x, y, 55) case54((x) + 1)
#define range56(x, y) (x): check_case_range(x, y, 56) case55((x) + 1)
#define range57(x, y) (x): check_case_range(x, y, 57) case56((x) + 1)
#define range58(x, y) (x): check_case_range(x, y, 58) case57((x) + 1)
#define range59(x, y) (x): check_case_range(x, y, 59) case58((x) + 1)
#define range60(x, y) (x): check_case_range(x, y, 60) case59((x) + 1)
#define range61(x, y) (x): check_case_range(x, y, 61) case60((x) + 1)
#define range62(x, y) (x): check_case_range(x, y, 62) case61((x) + 1)
#define range63(x, y) (x): check_case_range(x, y, 63) case62((x) + 1)
#define range64(x, y) (x): check_case_range(x, y, 64) case63((x) + 1)
#define range65(x, y) (x): check_case_range(x, y, 65) case64((x) + 1)
#define range66(x, y) (x): check_case_range(x, y, 66) case65((x) + 1)
#define range67(x, y) (x): check_case_range(x, y, 67) case66((x) + 1)
#define range68(x, y) (x): check_case_range(x, y, 68) case67((x) + 1)
#define range69(x, y) (x): check_case_range(x, y, 69) case68((x) + 1)
#define range70(x, y) (x): check_case_range(x, y, 70) case69((x) + 1)
#define range71(x, y) (x): check_case_range(x, y, 71) case70((x) + 1)
#define range72(x, y) (x): check_case_range(x, y, 72) case71((x) + 1)
#define range73(x, y) (x): check_case_range(x, y, 73) case72((x) + 1)
#define range74(x, y) (x): check_case_range(x, y, 74) case73((x) + 1)
#define range75(x, y) (x): check_case_range(x, y, 75) case74((x) + 1)
#define range76(x, y) (x): check_case_range(x, y, 76) case75((x) + 1)
#define range77(x, y) (x): check_case_range(x, y, 77) case76((x) + 1)
#define range78(x, y) (x): check_case_range(x, y, 78) case77((x) + 1)
#define range79(x, y) (x): check_case_range(x, y, 79) case78((x) + 1)
#define range80(x, y) (x): check_case_range(x, y, 80) case79((x) + 1)
#define range81(x, y) (x): check_case_range(x, y, 81) case80((x) + 1)
#define range82(x, y) (x): check_case_range(x, y, 82) case81((x) + 1)
#define range83(x, y) (x): check_case_range(x, y, 83) case82((x) + 1)
#define range84(x, y) (x): check_case_range(x, y, 84) case83((x) + 1)
#define range85(x, y) (x): check_case_range(x, y, 85) case84((x) + 1)
#define range86(x, y) (x): check_case_range(x, y, 86) case85((x) + 1)
#define range87(x, y) (x): check_case_range(x, y, 87) case86((x) + 1)
#define range88(x, y) (x): check_case_range(x, y, 88) case87((x) + 1)
#define range89(x, y) (x): check_case_range(x, y, 89) case88((x) + 1)
#define range90(x, y) (x): check_case_range(x, y, 90) case89((x) + 1)
#define range91(x, y) (x): check_case_range(x, y, 91) case90((x) + 1)
#define range92(x, y) (x): check_case_range(x, y, 92) case91((x) + 1)
#define range93(x, y) (x): check_case_range(x, y, 93) case92((x) + 1)
#define range94(x, y) (x): check_case_range(x, y, 94) case93((x) + 1)
#define range95(x, y) (x): check_case_range(x, y, 95) case94((x) + 1)
#define range96(x, y) (x): check_case_range(x, y, 96) case95((x) + 1)
#define range97(x, y) (x): check_case_range(x, y, 97) case96((x) + 1)
#define range98(x, y) (x): check_case_range(x, y, 98) case97((x) + 1)
#define range99(x, y) (x): check_case_range(x, y, 99) case98((x) + 1)
#define range100(x, y) (x): check_case_range(x, y, 100) case99((x) + 1)
#define range101(x, y) (x): check_case_range(x, y, 101) case100((x) + 1)
#define range102(x, y) (x): check_case_range(x, y, 102) case101((x) + 1)
#define range103(x, y) (x): check_case_range(x, y, 103) case102((x) + 1)
#define range104(x, y) (x): check_case_range(x, y, 104) case103((x) + 1)
#define range105(x, y) (x): check_case_range(x, y, 105) case104((x) + 1)
#define range106(x, y) (x): check_case_range(x, y, 106) case105((x) + 1)
#define range107(x, y) (x): check_case_range(x, y, 107) case106((x) + 1)
#define range108(x, y) (x): check_case_range(x, y, 108) case107((x) + 1)
#define range109(x, y) (x): check_case_range(x, y, 109) case108((x) + 1)
#define range110(x, y) (x): check_case_range(x, y, 110) case109((x) + 1)
#define range111(x, y) (x): check_case_range(x, y, 111) case110((x) + 1)
#define range112(x, y) (x): check_case_range(x, y, 112) case111((x) + 1)
#define range113(x, y) (x): check_case_range(x, y, 113) case112((x) + 1)
#define range114(x, y) (x): check_case_range(x, y, 114) case113((x) + 1)
#define range115(x, y) (x): check_case_range(x, y, 115) case114((x) + 1)
#define range116(x, y) (x): check_case_range(x, y, 116) case115((x) + 1)
#define range117(x, y) (x): check_case_range(x, y, 117) case116((x) + 1)
#define range118(x, y) (x): check_case_range(x, y, 118) case117((x) + 1)
#define range119(x, y) (x): check_case_range(x, y, 119) case118((x) + 1)
#define range120(x, y) (x): check_case_range(x, y, 120) case119((x) + 1)
#define range121(x, y) (x): check_case_range(x, y, 121) case120((x) + 1)
#define range122(x, y) (x): check_case_range(x, y, 122) case121((x) + 1)
#define range123(x, y) (x): check_case_range(x, y, 123) case122((x) + 1)
#define range124(x, y) (x): check_case_range(x, y, 124) case123((x) + 1)
#define range125(x, y) (x): check_case_range(x, y, 125) case124((x) + 1)
#define range126(x, y) (x): check_case_range(x, y, 126) case125((x) + 1)
#define range127(x, y) (x): check_case_range(x, y, 127) case126((x) + 1)
#define range128(x, y) (x): check_case_range(x, y, 128) case127((x) + 1)