CyberEngineMkIII
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
CYBModuleMacros.hpp
Go to the documentation of this file.
1 #pragma once
3 #define NARGS_IMPL(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16,x17,x18,x19,x20,x21,x22,x23,x24,x25,x26,x27,x28,x29,x30,x31,x32,x33,x34,x35,x36,x37,x38,x39,x40,x41,x42,x43,x44,x45,x46,x47,x48,N,...) N
5 #define EXPAND(X) X
6 #define NARGS(...) EXPAND(NARGS_IMPL(__VA_ARGS__,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0))
7 
8 #define PRIMITIVE_CAT(X, Y) X ## Y
9 #define CAT(X, Y) PRIMITIVE_CAT(X, Y)
10 
11 #define APPLY(X, ...) EXPAND(CAT(APPLY_, NARGS(__VA_ARGS__))(X, __VA_ARGS__))
12 #define APPLY_1(X, x1) X(x1)
13 #define APPLY_2(X, x1, x2) X(x1), X(x2)
14 #define APPLY_3(X, x1, x2, x3) X(x1), X(x2), X(x3)
15 #define APPLY_4(X, x1, x2, x3, x4) X(x1), X(x2), X(x3), X(x4)
16 #define APPLY_5(X, x1, x2, x3, x4, x5) X(x1), X(x2), X(x3), X(x4), X(x5)
17 #define APPLY_6(X, x1, x2, x3, x4, x5, x6) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6)
18 #define APPLY_7(X, x1, x2, x3, x4, x5, x6, x7) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7)
19 #define APPLY_8(X, x1, x2, x3, x4, x5, x6, x7, x8) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8)
20 #define APPLY_9(X, x1, x2, x3, x4, x5, x6, x7, x8, x9) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9)
21 #define APPLY_10(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10)
22 #define APPLY_11(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11)
23 #define APPLY_12(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12)
24 #define APPLY_13(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13)
25 #define APPLY_14(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14)
26 #define APPLY_15(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15)
27 #define APPLY_16(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16)
28 #define APPLY_17(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17)
29 #define APPLY_18(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18)
30 #define APPLY_19(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19)
31 #define APPLY_20(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20)
32 #define APPLY_21(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21)
33 #define APPLY_22(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22)
34 #define APPLY_23(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23)
35 #define APPLY_24(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24)
36 #define APPLY_25(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25)
37 #define APPLY_26(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25), X(x26)
38 #define APPLY_27(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25), X(x26), X(x27)
39 #define APPLY_28(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25), X(x26), X(x27), X(x28)
40 #define APPLY_29(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25), X(x26), X(x27), X(x28), X(x29)
41 #define APPLY_30(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25), X(x26), X(x27), X(x28), X(x29), X(x30)
42 #define APPLY_31(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25), X(x26), X(x27), X(x28), X(x29), X(x30), X(x31)
43 #define APPLY_32(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25), X(x26), X(x27), X(x28), X(x29), X(x30), X(x31), X(x32)
44 #define APPLY_33(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25), X(x26), X(x27), X(x28), X(x29), X(x30), X(x31), X(x32), X(x33)
45 #define APPLY_34(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25), X(x26), X(x27), X(x28), X(x29), X(x30), X(x31), X(x32), X(x33), X(x34)
46 #define APPLY_35(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25), X(x26), X(x27), X(x28), X(x29), X(x30), X(x31), X(x32), X(x33), X(x34), X(x35)
47 #define APPLY_36(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25), X(x26), X(x27), X(x28), X(x29), X(x30), X(x31), X(x32), X(x33), X(x34), X(x35), X(x36)
48 #define APPLY_37(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25), X(x26), X(x27), X(x28), X(x29), X(x30), X(x31), X(x32), X(x33), X(x34), X(x35), X(x36), X(x37)
49 #define APPLY_38(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25), X(x26), X(x27), X(x28), X(x29), X(x30), X(x31), X(x32), X(x33), X(x34), X(x35), X(x36), X(x37), X(x38)
50 #define APPLY_39(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25), X(x26), X(x27), X(x28), X(x29), X(x30), X(x31), X(x32), X(x33), X(x34), X(x35), X(x36), X(x37), X(x38), X(x39)
51 #define APPLY_40(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x40) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25), X(x26), X(x27), X(x28), X(x29), X(x30), X(x31), X(x32), X(x33), X(x34), X(x35), X(x36), X(x37), X(x38), X(x39), X(x40)
52 #define APPLY_41(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x40, x41) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25), X(x26), X(x27), X(x28), X(x29), X(x30), X(x31), X(x32), X(x33), X(x34), X(x35), X(x36), X(x37), X(x38), X(x39), X(x40), X(x41)
53 #define APPLY_42(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25), X(x26), X(x27), X(x28), X(x29), X(x30), X(x31), X(x32), X(x33), X(x34), X(x35), X(x36), X(x37), X(x38), X(x39), X(x40), X(x41), X(x42)
54 #define APPLY_43(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25), X(x26), X(x27), X(x28), X(x29), X(x30), X(x31), X(x32), X(x33), X(x34), X(x35), X(x36), X(x37), X(x38), X(x39), X(x40), X(x41), X(x42), X(x43)
55 #define APPLY_44(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25), X(x26), X(x27), X(x28), X(x29), X(x30), X(x31), X(x32), X(x33), X(x34), X(x35), X(x36), X(x37), X(x38), X(x39), X(x40), X(x41), X(x42), X(x43), X(x44)
56 #define APPLY_45(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25), X(x26), X(x27), X(x28), X(x29), X(x30), X(x31), X(x32), X(x33), X(x34), X(x35), X(x36), X(x37), X(x38), X(x39), X(x40), X(x41), X(x42), X(x43), X(x44), X(x45)
57 #define APPLY_46(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25), X(x26), X(x27), X(x28), X(x29), X(x30), X(x31), X(x32), X(x33), X(x34), X(x35), X(x36), X(x37), X(x38), X(x39), X(x40), X(x41), X(x42), X(x43), X(x44), X(x45), X(x46)
58 #define APPLY_47(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46, x47) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25), X(x26), X(x27), X(x28), X(x29), X(x30), X(x31), X(x32), X(x33), X(x34), X(x35), X(x36), X(x37), X(x38), X(x39), X(x40), X(x41), X(x42), X(x43), X(x44), X(x45), X(x46), X(x47)
59 #define APPLY_48(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46, x47, x48) X(x1), X(x2), X(x3), X(x4), X(x5), X(x6), X(x7), X(x8), X(x9), X(x10), X(x11), X(x12), X(x13), X(x14), X(x15), X(x16), X(x17), X(x18), X(x19), X(x20), X(x21), X(x22), X(x23), X(x24), X(x25), X(x26), X(x27), X(x28), X(x29), X(x30), X(x31), X(x32), X(x33), X(x34), X(x35), X(x36), X(x37), X(x38), X(x39), X(x40), X(x41), X(x42), X(x43), X(x44), X(x45), X(x46), X(x47), X(x48)
60 #define APPLY_NC(X, ...) EXPAND(CAT(APPLY_NC_, NARGS(__VA_ARGS__))(X, __VA_ARGS__))
61 #define APPLY_NC_1(X, x1) X(x1)
62 #define APPLY_NC_2(X, x1, x2) X(x1) X(x2)
63 #define APPLY_NC_3(X, x1, x2, x3) X(x1) X(x2) X(x3)
64 #define APPLY_NC_4(X, x1, x2, x3, x4) X(x1) X(x2) X(x3) X(x4)
65 #define APPLY_NC_5(X, x1, x2, x3, x4, x5) X(x1) X(x2) X(x3) X(x4) X(x5)
66 #define APPLY_NC_6(X, x1, x2, x3, x4, x5, x6) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6)
67 #define APPLY_NC_7(X, x1, x2, x3, x4, x5, x6, x7) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7)
68 #define APPLY_NC_8(X, x1, x2, x3, x4, x5, x6, x7, x8) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8)
69 #define APPLY_NC_9(X, x1, x2, x3, x4, x5, x6, x7, x8, x9) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9)
70 #define APPLY_NC_10(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10)
71 #define APPLY_NC_11(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11)
72 #define APPLY_NC_12(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12)
73 #define APPLY_NC_13(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13)
74 #define APPLY_NC_14(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14)
75 #define APPLY_NC_15(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15)
76 #define APPLY_NC_16(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16)
77 #define APPLY_NC_17(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17)
78 #define APPLY_NC_18(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18)
79 #define APPLY_NC_19(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19)
80 #define APPLY_NC_20(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20)
81 #define APPLY_NC_21(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21)
82 #define APPLY_NC_22(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22)
83 #define APPLY_NC_23(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23)
84 #define APPLY_NC_24(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24)
85 #define APPLY_NC_25(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25)
86 #define APPLY_NC_26(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25) X(x26)
87 #define APPLY_NC_27(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25) X(x26) X(x27)
88 #define APPLY_NC_28(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25) X(x26) X(x27) X(x28)
89 #define APPLY_NC_29(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25) X(x26) X(x27) X(x28) X(x29)
90 #define APPLY_NC_30(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25) X(x26) X(x27) X(x28) X(x29) X(x30)
91 #define APPLY_NC_31(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25) X(x26) X(x27) X(x28) X(x29) X(x30) X(x31)
92 #define APPLY_NC_32(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25) X(x26) X(x27) X(x28) X(x29) X(x30) X(x31) X(x32)
93 #define APPLY_NC_33(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25) X(x26) X(x27) X(x28) X(x29) X(x30) X(x31) X(x32) X(x33)
94 #define APPLY_NC_34(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25) X(x26) X(x27) X(x28) X(x29) X(x30) X(x31) X(x32) X(x33) X(x34)
95 #define APPLY_NC_35(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25) X(x26) X(x27) X(x28) X(x29) X(x30) X(x31) X(x32) X(x33) X(x34) X(x35)
96 #define APPLY_NC_36(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25) X(x26) X(x27) X(x28) X(x29) X(x30) X(x31) X(x32) X(x33) X(x34) X(x35) X(x36)
97 #define APPLY_NC_37(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25) X(x26) X(x27) X(x28) X(x29) X(x30) X(x31) X(x32) X(x33) X(x34) X(x35) X(x36) X(x37)
98 #define APPLY_NC_38(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25) X(x26) X(x27) X(x28) X(x29) X(x30) X(x31) X(x32) X(x33) X(x34) X(x35) X(x36) X(x37) X(x38)
99 #define APPLY_NC_39(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25) X(x26) X(x27) X(x28) X(x29) X(x30) X(x31) X(x32) X(x33) X(x34) X(x35) X(x36) X(x37) X(x38) X(x39)
100 #define APPLY_NC_40(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x40) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25) X(x26) X(x27) X(x28) X(x29) X(x30) X(x31) X(x32) X(x33) X(x34) X(x35) X(x36) X(x37) X(x38) X(x39) X(x40)
101 #define APPLY_NC_41(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x40, x41) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25) X(x26) X(x27) X(x28) X(x29) X(x30) X(x31) X(x32) X(x33) X(x34) X(x35) X(x36) X(x37) X(x38) X(x39) X(x40) X(x41)
102 #define APPLY_NC_42(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25) X(x26) X(x27) X(x28) X(x29) X(x30) X(x31) X(x32) X(x33) X(x34) X(x35) X(x36) X(x37) X(x38) X(x39) X(x40) X(x41) X(x42)
103 #define APPLY_NC_43(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25) X(x26) X(x27) X(x28) X(x29) X(x30) X(x31) X(x32) X(x33) X(x34) X(x35) X(x36) X(x37) X(x38) X(x39) X(x40) X(x41) X(x42) X(x43)
104 #define APPLY_NC_44(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25) X(x26) X(x27) X(x28) X(x29) X(x30) X(x31) X(x32) X(x33) X(x34) X(x35) X(x36) X(x37) X(x38) X(x39) X(x40) X(x41) X(x42) X(x43) X(x44)
105 #define APPLY_NC_45(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25) X(x26) X(x27) X(x28) X(x29) X(x30) X(x31) X(x32) X(x33) X(x34) X(x35) X(x36) X(x37) X(x38) X(x39) X(x40) X(x41) X(x42) X(x43) X(x44) X(x45)
106 #define APPLY_NC_46(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25) X(x26) X(x27) X(x28) X(x29) X(x30) X(x31) X(x32) X(x33) X(x34) X(x35) X(x36) X(x37) X(x38) X(x39) X(x40) X(x41) X(x42) X(x43) X(x44) X(x45) X(x46)
107 #define APPLY_NC_47(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46, x47) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25) X(x26) X(x27) X(x28) X(x29) X(x30) X(x31) X(x32) X(x33) X(x34) X(x35) X(x36) X(x37) X(x38) X(x39) X(x40) X(x41) X(x42) X(x43) X(x44) X(x45) X(x46) X(x47)
108 #define APPLY_NC_48(X, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32, x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46, x47, x48) X(x1) X(x2) X(x3) X(x4) X(x5) X(x6) X(x7) X(x8) X(x9) X(x10) X(x11) X(x12) X(x13) X(x14) X(x15) X(x16) X(x17) X(x18) X(x19) X(x20) X(x21) X(x22) X(x23) X(x24) X(x25) X(x26) X(x27) X(x28) X(x29) X(x30) X(x31) X(x32) X(x33) X(x34) X(x35) X(x36) X(x37) X(x38) X(x39) X(x40) X(x41) X(x42) X(x43) X(x44) X(x45) X(x46) X(x47) X(x48)
109 
110 #define STRINGIFY(X) #X
111 #define STATIC_STRINGIFY(X) API::String::Static(STRINGIFY(X))
112 #define DECLTYPE_EXPAND(X) decltype(X)
113 
114 #define CLASSIFY_ENUM(X)\
115 class X {\
116 public:\
117  enum : unsigned int {\
118  Index = static_cast<unsigned int>(InternalIndexes::X),\
119  };\
120  using FAutoModule = FParentAutoModule;\
121  X() = delete;\
122 };\
123 
124 #ifdef TARGET_OS_WINDOWS
125 #define MODULE_EXTENSION u8".dll"
126 #elif defined(TARGET_OS_MAC)
127 #define MODULE_EXTENSION u8".dylib"
128 #elif defined(TARGET_OS_LINUX)
129 #define MODULE_EXTENSION u8".so"
130 #endif
131 
132 #define DEFINE_MODULE(AModuleName, ADiskName, APlatform, AOptionalFunctions, AAppendExtension, ...)\
133 namespace CYB {\
134  namespace Platform {\
135  namespace Modules {\
136  using namespace APlatform;\
137  class AModuleName{\
138  public:\
139  using FAutoModule = typename Platform::Modules::AutoModule<AOptionalFunctions, NARGS(__VA_ARGS__), APPLY(DECLTYPE_EXPAND, __VA_ARGS__)>;\
140  private:\
141  enum class InternalIndexes: unsigned int {\
142  __VA_ARGS__\
143  };\
144  using FParentAutoModule = FAutoModule;\
145  public:\
146  APPLY_NC(CLASSIFY_ENUM, __VA_ARGS__)\
147  AModuleName() = delete;\
148  };\
149  template <> constexpr const char* AModuleName::FAutoModule::ModuleName(void){\
150  return AAppendExtension ? ADiskName MODULE_EXTENSION : ADiskName;\
151  }\
152  template <> inline const CYB::API::String::Static* AModuleName::FAutoModule::FunctionNames(void) noexcept {\
153  static const CYB::API::String::Static Names[NARGS(__VA_ARGS__)]{ APPLY(STATIC_STRINGIFY, __VA_ARGS__) };\
154  return Names;\
155  }\
156  };\
157  };\
158 };\
159 
160 #define DEFINE_DUMMY_MODULE(AModuleName, ADiskName, APlatform, AOptionalFunctions, AAppendExtension, ...)\
161 namespace CYB {\
162  namespace Platform {\
163  namespace Modules {\
164  class AModuleName{\
165  public:\
166  using FAutoModule = AMFake<__COUNTER__>;\
167  private:\
168  enum class InternalIndexes: unsigned int {\
169  __VA_ARGS__\
170  };\
171  using FParentAutoModule = FAutoModule;\
172  public:\
173  APPLY_NC(CLASSIFY_ENUM, __VA_ARGS__)\
174  AModuleName() = delete;\
175  };\
176  };\
177  };\
178 };
179 
180 #define OVERRIDE_FUNCTION_NAMES(AModuleName, ...)\
181 namespace CYB {\
182  namespace Platform {\
183  namespace Modules {\
184  template<> inline const CYB::API::String::Static* AModuleName::FAutoModule::OverridenNames(void) noexcept {\
185  static const API::String::Static Names[NARGS(__VA_ARGS__)]{ __VA_ARGS__ };\
186  return Names;\
187  }\
188  };\
189  };\
190 };
191 #define DUMMY_OVERRIDE_FUNCTION_NAMES(...)
192 
193 #define REQUIRED_MODULE_FIELD(AModuleName)\
194 AModuleName::FAutoModule F##AModuleName
195 
196 #define OPTIONAL_MODULE_FIELD(AModuleName)\
197 bool F##AModuleName##Loaded = false;\
198 byte F##AModuleName##Bytes[sizeof(AModuleName::FAutoModule)]
199 //bool first so the bytes get loaded when it's checked
200 
201 #define REQUIRED_MODULE_MANAGEMENT(AModuleName) \
202 template <> inline auto CYB::Platform::Modules::Manager::GetAutoModule<CYB::Platform::Modules::AModuleName::FAutoModule>(void) noexcept -> typename AModuleName::FAutoModule* { return &F##AModuleName; }\
203 template <> inline bool CYB::Platform::Modules::Manager::LoadedInternal<CYB::Platform::Modules::AModuleName>(void) const noexcept { return true; }
204 
205 #define OPTIONAL_MODULE_MANAGEMENT(AModuleName) \
206 template <> inline auto CYB::Platform::Modules::Manager::GetAutoModule<CYB::Platform::Modules::AModuleName::FAutoModule>(void) noexcept -> AModuleName::FAutoModule* {\
207  return reinterpret_cast<AModuleName::FAutoModule*>(F##AModuleName##Bytes);\
208 }\
209 template <> inline void CYB::Platform::Modules::Manager::LoadAutoModule<CYB::Platform::Modules::AModuleName>(void) noexcept {\
210  API::Assert::False(F##AModuleName##Loaded);\
211  try {\
212  auto const Pointer(reinterpret_cast<AModuleName::FAutoModule*>(F##AModuleName##Bytes));\
213  new (Pointer) AM##AModuleName();\
214  F##AModuleName##Loaded = true;\
215  }\
216  catch (CYB::Exception::Internal& AException) {\
217  API::Assert::Equal<unsigned int>(AException.FErrorCode, Exception::Internal::MODULE_LOAD_FAILURE, Exception::Internal::MODULE_FUNCTION_LOAD_FAILURE);\
218  }\
219 }\
220 template <> inline void CYB::Platform::Modules::Manager::UnloadAutoModule<CYB::Platform::Modules::AModuleName>(void) noexcept {\
221  API::Assert::True(F##AModuleName##Loaded);\
222  GetAutoModule<AM##AModuleName>()->~(AModuleName::FAutoModule)();\
223  F##AModuleName##Loaded = false;\
224 }\
225 template <> inline bool CYB::Platform::Modules::Manager::LoadedInternal<CYB::Platform::Modules::AModuleName>(void) const noexcept { return F##AModuleName##Loaded; }
226 
227 #ifdef TARGET_OS_WINDOWS
228 #define DEFINE_WINDOWS_MODULE DEFINE_MODULE
229 #define DEFINE_POSIX_MODULE DEFINE_DUMMY_MODULE
230 #define OVERRIDE_WINDOWS_FUNCTION_NAMES OVERRIDE_FUNCTION_NAMES
231 #define OVERRIDE_POSIX_FUNCTION_NAMES DUMMY_OVERRIDE_FUNCTION_NAMES
232 #else
233 #define DEFINE_WINDOWS_MODULE DEFINE_DUMMY_MODULE
234 #define DEFINE_POSIX_MODULE DEFINE_MODULE
235 #define OVERRIDE_WINDOWS_FUNCTION_NAMES DUMMY_OVERRIDE_FUNCTION_NAMES
236 #define OVERRIDE_POSIX_FUNCTION_NAMES OVERRIDE_FUNCTION_NAMES
237 #endif
238 
239 #ifdef TARGET_OS_LINUX
240 #define DEFINE_LINUX_MODULE DEFINE_MODULE
241 #define OVERRIDE_LINUX_FUNCTION_NAMES OVERRIDE_FUNCTION_NAMES
242 #else
243 #define DEFINE_LINUX_MODULE DEFINE_DUMMY_MODULE
244 #define OVERRIDE_LINUX_FUNCTION_NAMES DUMMY_OVERRIDE_FUNCTION_NAMES
245 #endif
246 
247 #ifdef TARGET_OS_MAC
248 #define DEFINE_OSX_MODULE DEFINE_MODULE
249 #define OVERRIDE_OSX_FUNCTION_NAMES OVERRIDE_FUNCTION_NAMES
250 #else
251 #define DEFINE_OSX_MODULE DEFINE_DUMMY_MODULE
252 #define OVERRIDE_OSX_FUNCTION_NAMES DUMMY_OVERRIDE_FUNCTION_NAMES
253 #endif
254