6 # pragma GCC system_header
25 template<
unsigned int N>
26 constexpr
unsigned int count_va_args(
const char (&s)[N],
unsigned int i = 0,
unsigned int ret = 0)
27 {
return s[i] ==
'\0' ? (i == 0 ? 0 : ret + 1) :
count_va_args(s, i + 1, ret + (s[i] ==
',')); }
29 #define COUNT_VA_ARGS(...) tvm::utils::count_va_args("" #__VA_ARGS__)
32 static_assert(
COUNT_VA_ARGS() == 0,
"COUNT_VA_ARGS failed for 0 argument.");
33 static_assert(
COUNT_VA_ARGS(1) == 1,
"COUNT_VA_ARGS failed for 1 argument.");
34 static_assert(
COUNT_VA_ARGS(1, 2, 3) == 3,
"COUNT_VA_ARGS failed for 3 arguments.");
39 #define PP_NARG(...) PP_ID(PP_NARG_(__VA_ARGS__, PP_RSEQ_N()))
40 #define PP_NARG_(...) PP_ID(PP_ARG_N(__VA_ARGS__))
43 _1, _2, _3, _4, _5, _6, _7, _8, _9,_10, \
44 _11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \
45 _21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \
46 _31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \
47 _41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \
48 _51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \
49 _61,_62,_63,_64,N,...) N
52 59,58,57,56,55,54,53,52,51,50, \
53 49,48,47,46,45,44,43,42,41,40, \
54 39,38,37,36,35,34,33,32,31,30, \
55 29,28,27,26,25,24,23,22,21,20, \
56 19,18,17,16,15,14,13,12,11,10, \
60 #define PP_MAP(macro, data, ...) PP_ID(PP_APPLY(PP_CHOOSE_MAP_START, PP_NARG(__VA_ARGS__))(macro, data, __VA_ARGS__))
62 #define PP_CHOOSE_MAP_START(count) PP_MAP##count
64 #define PP_APPLY(macro, ...) PP_ID(macro(__VA_ARGS__))
66 #define PP_MAP1(m, d, x) m(d, x)
67 #define PP_MAP2(m, d, x, ...) m(d, x) PP_ID(PP_MAP1(m, d, __VA_ARGS__))
68 #define PP_MAP3(m, d, x, ...) m(d, x) PP_ID(PP_MAP2(m, d, __VA_ARGS__))
69 #define PP_MAP4(m, d, x, ...) m(d, x) PP_ID(PP_MAP3(m, d, __VA_ARGS__))
70 #define PP_MAP5(m, d, x, ...) m(d, x) PP_ID(PP_MAP4(m, d, __VA_ARGS__))
71 #define PP_MAP6(m, d, x, ...) m(d, x) PP_ID(PP_MAP5(m, d, __VA_ARGS__))
72 #define PP_MAP7(m, d, x, ...) m(d, x) PP_ID(PP_MAP6(m, d, __VA_ARGS__))
73 #define PP_MAP8(m, d, x, ...) m(d, x) PP_ID(PP_MAP7(m, d, __VA_ARGS__))
74 #define PP_MAP9(m, d, x, ...) m(d, x) PP_ID(PP_MAP8(m, d, __VA_ARGS__))
75 #define PP_MAP10(m, d, x, ...) m(d, x) PP_ID(PP_MAP9(m, d, __VA_ARGS__))
76 #define PP_MAP11(m, d, x, ...) m(d, x) PP_ID(PP_MAP10(m, d, __VA_ARGS__))
77 #define PP_MAP12(m, d, x, ...) m(d, x) PP_ID(PP_MAP11(m, d, __VA_ARGS__))
78 #define PP_MAP13(m, d, x, ...) m(d, x) PP_ID(PP_MAP12(m, d, __VA_ARGS__))
79 #define PP_MAP14(m, d, x, ...) m(d, x) PP_ID(PP_MAP13(m, d, __VA_ARGS__))
80 #define PP_MAP15(m, d, x, ...) m(d, x) PP_ID(PP_MAP14(m, d, __VA_ARGS__))
81 #define PP_MAP16(m, d, x, ...) m(d, x) PP_ID(PP_MAP15(m, d, __VA_ARGS__))
82 #define PP_MAP17(m, d, x, ...) m(d, x) PP_ID(PP_MAP16(m, d, __VA_ARGS__))
83 #define PP_MAP18(m, d, x, ...) m(d, x) PP_ID(PP_MAP17(m, d, __VA_ARGS__))
84 #define PP_MAP19(m, d, x, ...) m(d, x) PP_ID(PP_MAP18(m, d, __VA_ARGS__))
85 #define PP_MAP20(m, d, x, ...) m(d, x) PP_ID(PP_MAP19(m, d, __VA_ARGS__))
86 #define PP_MAP21(m, d, x, ...) m(d, x) PP_ID(PP_MAP20(m, d, __VA_ARGS__))
87 #define PP_MAP22(m, d, x, ...) m(d, x) PP_ID(PP_MAP21(m, d, __VA_ARGS__))
88 #define PP_MAP23(m, d, x, ...) m(d, x) PP_ID(PP_MAP22(m, d, __VA_ARGS__))
89 #define PP_MAP24(m, d, x, ...) m(d, x) PP_ID(PP_MAP23(m, d, __VA_ARGS__))
90 #define PP_MAP25(m, d, x, ...) m(d, x) PP_ID(PP_MAP24(m, d, __VA_ARGS__))
91 #define PP_MAP26(m, d, x, ...) m(d, x) PP_ID(PP_MAP25(m, d, __VA_ARGS__))
92 #define PP_MAP27(m, d, x, ...) m(d, x) PP_ID(PP_MAP26(m, d, __VA_ARGS__))
93 #define PP_MAP28(m, d, x, ...) m(d, x) PP_ID(PP_MAP27(m, d, __VA_ARGS__))
94 #define PP_MAP29(m, d, x, ...) m(d, x) PP_ID(PP_MAP28(m, d, __VA_ARGS__))
95 #define PP_MAP30(m, d, x, ...) m(d, x) PP_ID(PP_MAP29(m, d, __VA_ARGS__))
96 #define PP_MAP31(m, d, x, ...) m(d, x) PP_ID(PP_MAP30(m, d, __VA_ARGS__))
97 #define PP_MAP32(m, d, x, ...) m(d, x) PP_ID(PP_MAP31(m, d, __VA_ARGS__))
98 #define PP_MAP33(m, d, x, ...) m(d, x) PP_ID(PP_MAP32(m, d, __VA_ARGS__))
99 #define PP_MAP34(m, d, x, ...) m(d, x) PP_ID(PP_MAP33(m, d, __VA_ARGS__))
100 #define PP_MAP35(m, d, x, ...) m(d, x) PP_ID(PP_MAP34(m, d, __VA_ARGS__))
101 #define PP_MAP36(m, d, x, ...) m(d, x) PP_ID(PP_MAP35(m, d, __VA_ARGS__))
102 #define PP_MAP37(m, d, x, ...) m(d, x) PP_ID(PP_MAP36(m, d, __VA_ARGS__))
103 #define PP_MAP38(m, d, x, ...) m(d, x) PP_ID(PP_MAP37(m, d, __VA_ARGS__))
104 #define PP_MAP39(m, d, x, ...) m(d, x) PP_ID(PP_MAP38(m, d, __VA_ARGS__))
105 #define PP_MAP40(m, d, x, ...) m(d, x) PP_ID(PP_MAP39(m, d, __VA_ARGS__))
106 #define PP_MAP41(m, d, x, ...) m(d, x) PP_ID(PP_MAP40(m, d, __VA_ARGS__))
107 #define PP_MAP42(m, d, x, ...) m(d, x) PP_ID(PP_MAP41(m, d, __VA_ARGS__))
108 #define PP_MAP43(m, d, x, ...) m(d, x) PP_ID(PP_MAP42(m, d, __VA_ARGS__))
109 #define PP_MAP44(m, d, x, ...) m(d, x) PP_ID(PP_MAP43(m, d, __VA_ARGS__))
110 #define PP_MAP45(m, d, x, ...) m(d, x) PP_ID(PP_MAP44(m, d, __VA_ARGS__))
111 #define PP_MAP46(m, d, x, ...) m(d, x) PP_ID(PP_MAP45(m, d, __VA_ARGS__))
112 #define PP_MAP47(m, d, x, ...) m(d, x) PP_ID(PP_MAP46(m, d, __VA_ARGS__))
113 #define PP_MAP48(m, d, x, ...) m(d, x) PP_ID(PP_MAP47(m, d, __VA_ARGS__))
114 #define PP_MAP49(m, d, x, ...) m(d, x) PP_ID(PP_MAP48(m, d, __VA_ARGS__))
115 #define PP_MAP50(m, d, x, ...) m(d, x) PP_ID(PP_MAP49(m, d, __VA_ARGS__))
116 #define PP_MAP51(m, d, x, ...) m(d, x) PP_ID(PP_MAP50(m, d, __VA_ARGS__))
117 #define PP_MAP52(m, d, x, ...) m(d, x) PP_ID(PP_MAP51(m, d, __VA_ARGS__))
118 #define PP_MAP53(m, d, x, ...) m(d, x) PP_ID(PP_MAP52(m, d, __VA_ARGS__))
119 #define PP_MAP54(m, d, x, ...) m(d, x) PP_ID(PP_MAP53(m, d, __VA_ARGS__))
120 #define PP_MAP55(m, d, x, ...) m(d, x) PP_ID(PP_MAP54(m, d, __VA_ARGS__))
121 #define PP_MAP56(m, d, x, ...) m(d, x) PP_ID(PP_MAP55(m, d, __VA_ARGS__))
122 #define PP_MAP57(m, d, x, ...) m(d, x) PP_ID(PP_MAP56(m, d, __VA_ARGS__))
123 #define PP_MAP58(m, d, x, ...) m(d, x) PP_ID(PP_MAP57(m, d, __VA_ARGS__))
124 #define PP_MAP59(m, d, x, ...) m(d, x) PP_ID(PP_MAP58(m, d, __VA_ARGS__))
125 #define PP_MAP60(m, d, x, ...) m(d, x) PP_ID(PP_MAP59(m, d, __VA_ARGS__))
126 #define PP_MAP61(m, d, x, ...) m(d, x) PP_ID(PP_MAP60(m, d, __VA_ARGS__))
127 #define PP_MAP62(m, d, x, ...) m(d, x) PP_ID(PP_MAP61(m, d, __VA_ARGS__))
128 #define PP_MAP63(m, d, x, ...) m(d, x) PP_ID(PP_MAP62(m, d, __VA_ARGS__))
129 #define PP_MAP64(m, d, x, ...) m(d, x) PP_ID(PP_MAP63(m, d, __VA_ARGS__))
133 #define ENUM_NAME(EnumT, name) v == EnumT##_::name ? #name:
135 #define DECLARE_ENUM(EnumName, Enum0, ...) \
136 enum class EnumName##_{Enum0 = EnumName##Parent::EnumName##Size, ##__VA_ARGS__};
138 #define DECLARE_STRUCT(EnumT, name) constexpr static EnumT##_ name = EnumT##_::name;
140 #define EXTEND_ENUM(EnumName, SelfT, ...) \
141 using EnumName##Parent = SelfT::EnumName##Base; \
142 PP_ID(DECLARE_ENUM(EnumName, __VA_ARGS__)) \
143 struct EnumName : public EnumName##Parent::EnumName \
145 PP_ID(PP_MAP(DECLARE_STRUCT, EnumName, __VA_ARGS__)) \
147 static constexpr unsigned int EnumName##Size = EnumName##Parent::EnumName##Size + PP_ID(COUNT_VA_ARGS(__VA_ARGS__)); \
148 using EnumName##Parent::EnumName##Name; \
149 static constexpr const char * EnumName##Name(EnumName##_ v) \
150 { return PP_ID(PP_MAP(ENUM_NAME, EnumName, __VA_ARGS__)) "INVALID"; } \
151 using EnumName##Base = SelfT; \
152 static constexpr auto EnumName##BaseName = #SelfT;
154 #define DISABLE_SIGNALS(EnumName, ...) \
155 bool is##EnumName##StaticallyEnabled(int v) const override \
156 { return PP_ID(PP_MAP(DISABLE_SIGNALS_BODY, EnumName, __VA_ARGS__)) true; } \
157 template<typename EnumT> \
158 static constexpr bool EnumName##StaticallyEnabled(EnumT v) \
159 { return PP_ID(PP_MAP(DISABLE_SIGNALS_BODY, EnumName, __VA_ARGS__)) true; }
161 #define DISABLE_SIGNALS_BODY(EnumT, name) static_cast<int>(v) == static_cast<int>(name) ? false:
163 #define CLEAR_DISABLED_SIGNALS(EnumName) \
164 bool is##EnumName##StaticallyEnabled(int) const override { return true; } \
165 template<typename EnumT> \
166 static constexpr bool EnumName##StaticallyEnabled(EnumT) \
#define COUNT_VA_ARGS(...)
Definition: enums.h:29
constexpr unsigned int count_va_args(const char(&s)[N], unsigned int i=0, unsigned int ret=0)
Definition: enums.h:26