ArcdpsExtension
 
Loading...
Searching...
No Matches
map.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2012 William Swanson
3 *
4 * Permission is hereby granted, free of charge, to any person
5 * obtaining a copy of this software and associated documentation
6 * files (the "Software"), to deal in the Software without
7 * restriction, including without limitation the rights to use, copy,
8 * modify, merge, publish, distribute, sublicense, and/or sell copies
9 * of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be
13 * included in all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
19 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
20 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 *
23 * Except as contained in this notice, the names of the authors or
24 * their institutions shall not be used in advertising or otherwise to
25 * promote the sale, use or other dealings in this Software without
26 * prior written authorization from the authors.
27 */
28
29#ifndef MAP_H_INCLUDED
30#define MAP_H_INCLUDED
31
32#define EVAL0(...) __VA_ARGS__
33#define EVAL1(...) EVAL0(EVAL0(EVAL0(__VA_ARGS__)))
34#define EVAL2(...) EVAL1(EVAL1(EVAL1(__VA_ARGS__)))
35#define EVAL3(...) EVAL2(EVAL2(EVAL2(__VA_ARGS__)))
36#define EVAL4(...) EVAL3(EVAL3(EVAL3(__VA_ARGS__)))
37#define EVAL5(...) EVAL4(EVAL4(EVAL4(__VA_ARGS__)))
38
39#ifdef _MSC_VER
40// MSVC needs more evaluations
41#define EVAL6(...) EVAL5(EVAL5(EVAL5(__VA_ARGS__)))
42#define EVAL(...) EVAL6(EVAL6(__VA_ARGS__))
43#else
44#define EVAL(...) EVAL5(__VA_ARGS__)
45#endif
46
47#define MAP_END(...)
48#define MAP_OUT
49
50#define EMPTY()
51#define DEFER(id) id EMPTY()
52
53#define MAP_GET_END2() 0, MAP_END
54#define MAP_GET_END1(...) MAP_GET_END2
55#define MAP_GET_END(...) MAP_GET_END1
56#define MAP_NEXT0(test, next, ...) next MAP_OUT
57#define MAP_NEXT1(test, next) DEFER(MAP_NEXT0)(test, next, 0)
58#define MAP_NEXT(test, next) MAP_NEXT1(MAP_GET_END test, next)
59#define MAP_INC(X) MAP_INC_##X
60
61#define MAP0(f, x, peek, ...) f(x) DEFER(MAP_NEXT(peek, MAP1))(f, peek, __VA_ARGS__)
62#define MAP1(f, x, peek, ...) f(x) DEFER(MAP_NEXT(peek, MAP0))(f, peek, __VA_ARGS__)
63
64#define MAP02(f, x, y, peek, ...) f(x, y) DEFER(MAP_NEXT(peek, MAP12))(f, peek, __VA_ARGS__)
65#define MAP12(f, x, y, peek, ...) f(x, y) DEFER(MAP_NEXT(peek, MAP02))(f, peek, __VA_ARGS__)
66
67#define MAP0_UD(f, userdata, x, peek, ...) f(x, userdata) DEFER(MAP_NEXT(peek, MAP1_UD))(f, userdata, peek, __VA_ARGS__)
68#define MAP1_UD(f, userdata, x, peek, ...) f(x, userdata) DEFER(MAP_NEXT(peek, MAP0_UD))(f, userdata, peek, __VA_ARGS__)
69#define MAP0_UD2(f, userdata, x, y, peek, ...) f(x, y, userdata) DEFER(MAP_NEXT(peek, MAP1_UD2))(f, userdata, peek, __VA_ARGS__)
70#define MAP1_UD2(f, userdata, x, y, peek, ...) f(x, y, userdata) DEFER(MAP_NEXT(peek, MAP0_UD2))(f, userdata, peek, __VA_ARGS__)
71
72#define MAP0_UD_I(f, userdata, index, x, peek, ...) f(x, userdata, index) DEFER(MAP_NEXT(peek, MAP1_UD_I))(f, userdata, MAP_INC(index), peek, __VA_ARGS__)
73#define MAP1_UD_I(f, userdata, index, x, peek, ...) f(x, userdata, index) DEFER(MAP_NEXT(peek, MAP0_UD_I))(f, userdata, MAP_INC(index), peek, __VA_ARGS__)
74
75#define MAP_LIST0(f, x, peek, ...) , f(x) DEFER(MAP_NEXT(peek, MAP_LIST1))(f, peek, __VA_ARGS__)
76#define MAP_LIST1(f, x, peek, ...) , f(x) DEFER(MAP_NEXT(peek, MAP_LIST0))(f, peek, __VA_ARGS__)
77#define MAP_LIST2(f, x, peek, ...) f(x) DEFER(MAP_NEXT(peek, MAP_LIST1))(f, peek, __VA_ARGS__)
78
79#define MAP_LIST0_UD(f, userdata, x, peek, ...) , f(x, userdata) DEFER(MAP_NEXT(peek, MAP_LIST1_UD))(f, userdata, peek, __VA_ARGS__)
80#define MAP_LIST1_UD(f, userdata, x, peek, ...) , f(x, userdata) DEFER(MAP_NEXT(peek, MAP_LIST0_UD))(f, userdata, peek, __VA_ARGS__)
81#define MAP_LIST2_UD(f, userdata, x, peek, ...) f(x, userdata) DEFER(MAP_NEXT(peek, MAP_LIST1_UD))(f, userdata, peek, __VA_ARGS__)
82
83#define MAP_LIST0_UD2(f, userdata, x, y, peek, ...) , f(x, y, userdata) DEFER(MAP_NEXT(peek, MAP_LIST1_UD2))(f, userdata, peek, __VA_ARGS__)
84#define MAP_LIST1_UD2(f, userdata, x, y, peek, ...) , f(x, y, userdata) DEFER(MAP_NEXT(peek, MAP_LIST0_UD2))(f, userdata, peek, __VA_ARGS__)
85#define MAP_LIST2_UD2(f, userdata, x, y, peek, ...) f(x, y, userdata) DEFER(MAP_NEXT(peek, MAP_LIST1_UD2))(f, userdata, peek, __VA_ARGS__)
86
87#define MAP_LIST0_UD_I(f, userdata, index, x, peek, ...) , f(x, userdata, index) DEFER(MAP_NEXT(peek, MAP_LIST1_UD_I))(f, userdata, MAP_INC(index), peek, __VA_ARGS__)
88#define MAP_LIST1_UD_I(f, userdata, index, x, peek, ...) , f(x, userdata, index) DEFER(MAP_NEXT(peek, MAP_LIST0_UD_I))(f, userdata, MAP_INC(index), peek, __VA_ARGS__)
89#define MAP_LIST2_UD_I(f, userdata, index, x, peek, ...) f(x, userdata, index) DEFER(MAP_NEXT(peek, MAP_LIST0_UD_I))(f, userdata, MAP_INC(index), peek, __VA_ARGS__)
90
94#define MAP(f, ...) EVAL(MAP1(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0))
95#define MAP2(f, ...) EVAL(MAP12(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0))
96
101#define MAP_LIST(f, ...) EVAL(MAP_LIST2(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0))
102
107#define MAP_UD(f, userdata, ...) EVAL(MAP1_UD(f, userdata, __VA_ARGS__, ()()(), ()()(), ()()(), 0))
108#define MAP_UD2(f, userdata, ...) EVAL(MAP1_UD2(f, userdata, __VA_ARGS__, ()()(), ()()(), ()()(), 0))
109
115#define MAP_LIST_UD(f, userdata, ...) EVAL(MAP_LIST2_UD(f, userdata, __VA_ARGS__, ()()(), ()()(), ()()(), 0))
116#define MAP_LIST_UD2(f, userdata, ...) EVAL(MAP_LIST2_UD2(f, userdata, __VA_ARGS__, ()()(), ()()(), ()()(), 0))
117
123#define MAP_UD_I(f, userdata, ...) EVAL(MAP1_UD_I(f, userdata, 0, __VA_ARGS__, ()()(), ()()(), ()()(), 0))
124
130#define MAP_LIST_UD_I(f, userdata, ...) EVAL(MAP_LIST2_UD_I(f, userdata, 0, __VA_ARGS__, ()()(), ()()(), ()()(), 0))
131
132/*
133 * Because the preprocessor can't do arithmetic that produces integer literals for the *_I macros, we have to do it manually.
134 * Since the number of parameters is limited anyways, this is sufficient for all cases. If extra EVAL layers are added, these
135 * definitions have to be extended. This is equivalent to the way Boost.preprocessor does it:
136 * https://github.com/boostorg/preprocessor/blob/develop/include/boost/preprocessor/arithmetic/inc.hpp
137 * The *_I macros could alternatively pass C expressions such as (0), (0+1), (0+1+1...) to the user macro, but passing 0, 1, 2 ...
138 * allows the user to incorporate the index into C identifiers, e.g. to define a function like test_##index () for each
139 * macro invocation.
140 */
141#define MAP_INC_0 1
142#define MAP_INC_1 2
143#define MAP_INC_2 3
144#define MAP_INC_3 4
145#define MAP_INC_4 5
146#define MAP_INC_5 6
147#define MAP_INC_6 7
148#define MAP_INC_7 8
149#define MAP_INC_8 9
150#define MAP_INC_9 10
151#define MAP_INC_10 11
152#define MAP_INC_11 12
153#define MAP_INC_12 13
154#define MAP_INC_13 14
155#define MAP_INC_14 15
156#define MAP_INC_15 16
157#define MAP_INC_16 17
158#define MAP_INC_17 18
159#define MAP_INC_18 19
160#define MAP_INC_19 20
161#define MAP_INC_20 21
162#define MAP_INC_21 22
163#define MAP_INC_22 23
164#define MAP_INC_23 24
165#define MAP_INC_24 25
166#define MAP_INC_25 26
167#define MAP_INC_26 27
168#define MAP_INC_27 28
169#define MAP_INC_28 29
170#define MAP_INC_29 30
171#define MAP_INC_30 31
172#define MAP_INC_31 32
173#define MAP_INC_32 33
174#define MAP_INC_33 34
175#define MAP_INC_34 35
176#define MAP_INC_35 36
177#define MAP_INC_36 37
178#define MAP_INC_37 38
179#define MAP_INC_38 39
180#define MAP_INC_39 40
181#define MAP_INC_40 41
182#define MAP_INC_41 42
183#define MAP_INC_42 43
184#define MAP_INC_43 44
185#define MAP_INC_44 45
186#define MAP_INC_45 46
187#define MAP_INC_46 47
188#define MAP_INC_47 48
189#define MAP_INC_48 49
190#define MAP_INC_49 50
191#define MAP_INC_50 51
192#define MAP_INC_51 52
193#define MAP_INC_52 53
194#define MAP_INC_53 54
195#define MAP_INC_54 55
196#define MAP_INC_55 56
197#define MAP_INC_56 57
198#define MAP_INC_57 58
199#define MAP_INC_58 59
200#define MAP_INC_59 60
201#define MAP_INC_60 61
202#define MAP_INC_61 62
203#define MAP_INC_62 63
204#define MAP_INC_63 64
205#define MAP_INC_64 65
206#define MAP_INC_65 66
207#define MAP_INC_66 67
208#define MAP_INC_67 68
209#define MAP_INC_68 69
210#define MAP_INC_69 70
211#define MAP_INC_70 71
212#define MAP_INC_71 72
213#define MAP_INC_72 73
214#define MAP_INC_73 74
215#define MAP_INC_74 75
216#define MAP_INC_75 76
217#define MAP_INC_76 77
218#define MAP_INC_77 78
219#define MAP_INC_78 79
220#define MAP_INC_79 80
221#define MAP_INC_80 81
222#define MAP_INC_81 82
223#define MAP_INC_82 83
224#define MAP_INC_83 84
225#define MAP_INC_84 85
226#define MAP_INC_85 86
227#define MAP_INC_86 87
228#define MAP_INC_87 88
229#define MAP_INC_88 89
230#define MAP_INC_89 90
231#define MAP_INC_90 91
232#define MAP_INC_91 92
233#define MAP_INC_92 93
234#define MAP_INC_93 94
235#define MAP_INC_94 95
236#define MAP_INC_95 96
237#define MAP_INC_96 97
238#define MAP_INC_97 98
239#define MAP_INC_98 99
240#define MAP_INC_99 100
241#define MAP_INC_100 101
242#define MAP_INC_101 102
243#define MAP_INC_102 103
244#define MAP_INC_103 104
245#define MAP_INC_104 105
246#define MAP_INC_105 106
247#define MAP_INC_106 107
248#define MAP_INC_107 108
249#define MAP_INC_108 109
250#define MAP_INC_109 110
251#define MAP_INC_110 111
252#define MAP_INC_111 112
253#define MAP_INC_112 113
254#define MAP_INC_113 114
255#define MAP_INC_114 115
256#define MAP_INC_115 116
257#define MAP_INC_116 117
258#define MAP_INC_117 118
259#define MAP_INC_118 119
260#define MAP_INC_119 120
261#define MAP_INC_120 121
262#define MAP_INC_121 122
263#define MAP_INC_122 123
264#define MAP_INC_123 124
265#define MAP_INC_124 125
266#define MAP_INC_125 126
267#define MAP_INC_126 127
268#define MAP_INC_127 128
269#define MAP_INC_128 129
270#define MAP_INC_129 130
271#define MAP_INC_130 131
272#define MAP_INC_131 132
273#define MAP_INC_132 133
274#define MAP_INC_133 134
275#define MAP_INC_134 135
276#define MAP_INC_135 136
277#define MAP_INC_136 137
278#define MAP_INC_137 138
279#define MAP_INC_138 139
280#define MAP_INC_139 140
281#define MAP_INC_140 141
282#define MAP_INC_141 142
283#define MAP_INC_142 143
284#define MAP_INC_143 144
285#define MAP_INC_144 145
286#define MAP_INC_145 146
287#define MAP_INC_146 147
288#define MAP_INC_147 148
289#define MAP_INC_148 149
290#define MAP_INC_149 150
291#define MAP_INC_150 151
292#define MAP_INC_151 152
293#define MAP_INC_152 153
294#define MAP_INC_153 154
295#define MAP_INC_154 155
296#define MAP_INC_155 156
297#define MAP_INC_156 157
298#define MAP_INC_157 158
299#define MAP_INC_158 159
300#define MAP_INC_159 160
301#define MAP_INC_160 161
302#define MAP_INC_161 162
303#define MAP_INC_162 163
304#define MAP_INC_163 164
305#define MAP_INC_164 165
306#define MAP_INC_165 166
307#define MAP_INC_166 167
308#define MAP_INC_167 168
309#define MAP_INC_168 169
310#define MAP_INC_169 170
311#define MAP_INC_170 171
312#define MAP_INC_171 172
313#define MAP_INC_172 173
314#define MAP_INC_173 174
315#define MAP_INC_174 175
316#define MAP_INC_175 176
317#define MAP_INC_176 177
318#define MAP_INC_177 178
319#define MAP_INC_178 179
320#define MAP_INC_179 180
321#define MAP_INC_180 181
322#define MAP_INC_181 182
323#define MAP_INC_182 183
324#define MAP_INC_183 184
325#define MAP_INC_184 185
326#define MAP_INC_185 186
327#define MAP_INC_186 187
328#define MAP_INC_187 188
329#define MAP_INC_188 189
330#define MAP_INC_189 190
331#define MAP_INC_190 191
332#define MAP_INC_191 192
333#define MAP_INC_192 193
334#define MAP_INC_193 194
335#define MAP_INC_194 195
336#define MAP_INC_195 196
337#define MAP_INC_196 197
338#define MAP_INC_197 198
339#define MAP_INC_198 199
340#define MAP_INC_199 200
341#define MAP_INC_200 201
342#define MAP_INC_201 202
343#define MAP_INC_202 203
344#define MAP_INC_203 204
345#define MAP_INC_204 205
346#define MAP_INC_205 206
347#define MAP_INC_206 207
348#define MAP_INC_207 208
349#define MAP_INC_208 209
350#define MAP_INC_209 210
351#define MAP_INC_210 211
352#define MAP_INC_211 212
353#define MAP_INC_212 213
354#define MAP_INC_213 214
355#define MAP_INC_214 215
356#define MAP_INC_215 216
357#define MAP_INC_216 217
358#define MAP_INC_217 218
359#define MAP_INC_218 219
360#define MAP_INC_219 220
361#define MAP_INC_220 221
362#define MAP_INC_221 222
363#define MAP_INC_222 223
364#define MAP_INC_223 224
365#define MAP_INC_224 225
366#define MAP_INC_225 226
367#define MAP_INC_226 227
368#define MAP_INC_227 228
369#define MAP_INC_228 229
370#define MAP_INC_229 230
371#define MAP_INC_230 231
372#define MAP_INC_231 232
373#define MAP_INC_232 233
374#define MAP_INC_233 234
375#define MAP_INC_234 235
376#define MAP_INC_235 236
377#define MAP_INC_236 237
378#define MAP_INC_237 238
379#define MAP_INC_238 239
380#define MAP_INC_239 240
381#define MAP_INC_240 241
382#define MAP_INC_241 242
383#define MAP_INC_242 243
384#define MAP_INC_243 244
385#define MAP_INC_244 245
386#define MAP_INC_245 246
387#define MAP_INC_246 247
388#define MAP_INC_247 248
389#define MAP_INC_248 249
390#define MAP_INC_249 250
391#define MAP_INC_250 251
392#define MAP_INC_251 252
393#define MAP_INC_252 253
394#define MAP_INC_253 254
395#define MAP_INC_254 255
396#define MAP_INC_255 256
397#define MAP_INC_256 257
398#define MAP_INC_257 258
399#define MAP_INC_258 259
400#define MAP_INC_259 260
401#define MAP_INC_260 261
402#define MAP_INC_261 262
403#define MAP_INC_262 263
404#define MAP_INC_263 264
405#define MAP_INC_264 265
406#define MAP_INC_265 266
407#define MAP_INC_266 267
408#define MAP_INC_267 268
409#define MAP_INC_268 269
410#define MAP_INC_269 270
411#define MAP_INC_270 271
412#define MAP_INC_271 272
413#define MAP_INC_272 273
414#define MAP_INC_273 274
415#define MAP_INC_274 275
416#define MAP_INC_275 276
417#define MAP_INC_276 277
418#define MAP_INC_277 278
419#define MAP_INC_278 279
420#define MAP_INC_279 280
421#define MAP_INC_280 281
422#define MAP_INC_281 282
423#define MAP_INC_282 283
424#define MAP_INC_283 284
425#define MAP_INC_284 285
426#define MAP_INC_285 286
427#define MAP_INC_286 287
428#define MAP_INC_287 288
429#define MAP_INC_288 289
430#define MAP_INC_289 290
431#define MAP_INC_290 291
432#define MAP_INC_291 292
433#define MAP_INC_292 293
434#define MAP_INC_293 294
435#define MAP_INC_294 295
436#define MAP_INC_295 296
437#define MAP_INC_296 297
438#define MAP_INC_297 298
439#define MAP_INC_298 299
440#define MAP_INC_299 300
441#define MAP_INC_300 301
442#define MAP_INC_301 302
443#define MAP_INC_302 303
444#define MAP_INC_303 304
445#define MAP_INC_304 305
446#define MAP_INC_305 306
447#define MAP_INC_306 307
448#define MAP_INC_307 308
449#define MAP_INC_308 309
450#define MAP_INC_309 310
451#define MAP_INC_310 311
452#define MAP_INC_311 312
453#define MAP_INC_312 313
454#define MAP_INC_313 314
455#define MAP_INC_314 315
456#define MAP_INC_315 316
457#define MAP_INC_316 317
458#define MAP_INC_317 318
459#define MAP_INC_318 319
460#define MAP_INC_319 320
461#define MAP_INC_320 321
462#define MAP_INC_321 322
463#define MAP_INC_322 323
464#define MAP_INC_323 324
465#define MAP_INC_324 325
466#define MAP_INC_325 326
467#define MAP_INC_326 327
468#define MAP_INC_327 328
469#define MAP_INC_328 329
470#define MAP_INC_329 330
471#define MAP_INC_330 331
472#define MAP_INC_331 332
473#define MAP_INC_332 333
474#define MAP_INC_333 334
475#define MAP_INC_334 335
476#define MAP_INC_335 336
477#define MAP_INC_336 337
478#define MAP_INC_337 338
479#define MAP_INC_338 339
480#define MAP_INC_339 340
481#define MAP_INC_340 341
482#define MAP_INC_341 342
483#define MAP_INC_342 343
484#define MAP_INC_343 344
485#define MAP_INC_344 345
486#define MAP_INC_345 346
487#define MAP_INC_346 347
488#define MAP_INC_347 348
489#define MAP_INC_348 349
490#define MAP_INC_349 350
491#define MAP_INC_350 351
492#define MAP_INC_351 352
493#define MAP_INC_352 353
494#define MAP_INC_353 354
495#define MAP_INC_354 355
496#define MAP_INC_355 356
497#define MAP_INC_356 357
498#define MAP_INC_357 358
499#define MAP_INC_358 359
500#define MAP_INC_359 360
501#define MAP_INC_360 361
502#define MAP_INC_361 362
503#define MAP_INC_362 363
504#define MAP_INC_363 364
505#define MAP_INC_364 365
506#define MAP_INC_365 366
507
508
509#endif