| 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 | |