ezEngine  Milestone 7
BlackMagic.h
1 #pragma once
2 
4 #ifndef EZ_VA_NUM_ARGS
5  #define EZ_VA_NUM_ARGS(...) \
6  EZ_VA_NUM_ARGS_HELPER(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
7 
8  #define EZ_VA_NUM_ARGS_HELPER(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N
9 #endif
10 
11 
12 #define EZ_CALL_MACRO(macro, args) macro args
13 
14 
15 #define EZ_EXPAND_ARGS_1(op, a0) op(a0)
16 #define EZ_EXPAND_ARGS_2(op, a0, a1) op(a0) op(a1)
17 #define EZ_EXPAND_ARGS_3(op, a0, a1, a2) op(a0) op(a1) op(a2)
18 #define EZ_EXPAND_ARGS_4(op, a0, a1, a2, a3) op(a0) op(a1) op(a2) op(a3)
19 #define EZ_EXPAND_ARGS_5(op, a0, a1, a2, a3, a4) op(a0) op(a1) op(a2) op(a3) op(a4)
20 #define EZ_EXPAND_ARGS_6(op, a0, a1, a2, a3, a4, a5) op(a0) op(a1) op(a2) op(a3) op(a4) op(a5)
21 #define EZ_EXPAND_ARGS_7(op, a0, a1, a2, a3, a4, a5, a6) op(a0) op(a1) op(a2) op(a3) op(a4) op(a5) op(a6)
22 #define EZ_EXPAND_ARGS_8(op, a0, a1, a2, a3, a4, a5, a6, a7) op(a0) op(a1) op(a2) op(a3) op(a4) op(a5) op(a6) op(a7)
23 #define EZ_EXPAND_ARGS_9(op, a0, a1, a2, a3, a4, a5, a6, a7, a8) op(a0) op(a1) op(a2) op(a3) op(a4) op(a5) op(a6) op(a7) op(a8)
24 #define EZ_EXPAND_ARGS_10(op, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) op(a0) op(a1) op(a2) op(a3) op(a4) op(a5) op(a6) op(a7) op(a8) op(a9)
25 
26 
27 #define EZ_EXPAND_ARGS_WITH_INDEX_1(op, a0) op(a0, 0)
28 #define EZ_EXPAND_ARGS_WITH_INDEX_2(op, a0, a1) op(a0, 0) op(a1, 1)
29 #define EZ_EXPAND_ARGS_WITH_INDEX_3(op, a0, a1, a2) op(a0, 0) op(a1, 1) op(a2, 2)
30 #define EZ_EXPAND_ARGS_WITH_INDEX_4(op, a0, a1, a2, a3) op(a0, 0) op(a1, 1) op(a2, 2) op(a3, 3)
31 #define EZ_EXPAND_ARGS_WITH_INDEX_5(op, a0, a1, a2, a3, a4) op(a0, 0) op(a1, 1) op(a2, 2) op(a3, 3) op(a4, 4)
32 #define EZ_EXPAND_ARGS_WITH_INDEX_6(op, a0, a1, a2, a3, a4, a5) op(a0, 0) op(a1, 1) op(a2, 2) op(a3, 3) op(a4, 4) op(a5, 5)
33 #define EZ_EXPAND_ARGS_WITH_INDEX_7(op, a0, a1, a2, a3, a4, a5, a6) op(a0, 0) op(a1, 1) op(a2, 2) op(a3, 3) op(a4, 4) op(a5, 5) op(a6, 6)
34 #define EZ_EXPAND_ARGS_WITH_INDEX_8(op, a0, a1, a2, a3, a4, a5, a6, a7) op(a0, 0) op(a1, 1) op(a2, 2) op(a3, 3) op(a4, 4) op(a5, 5) op(a6, 6) op(a7, 7)
35 #define EZ_EXPAND_ARGS_WITH_INDEX_9(op, a0, a1, a2, a3, a4, a5, a6, a7, a8) op(a0, 0) op(a1, 1) op(a2, 2) op(a3, 3) op(a4, 4) op(a5, 5) op(a6, 6) op(a7, 7) op(a8, 8)
36 #define EZ_EXPAND_ARGS_WITH_INDEX_10(op, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) op(a0, 0) op(a1, 1) op(a2, 2) op(a3, 3) op(a4, 4) op(a5, 5) op(a6, 6) op(a7, 7) op(a8, 8) op(a9, 9)
37 
38 
41 #define EZ_EXPAND_ARGS(op, ...) \
42  EZ_CALL_MACRO(EZ_CONCAT(EZ_EXPAND_ARGS_, EZ_VA_NUM_ARGS(__VA_ARGS__)), (op, __VA_ARGS__))
43 
44 #define EZ_EXPAND_ARGS_WITH_INDEX(op, ...) \
45  EZ_CALL_MACRO(EZ_CONCAT(EZ_EXPAND_ARGS_WITH_INDEX_, EZ_VA_NUM_ARGS(__VA_ARGS__)), (op, __VA_ARGS__))
46 
47 
48 #define EZ_TO_BOOL_0 0
49 #define EZ_TO_BOOL_1 1
50 #define EZ_TO_BOOL_2 1
51 #define EZ_TO_BOOL_3 1
52 #define EZ_TO_BOOL_4 1
53 #define EZ_TO_BOOL_5 1
54 #define EZ_TO_BOOL_6 1
55 #define EZ_TO_BOOL_7 1
56 #define EZ_TO_BOOL_8 1
57 #define EZ_TO_BOOL_9 1
58 
59 #define EZ_TO_BOOL(x) EZ_CONCAT(EZ_TO_BOOL_, x)
60 
61 
62 #define EZ_IF_0(x)
63 #define EZ_IF_1(x) x
64 #define EZ_IF(cond, x) EZ_CONCAT(EZ_IF_, EZ_TO_BOOL(cond))(x)
65 
66 #define EZ_IF_ELSE_0(x, y) y
67 #define EZ_IF_ELSE_1(x, y) x
68 #define EZ_IF_ELSE(cond, x, y) EZ_CONCAT(EZ_IF_ELSE_, EZ_TO_BOOL(cond))(x, y)
69 
70 
71 #define EZ_COMMA_MARK_0
72 #define EZ_COMMA_MARK_1 ,
73 #define EZ_COMMA_IF(cond) EZ_CONCAT(EZ_COMMA_MARK_, EZ_TO_BOOL(cond))
74 
75 
76 #define EZ_LIST_0(x)
77 #define EZ_LIST_1(x) EZ_CONCAT(x, 0)
78 #define EZ_LIST_2(x) EZ_LIST_1(x), EZ_CONCAT(x, 1)
79 #define EZ_LIST_3(x) EZ_LIST_2(x), EZ_CONCAT(x, 2)
80 #define EZ_LIST_4(x) EZ_LIST_3(x), EZ_CONCAT(x, 3)
81 #define EZ_LIST_5(x) EZ_LIST_4(x), EZ_CONCAT(x, 4)
82 #define EZ_LIST_6(x) EZ_LIST_5(x), EZ_CONCAT(x, 5)
83 #define EZ_LIST_7(x) EZ_LIST_6(x), EZ_CONCAT(x, 6)
84 #define EZ_LIST_8(x) EZ_LIST_7(x), EZ_CONCAT(x, 7)
85 #define EZ_LIST_9(x) EZ_LIST_8(x), EZ_CONCAT(x, 8)
86 #define EZ_LIST_10(x) EZ_LIST_9(x), EZ_CONCAT(x, 9)
87 
88 #define EZ_LIST(x, count) EZ_CONCAT(EZ_LIST_, count)(x)
89 
90 
91 #define EZ_PAIR_LIST_0(x, y)
92 #define EZ_PAIR_LIST_1(x, y) EZ_CONCAT(x, 0) EZ_CONCAT(y, 0)
93 #define EZ_PAIR_LIST_2(x, y) EZ_PAIR_LIST_1(x, y), EZ_CONCAT(x, 1) EZ_CONCAT(y, 1)
94 #define EZ_PAIR_LIST_3(x, y) EZ_PAIR_LIST_2(x, y), EZ_CONCAT(x, 2) EZ_CONCAT(y, 2)
95 #define EZ_PAIR_LIST_4(x, y) EZ_PAIR_LIST_3(x, y), EZ_CONCAT(x, 3) EZ_CONCAT(y, 3)
96 #define EZ_PAIR_LIST_5(x, y) EZ_PAIR_LIST_4(x, y), EZ_CONCAT(x, 4) EZ_CONCAT(y, 4)
97 #define EZ_PAIR_LIST_6(x, y) EZ_PAIR_LIST_5(x, y), EZ_CONCAT(x, 5) EZ_CONCAT(y, 5)
98 #define EZ_PAIR_LIST_7(x, y) EZ_PAIR_LIST_6(x, y), EZ_CONCAT(x, 6) EZ_CONCAT(y, 6)
99 #define EZ_PAIR_LIST_8(x, y) EZ_PAIR_LIST_7(x, y), EZ_CONCAT(x, 7) EZ_CONCAT(y, 7)
100 #define EZ_PAIR_LIST_9(x, y) EZ_PAIR_LIST_8(x, y), EZ_CONCAT(x, 8) EZ_CONCAT(y, 8)
101 #define EZ_PAIR_LIST_10(x, y) EZ_PAIR_LIST_9(x, y), EZ_CONCAT(x, 9) EZ_CONCAT(y, 9)
102 
103 #define EZ_PAIR_LIST(x, y, count) EZ_CONCAT(EZ_PAIR_LIST_, count)(x, y)
104