TVM  0.9.4
enums.h
Go to the documentation of this file.
1 
3 #pragma once
4 // Disable ISO C99 requires rest arguments to be used
5 #ifndef WIN32
6 # pragma GCC system_header
7 #endif
8 
9 namespace tvm
10 {
11 
12 namespace utils
13 {
14 
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__)
30 
31 // Check the macro expansion
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.");
35 
39 #define PP_NARG(...) PP_ID(PP_NARG_(__VA_ARGS__, PP_RSEQ_N()))
40 #define PP_NARG_(...) PP_ID(PP_ARG_N(__VA_ARGS__))
41 // clang-format off
42 #define PP_ARG_N( \
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
50 #define PP_RSEQ_N() \
51  64,63,62,61,60, \
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, \
57  9,8,7,6,5,4,3,2,1,0
58 // clang-format on
59 
60 #define PP_MAP(macro, data, ...) PP_ID(PP_APPLY(PP_CHOOSE_MAP_START, PP_NARG(__VA_ARGS__))(macro, data, __VA_ARGS__))
61 
62 #define PP_CHOOSE_MAP_START(count) PP_MAP##count
63 
64 #define PP_APPLY(macro, ...) PP_ID(macro(__VA_ARGS__))
65 
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__))
130 
131 #define PP_ID(x) x
132 
133 #define ENUM_NAME(EnumT, name) v == EnumT##_::name ? #name:
134 
135 #define DECLARE_ENUM(EnumName, Enum0, ...) \
136  enum class EnumName##_{Enum0 = EnumName##Parent::EnumName##Size, ##__VA_ARGS__};
137 
138 #define DECLARE_STRUCT(EnumT, name) constexpr static EnumT##_ name = EnumT##_::name;
139 
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 \
144  { \
145  PP_ID(PP_MAP(DECLARE_STRUCT, EnumName, __VA_ARGS__)) \
146  }; \
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;
153 
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; }
160 
161 #define DISABLE_SIGNALS_BODY(EnumT, name) static_cast<int>(v) == static_cast<int>(name) ? false:
162 
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) \
167  { return true; }
168 
169 } // namespace utils
170 
171 } // namespace tvm
#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
Definition: Clock.h:12