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/seq/push_back.hpp>
97 #include <hboost/preprocessor/tuple/elem.hpp>
105 #define _TF_DECLARE_PUBLIC_TOKENS3(key, eiapi, seq) \
106 _TF_DECLARE_TOKENS3(key, seq, eiapi) \
107 extern eiapi TfStaticData<_TF_TOKENS_STRUCT_NAME(key)> key
108 #define _TF_DECLARE_PUBLIC_TOKENS2(key, seq) \
109 _TF_DECLARE_TOKENS2(key, seq) \
110 extern TfStaticData<_TF_TOKENS_STRUCT_NAME(key)> key
111 #define _TF_DECLARE_PUBLIC_TOKENS(N) _TF_DECLARE_PUBLIC_TOKENS##N
112 #define _TF_DECLARE_PUBLIC_TOKENS_EVAL(N) _TF_DECLARE_PUBLIC_TOKENS(N)
113 #define _TF_DECLARE_PUBLIC_TOKENS_EXPAND(x) x
118 #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__) )
123 #define TF_DEFINE_PUBLIC_TOKENS(key, seq) \
124 _TF_DEFINE_TOKENS(key, seq) \
125 TfStaticData<_TF_TOKENS_STRUCT_NAME(key)> key
129 #define TF_DEFINE_PRIVATE_TOKENS(key, seq) \
131 struct _TF_TOKENS_STRUCT_NAME_PRIVATE(key) { \
132 _TF_TOKENS_STRUCT_NAME_PRIVATE(key)() : \
133 _TF_TOKENS_INITIALIZE_SEQ( \
134 HBOOST_PP_SEQ_FILTER(_TF_TOKENS_IS_NOT_ARRAY, ~, seq) \
135 _TF_TOKENS_EXPAND_ARRAY_ELEMENTS(seq)) \
137 _TF_TOKENS_ASSIGN_ARRAY_SEQ( \
138 HBOOST_PP_SEQ_FILTER(_TF_TOKENS_IS_ARRAY, ~, seq)) \
139 _TF_TOKENS_BUILD_ALLTOKENS_VECTOR( \
140 HBOOST_PP_SEQ_FILTER(_TF_TOKENS_IS_NOT_ARRAY, ~, seq) \
141 _TF_TOKENS_EXPAND_ARRAY_ELEMENTS(seq)) \
143 _TF_TOKENS_DECLARE_MEMBERS(seq) \
146 static TfStaticData<_TF_TOKENS_STRUCT_NAME_PRIVATE(key)> key
155 #define _TF_TOKENS_STRUCT_NAME_PRIVATE(key) \
156 HBOOST_PP_CAT(key, _PrivateStaticTokenType)
162 #define _TF_TOKENS_STRUCT_NAME(key) \
163 HBOOST_PP_CAT(key, _StaticTokenType)
171 #define _TF_TOKENS_DECLARE_MEMBER(r, data, elem) \
172 TfToken HBOOST_PP_IIF(TF_PP_IS_TUPLE(elem), \
173 HBOOST_PP_TUPLE_ELEM(2, 0, elem), elem) \
174 HBOOST_PP_EXPR_IIF(TF_PP_IS_TUPLE(HBOOST_PP_TUPLE_ELEM(2, 1, elem)), \
175 [HBOOST_PP_SEQ_SIZE(HBOOST_PP_TUPLE_ELEM(1, 0, \
176 HBOOST_PP_TUPLE_ELEM(2, 1, elem)))]);
180 #define _TF_TOKENS_DECLARE_MEMBERS(seq) \
181 HBOOST_PP_SEQ_FOR_EACH(_TF_TOKENS_DECLARE_MEMBER, ~, \
182 seq _TF_TOKENS_EXPAND_ARRAY_ELEMENTS(seq)) \
183 std::vector<TfToken> allTokens;
188 #define _TF_TOKENS_EXPAND_ARRAY_ELEMENTS(seq) \
189 HBOOST_PP_SEQ_FOR_EACH(_TF_TOKENS_APPEND_ARRAY_ELEMENTS, \
191 HBOOST_PP_SEQ_FILTER(_TF_TOKENS_IS_ARRAY, ~, seq)) \
195 #define _TF_DECLARE_TOKENS3(key, seq, eiapi) \
196 struct _TF_TOKENS_STRUCT_NAME(key) { \
197 eiapi _TF_TOKENS_STRUCT_NAME(key)(); \
198 eiapi ~_TF_TOKENS_STRUCT_NAME(key)(); \
199 _TF_TOKENS_DECLARE_MEMBERS(seq) \
202 #define _TF_DECLARE_TOKENS2(key, seq) \
203 struct _TF_TOKENS_STRUCT_NAME(key) { \
204 _TF_TOKENS_STRUCT_NAME(key)(); \
205 ~_TF_TOKENS_STRUCT_NAME(key)(); \
206 _TF_TOKENS_DECLARE_MEMBERS(seq) \
214 #define _TF_TOKENS_DEFINE_MEMBER(r, data, i, elem) \
215 HBOOST_PP_COMMA_IF(i) \
216 HBOOST_PP_TUPLE_ELEM(1, 0, HBOOST_PP_IIF(TF_PP_IS_TUPLE(elem), \
217 (_TF_TOKENS_INITIALIZE_MEMBER_TUPLE(elem)), \
218 (_TF_TOKENS_INITIALIZE_MEMBER(elem))))
220 #define _TF_TOKENS_INITIALIZE_MEMBER_TUPLE(elem) \
221 HBOOST_PP_TUPLE_ELEM(2, 0, elem)(HBOOST_PP_TUPLE_ELEM(2, 1, elem), \
224 #define _TF_TOKENS_INITIALIZE_MEMBER(elem) \
225 elem(TF_PP_STRINGIZE(elem), TfToken::Immortal)
227 #define _TF_TOKENS_DEFINE_ARRAY_MEMBER(r, data, i, elem) \
228 data[i] = HBOOST_PP_IIF(TF_PP_IS_TUPLE(elem), \
229 HBOOST_PP_TUPLE_ELEM(2, 0, elem), elem);
233 #define _TF_TOKENS_APPEND_MEMBER(r, data, i, elem) \
234 HBOOST_PP_IIF(TF_PP_IS_TUPLE(elem), \
235 _TF_TOKENS_APPEND_MEMBER_BODY(~, ~, \
236 HBOOST_PP_TUPLE_ELEM(2, 0, elem)), \
237 _TF_TOKENS_APPEND_MEMBER_BODY(~, ~, elem))
239 #define _TF_TOKENS_APPEND_MEMBER_BODY(r, data, elem) \
240 allTokens.push_back(elem);
242 #define _TF_TOKENS_BUILD_ALLTOKENS_VECTOR(seq) \
243 HBOOST_PP_SEQ_FOR_EACH_I(_TF_TOKENS_APPEND_MEMBER, ~, seq)
247 #define _TF_TOKENS_INITIALIZE_SEQ(seq) \
248 HBOOST_PP_SEQ_FOR_EACH_I(_TF_TOKENS_DEFINE_MEMBER, ~, seq)
250 #define _TF_TOKENS_ASSIGN_ARRAY_SEQ(seq) \
251 HBOOST_PP_SEQ_FOR_EACH(_TF_TOKENS_DEFINE_ARRAY_MEMBERS, ~, seq)
253 #define _TF_TOKENS_DEFINE_ARRAY_MEMBERS(r, data, elem) \
254 HBOOST_PP_SEQ_FOR_EACH_I(_TF_TOKENS_DEFINE_ARRAY_MEMBER, \
255 HBOOST_PP_TUPLE_ELEM(2, 0, elem), \
256 HBOOST_PP_TUPLE_ELEM(1, 0, HBOOST_PP_TUPLE_ELEM(2, 1, elem)))
261 #define _TF_TOKENS_IS_ARRAY(s, data, elem) \
262 HBOOST_PP_AND(TF_PP_IS_TUPLE(elem), \
263 TF_PP_IS_TUPLE(HBOOST_PP_TUPLE_ELEM(2, 1, elem)))
265 #define _TF_TOKENS_IS_NOT_ARRAY(s, data, elem) \
266 HBOOST_PP_NOT(_TF_TOKENS_IS_ARRAY(s, data, elem))
270 #define _TF_TOKENS_APPEND_ARRAY_ELEMENTS(r, data, elem) \
271 HBOOST_PP_TUPLE_ELEM(1, 0, HBOOST_PP_TUPLE_ELEM(2, 1, elem))
282 #define _TF_DEFINE_TOKENS(key, seq) \
283 _TF_TOKENS_STRUCT_NAME(key)::~_TF_TOKENS_STRUCT_NAME(key)() = default; \
284 _TF_TOKENS_STRUCT_NAME(key)::_TF_TOKENS_STRUCT_NAME(key)() : \
285 _TF_TOKENS_INITIALIZE_SEQ( \
286 HBOOST_PP_SEQ_FILTER(_TF_TOKENS_IS_NOT_ARRAY, ~, seq) \
287 _TF_TOKENS_EXPAND_ARRAY_ELEMENTS(seq)) \
289 _TF_TOKENS_ASSIGN_ARRAY_SEQ( \
290 HBOOST_PP_SEQ_FILTER(_TF_TOKENS_IS_ARRAY, ~, seq)) \
291 _TF_TOKENS_BUILD_ALLTOKENS_VECTOR( \
292 HBOOST_PP_SEQ_FILTER(_TF_TOKENS_IS_NOT_ARRAY, ~, seq) \
293 _TF_TOKENS_EXPAND_ARRAY_ELEMENTS(seq)) \
298 #endif // PXR_BASE_TF_STATIC_TOKENS_H
PXR_NAMESPACE_CLOSE_SCOPE PXR_NAMESPACE_OPEN_SCOPE
#define PXR_NAMESPACE_CLOSE_SCOPE