30 #ifndef PXR_BASE_TF_STATIC_TOKENS_H
31 #define PXR_BASE_TF_STATIC_TOKENS_H
86 #include <hboost/preprocessor/cat.hpp>
87 #include <hboost/preprocessor/control/iif.hpp>
88 #include <hboost/preprocessor/control/expr_iif.hpp>
89 #include <hboost/preprocessor/logical/and.hpp>
90 #include <hboost/preprocessor/logical/not.hpp>
91 #include <hboost/preprocessor/punctuation/comma_if.hpp>
92 #include <hboost/preprocessor/seq/filter.hpp>
93 #include <hboost/preprocessor/seq/for_each.hpp>
94 #include <hboost/preprocessor/seq/for_each_i.hpp>
95 #include <hboost/preprocessor/seq/size.hpp>
96 #include <hboost/preprocessor/tuple/elem.hpp>
104 #define _TF_DECLARE_PUBLIC_TOKENS3(key, eiapi, seq) \
105 _TF_DECLARE_TOKENS3(key, seq, eiapi) \
106 extern eiapi TfStaticData<_TF_TOKENS_STRUCT_NAME(key)> key
107 #define _TF_DECLARE_PUBLIC_TOKENS2(key, seq) \
108 _TF_DECLARE_TOKENS2(key, seq) \
109 extern TfStaticData<_TF_TOKENS_STRUCT_NAME(key)> key
110 #define _TF_DECLARE_PUBLIC_TOKENS(N) _TF_DECLARE_PUBLIC_TOKENS##N
111 #define _TF_DECLARE_PUBLIC_TOKENS_EVAL(N) _TF_DECLARE_PUBLIC_TOKENS(N)
112 #define _TF_DECLARE_PUBLIC_TOKENS_EXPAND(x) x
117 #define TF_DECLARE_PUBLIC_TOKENS(...) _TF_DECLARE_PUBLIC_TOKENS_EXPAND( _TF_DECLARE_PUBLIC_TOKENS_EVAL(_TF_DECLARE_PUBLIC_TOKENS_EXPAND( TF_NUM_ARGS(__VA_ARGS__) ))(__VA_ARGS__) )
122 #define TF_DEFINE_PUBLIC_TOKENS(key, seq) \
123 _TF_DEFINE_TOKENS(key, seq) \
124 TfStaticData<_TF_TOKENS_STRUCT_NAME(key)> key
128 #define TF_DEFINE_PRIVATE_TOKENS(key, seq) \
130 struct _TF_TOKENS_STRUCT_NAME_PRIVATE(key) { \
131 _TF_TOKENS_STRUCT_NAME_PRIVATE(key)() : \
132 _TF_TOKENS_INITIALIZE_SEQ( \
133 HBOOST_PP_SEQ_FILTER(_TF_TOKENS_IS_NOT_ARRAY, ~, seq) \
134 _TF_TOKENS_EXPAND_ARRAY_ELEMENTS(seq)) \
136 _TF_TOKENS_ASSIGN_ARRAY_SEQ( \
137 HBOOST_PP_SEQ_FILTER(_TF_TOKENS_IS_ARRAY, ~, seq)) \
138 _TF_TOKENS_BUILD_ALLTOKENS_VECTOR( \
139 HBOOST_PP_SEQ_FILTER(_TF_TOKENS_IS_NOT_ARRAY, ~, seq) \
140 _TF_TOKENS_EXPAND_ARRAY_ELEMENTS(seq)) \
142 _TF_TOKENS_DECLARE_MEMBERS(seq) \
145 static TfStaticData<_TF_TOKENS_STRUCT_NAME_PRIVATE(key)> key
154 #define _TF_TOKENS_STRUCT_NAME_PRIVATE(key) \
155 HBOOST_PP_CAT(key, _PrivateStaticTokenType)
161 #define _TF_TOKENS_STRUCT_NAME(key) \
162 HBOOST_PP_CAT(key, _StaticTokenType)
170 #define _TF_TOKENS_DECLARE_MEMBER(r, data, elem) \
171 TfToken HBOOST_PP_IIF(TF_PP_IS_TUPLE(elem), \
172 HBOOST_PP_TUPLE_ELEM(2, 0, elem), elem) \
173 HBOOST_PP_EXPR_IIF(TF_PP_IS_TUPLE(HBOOST_PP_TUPLE_ELEM(2, 1, elem)), \
174 [HBOOST_PP_SEQ_SIZE(HBOOST_PP_TUPLE_ELEM(1, 0, \
175 HBOOST_PP_TUPLE_ELEM(2, 1, elem)))]);
179 #define _TF_TOKENS_DECLARE_MEMBERS(seq) \
180 HBOOST_PP_SEQ_FOR_EACH(_TF_TOKENS_DECLARE_MEMBER, ~, \
181 seq _TF_TOKENS_EXPAND_ARRAY_ELEMENTS(seq)) \
182 std::vector<TfToken> allTokens;
187 #define _TF_TOKENS_EXPAND_ARRAY_ELEMENTS(seq) \
188 HBOOST_PP_SEQ_FOR_EACH(_TF_TOKENS_APPEND_ARRAY_ELEMENTS, \
190 HBOOST_PP_SEQ_FILTER(_TF_TOKENS_IS_ARRAY, ~, seq)) \
194 #define _TF_DECLARE_TOKENS3(key, seq, eiapi) \
195 struct _TF_TOKENS_STRUCT_NAME(key) { \
196 eiapi _TF_TOKENS_STRUCT_NAME(key)(); \
197 eiapi ~_TF_TOKENS_STRUCT_NAME(key)(); \
198 _TF_TOKENS_DECLARE_MEMBERS(seq) \
201 #define _TF_DECLARE_TOKENS2(key, seq) \
202 struct _TF_TOKENS_STRUCT_NAME(key) { \
203 _TF_TOKENS_STRUCT_NAME(key)(); \
204 ~_TF_TOKENS_STRUCT_NAME(key)(); \
205 _TF_TOKENS_DECLARE_MEMBERS(seq) \
213 #define _TF_TOKENS_DEFINE_MEMBER(r, data, i, elem) \
214 HBOOST_PP_COMMA_IF(i) \
215 HBOOST_PP_TUPLE_ELEM(1, 0, HBOOST_PP_IIF(TF_PP_IS_TUPLE(elem), \
216 (_TF_TOKENS_INITIALIZE_MEMBER_TUPLE(elem)), \
217 (_TF_TOKENS_INITIALIZE_MEMBER(elem))))
219 #define _TF_TOKENS_INITIALIZE_MEMBER_TUPLE(elem) \
220 HBOOST_PP_TUPLE_ELEM(2, 0, elem)(HBOOST_PP_TUPLE_ELEM(2, 1, elem), \
223 #define _TF_TOKENS_INITIALIZE_MEMBER(elem) \
224 elem(TF_PP_STRINGIZE(elem), TfToken::Immortal)
226 #define _TF_TOKENS_DEFINE_ARRAY_MEMBER(r, data, i, elem) \
227 data[i] = HBOOST_PP_IIF(TF_PP_IS_TUPLE(elem), \
228 HBOOST_PP_TUPLE_ELEM(2, 0, elem), elem);
232 #define _TF_TOKENS_APPEND_MEMBER(r, data, i, elem) \
233 HBOOST_PP_IIF(TF_PP_IS_TUPLE(elem), \
234 _TF_TOKENS_APPEND_MEMBER_BODY(~, ~, \
235 HBOOST_PP_TUPLE_ELEM(2, 0, elem)), \
236 _TF_TOKENS_APPEND_MEMBER_BODY(~, ~, elem))
238 #define _TF_TOKENS_APPEND_MEMBER_BODY(r, data, elem) \
239 allTokens.push_back(elem);
241 #define _TF_TOKENS_BUILD_ALLTOKENS_VECTOR(seq) \
242 HBOOST_PP_SEQ_FOR_EACH_I(_TF_TOKENS_APPEND_MEMBER, ~, seq)
246 #define _TF_TOKENS_INITIALIZE_SEQ(seq) \
247 HBOOST_PP_SEQ_FOR_EACH_I(_TF_TOKENS_DEFINE_MEMBER, ~, seq)
249 #define _TF_TOKENS_ASSIGN_ARRAY_SEQ(seq) \
250 HBOOST_PP_SEQ_FOR_EACH(_TF_TOKENS_DEFINE_ARRAY_MEMBERS, ~, seq)
252 #define _TF_TOKENS_DEFINE_ARRAY_MEMBERS(r, data, elem) \
253 HBOOST_PP_SEQ_FOR_EACH_I(_TF_TOKENS_DEFINE_ARRAY_MEMBER, \
254 HBOOST_PP_TUPLE_ELEM(2, 0, elem), \
255 HBOOST_PP_TUPLE_ELEM(1, 0, HBOOST_PP_TUPLE_ELEM(2, 1, elem)))
260 #define _TF_TOKENS_IS_ARRAY(s, data, elem) \
261 HBOOST_PP_AND(TF_PP_IS_TUPLE(elem), \
262 TF_PP_IS_TUPLE(HBOOST_PP_TUPLE_ELEM(2, 1, elem)))
264 #define _TF_TOKENS_IS_NOT_ARRAY(s, data, elem) \
265 HBOOST_PP_NOT(_TF_TOKENS_IS_ARRAY(s, data, elem))
269 #define _TF_TOKENS_APPEND_ARRAY_ELEMENTS(r, data, elem) \
270 HBOOST_PP_TUPLE_ELEM(1, 0, HBOOST_PP_TUPLE_ELEM(2, 1, elem))
281 #define _TF_DEFINE_TOKENS(key, seq) \
282 _TF_TOKENS_STRUCT_NAME(key)::~_TF_TOKENS_STRUCT_NAME(key)() = default; \
283 _TF_TOKENS_STRUCT_NAME(key)::_TF_TOKENS_STRUCT_NAME(key)() : \
284 _TF_TOKENS_INITIALIZE_SEQ( \
285 HBOOST_PP_SEQ_FILTER(_TF_TOKENS_IS_NOT_ARRAY, ~, seq) \
286 _TF_TOKENS_EXPAND_ARRAY_ELEMENTS(seq)) \
288 _TF_TOKENS_ASSIGN_ARRAY_SEQ( \
289 HBOOST_PP_SEQ_FILTER(_TF_TOKENS_IS_ARRAY, ~, seq)) \
290 _TF_TOKENS_BUILD_ALLTOKENS_VECTOR( \
291 HBOOST_PP_SEQ_FILTER(_TF_TOKENS_IS_NOT_ARRAY, ~, seq) \
292 _TF_TOKENS_EXPAND_ARRAY_ELEMENTS(seq)) \
297 #endif // PXR_BASE_TF_STATIC_TOKENS_H
PXR_NAMESPACE_CLOSE_SCOPE PXR_NAMESPACE_OPEN_SCOPE
#define PXR_NAMESPACE_CLOSE_SCOPE