1#pragma once
2
3// https://stackoverflow.com/a/26408195/9275661
4#define __NARG__(...) __NARG_I_(__VA_ARGS__, __RSEQ_N())
5#define __NARG_I_(...) __ARG_N(__VA_ARGS__)
6#define __ARG_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, \
7 _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \
8 _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, \
9 _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, N, ...) \
10 N
11#define __RSEQ_N() \
12 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, \
13 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, \
14 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
15#define _VFUNC_(name, n) name##n
16#define _VFUNC(name, n) _VFUNC_(name, n)
17#define VFUNC(func, ...) _VFUNC(func, __NARG__(__VA_ARGS__))
18
19// https://stackoverflow.com/a/11994395/9275661
20// adjusted to keep the first parameter the same for all "recursive" calls,
21// used to pass the class name to NERVE_MAKE macros
22#define FE_0(WHAT)
23#define FE_1(WHAT, X0, X1) WHAT(X0, X1)
24#define FE_2(WHAT, X0, X1, ...) WHAT(X0, X1) FE_1(WHAT, X0, __VA_ARGS__)
25#define FE_3(WHAT, X0, X1, ...) WHAT(X0, X1) FE_2(WHAT, X0, __VA_ARGS__)
26#define FE_4(WHAT, X0, X1, ...) WHAT(X0, X1) FE_3(WHAT, X0, __VA_ARGS__)
27#define FE_5(WHAT, X0, X1, ...) WHAT(X0, X1) FE_4(WHAT, X0, __VA_ARGS__)
28#define FE_6(WHAT, X0, X1, ...) WHAT(X0, X1) FE_5(WHAT, X0, __VA_ARGS__)
29#define FE_7(WHAT, X0, X1, ...) WHAT(X0, X1) FE_6(WHAT, X0, __VA_ARGS__)
30#define FE_8(WHAT, X0, X1, ...) WHAT(X0, X1) FE_7(WHAT, X0, __VA_ARGS__)
31#define FE_9(WHAT, X0, X1, ...) WHAT(X0, X1) FE_8(WHAT, X0, __VA_ARGS__)
32#define FE_10(WHAT, X0, X1, ...) WHAT(X0, X1) FE_9(WHAT, X0, __VA_ARGS__)
33#define FE_11(WHAT, X0, X1, ...) WHAT(X0, X1) FE_10(WHAT, X0, __VA_ARGS__)
34#define FE_12(WHAT, X0, X1, ...) WHAT(X0, X1) FE_11(WHAT, X0, __VA_ARGS__)
35#define FE_13(WHAT, X0, X1, ...) WHAT(X0, X1) FE_12(WHAT, X0, __VA_ARGS__)
36#define FE_14(WHAT, X0, X1, ...) WHAT(X0, X1) FE_13(WHAT, X0, __VA_ARGS__)
37#define FE_15(WHAT, X0, X1, ...) WHAT(X0, X1) FE_14(WHAT, X0, __VA_ARGS__)
38#define FE_16(WHAT, X0, X1, ...) WHAT(X0, X1) FE_15(WHAT, X0, __VA_ARGS__)
39#define FE_17(WHAT, X0, X1, ...) WHAT(X0, X1) FE_16(WHAT, X0, __VA_ARGS__)
40#define FE_18(WHAT, X0, X1, ...) WHAT(X0, X1) FE_17(WHAT, X0, __VA_ARGS__)
41#define FE_19(WHAT, X0, X1, ...) WHAT(X0, X1) FE_18(WHAT, X0, __VA_ARGS__)
42#define FE_20(WHAT, X0, X1, ...) WHAT(X0, X1) FE_19(WHAT, X0, __VA_ARGS__)
43#define FE_21(WHAT, X0, X1, ...) WHAT(X0, X1) FE_20(WHAT, X0, __VA_ARGS__)
44#define FE_22(WHAT, X0, X1, ...) WHAT(X0, X1) FE_21(WHAT, X0, __VA_ARGS__)
45#define FE_23(WHAT, X0, X1, ...) WHAT(X0, X1) FE_22(WHAT, X0, __VA_ARGS__)
46#define FE_24(WHAT, X0, X1, ...) WHAT(X0, X1) FE_23(WHAT, X0, __VA_ARGS__)
47#define FE_25(WHAT, X0, X1, ...) WHAT(X0, X1) FE_24(WHAT, X0, __VA_ARGS__)
48#define FE_26(WHAT, X0, X1, ...) WHAT(X0, X1) FE_25(WHAT, X0, __VA_ARGS__)
49#define FE_27(WHAT, X0, X1, ...) WHAT(X0, X1) FE_26(WHAT, X0, __VA_ARGS__)
50#define FE_28(WHAT, X0, X1, ...) WHAT(X0, X1) FE_27(WHAT, X0, __VA_ARGS__)
51#define FE_29(WHAT, X0, X1, ...) WHAT(X0, X1) FE_28(WHAT, X0, __VA_ARGS__)
52#define FE_30(WHAT, X0, X1, ...) WHAT(X0, X1) FE_29(WHAT, X0, __VA_ARGS__)
53#define FE_31(WHAT, X0, X1, ...) WHAT(X0, X1) FE_30(WHAT, X0, __VA_ARGS__)
54#define FE_32(WHAT, X0, X1, ...) WHAT(X0, X1) FE_31(WHAT, X0, __VA_ARGS__)
55#define FE_33(WHAT, X0, X1, ...) WHAT(X0, X1) FE_32(WHAT, X0, __VA_ARGS__)
56#define FE_34(WHAT, X0, X1, ...) WHAT(X0, X1) FE_33(WHAT, X0, __VA_ARGS__)
57#define FE_35(WHAT, X0, X1, ...) WHAT(X0, X1) FE_34(WHAT, X0, __VA_ARGS__)
58#define FE_36(WHAT, X0, X1, ...) WHAT(X0, X1) FE_35(WHAT, X0, __VA_ARGS__)
59#define FE_37(WHAT, X0, X1, ...) WHAT(X0, X1) FE_36(WHAT, X0, __VA_ARGS__)
60#define FE_38(WHAT, X0, X1, ...) WHAT(X0, X1) FE_37(WHAT, X0, __VA_ARGS__)
61#define FE_39(WHAT, X0, X1, ...) WHAT(X0, X1) FE_38(WHAT, X0, __VA_ARGS__)
62#define FE_40(WHAT, X0, X1, ...) WHAT(X0, X1) FE_39(WHAT, X0, __VA_ARGS__)
63#define FE_41(WHAT, X0, X1, ...) WHAT(X0, X1) FE_40(WHAT, X0, __VA_ARGS__)
64#define FE_42(WHAT, X0, X1, ...) WHAT(X0, X1) FE_41(WHAT, X0, __VA_ARGS__)
65#define FE_43(WHAT, X0, X1, ...) WHAT(X0, X1) FE_42(WHAT, X0, __VA_ARGS__)
66#define FE_44(WHAT, X0, X1, ...) WHAT(X0, X1) FE_43(WHAT, X0, __VA_ARGS__)
67#define FE_45(WHAT, X0, X1, ...) WHAT(X0, X1) FE_44(WHAT, X0, __VA_ARGS__)
68#define FE_46(WHAT, X0, X1, ...) WHAT(X0, X1) FE_45(WHAT, X0, __VA_ARGS__)
69#define FE_47(WHAT, X0, X1, ...) WHAT(X0, X1) FE_46(WHAT, X0, __VA_ARGS__)
70#define FE_48(WHAT, X0, X1, ...) WHAT(X0, X1) FE_47(WHAT, X0, __VA_ARGS__)
71#define FE_49(WHAT, X0, X1, ...) WHAT(X0, X1) FE_48(WHAT, X0, __VA_ARGS__)
72#define FE_50(WHAT, X0, X1, ...) WHAT(X0, X1) FE_49(WHAT, X0, __VA_ARGS__)
73#define FE_51(WHAT, X0, X1, ...) WHAT(X0, X1) FE_50(WHAT, X0, __VA_ARGS__)
74#define FE_52(WHAT, X0, X1, ...) WHAT(X0, X1) FE_51(WHAT, X0, __VA_ARGS__)
75#define FE_53(WHAT, X0, X1, ...) WHAT(X0, X1) FE_52(WHAT, X0, __VA_ARGS__)
76#define FE_54(WHAT, X0, X1, ...) WHAT(X0, X1) FE_53(WHAT, X0, __VA_ARGS__)
77#define FE_55(WHAT, X0, X1, ...) WHAT(X0, X1) FE_54(WHAT, X0, __VA_ARGS__)
78#define FE_56(WHAT, X0, X1, ...) WHAT(X0, X1) FE_55(WHAT, X0, __VA_ARGS__)
79#define FE_57(WHAT, X0, X1, ...) WHAT(X0, X1) FE_56(WHAT, X0, __VA_ARGS__)
80#define FE_58(WHAT, X0, X1, ...) WHAT(X0, X1) FE_57(WHAT, X0, __VA_ARGS__)
81#define FE_59(WHAT, X0, X1, ...) WHAT(X0, X1) FE_58(WHAT, X0, __VA_ARGS__)
82#define FE_60(WHAT, X0, X1, ...) WHAT(X0, X1) FE_59(WHAT, X0, __VA_ARGS__)
83#define FE_61(WHAT, X0, X1, ...) WHAT(X0, X1) FE_60(WHAT, X0, __VA_ARGS__)
84#define FE_62(WHAT, X0, X1, ...) WHAT(X0, X1) FE_61(WHAT, X0, __VA_ARGS__)
85#define FE_63(WHAT, X0, X1, ...) WHAT(X0, X1) FE_62(WHAT, X0, __VA_ARGS__)
86
87#define FOR_EACH(action, x0, ...) VFUNC(FE_, __VA_ARGS__)(action, x0, __VA_ARGS__)
88