All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
staticTokens.h
Go to the documentation of this file.
1//
2// Copyright 2016 Pixar
3//
4// Licensed under the terms set forth in the LICENSE.txt file available at
5// https://openusd.org/license.
6//
7//todo: cleanup: TF_DEFINE_PRIVATE_TOKENS, should use the public versions
8//todo: cleanup: document each macro extensively
9//todo: cleanup: order macros, so that it is easier to see the structure
10
11#ifndef PXR_BASE_TF_STATIC_TOKENS_H
12#define PXR_BASE_TF_STATIC_TOKENS_H
13
54
55#include "pxr/pxr.h"
56#include "pxr/base/tf/preprocessorUtilsLite.h"
58#include "pxr/base/tf/token.h"
59
60#include <vector>
61
62PXR_NAMESPACE_OPEN_SCOPE
63
64// TF_DECLARE_PUBLIC_TOKENS use these macros to handle two or three arguments.
65// The three argument version takes an export/import macro (e.g. TF_API)
66// while the two argument version does not export the tokens.
67
68#define _TF_DECLARE_PUBLIC_TOKENS3(key, eiapi, seq) \
69 _TF_DECLARE_TOKENS3(key, seq, eiapi) \
70 extern eiapi TfStaticData<_TF_TOKENS_STRUCT_NAME(key)> key
71#define _TF_DECLARE_PUBLIC_TOKENS2(key, seq) \
72 _TF_DECLARE_TOKENS2(key, seq) \
73 extern TfStaticData<_TF_TOKENS_STRUCT_NAME(key)> key
74#define _TF_DECLARE_PUBLIC_TOKENS(N) _TF_DECLARE_PUBLIC_TOKENS##N
75#define _TF_DECLARE_PUBLIC_TOKENS_EVAL(N) _TF_DECLARE_PUBLIC_TOKENS(N)
76#define _TF_DECLARE_PUBLIC_TOKENS_EXPAND(x) x
77
81#define TF_DECLARE_PUBLIC_TOKENS(...) _TF_DECLARE_PUBLIC_TOKENS_EXPAND( _TF_DECLARE_PUBLIC_TOKENS_EVAL(_TF_DECLARE_PUBLIC_TOKENS_EXPAND( TF_PP_VARIADIC_SIZE(__VA_ARGS__) ))(__VA_ARGS__) )
82
86#define TF_DEFINE_PUBLIC_TOKENS(key, seq) \
87 _TF_DEFINE_TOKENS(key) \
88 TfStaticData<_TF_TOKENS_STRUCT_NAME(key)> key
89
92#define TF_DEFINE_PRIVATE_TOKENS(key, seq) \
93 namespace { \
94 struct _TF_TOKENS_STRUCT_NAME_PRIVATE(key) { \
95 _TF_TOKENS_STRUCT_NAME_PRIVATE(key)() = default; \
96 _TF_TOKENS_DECLARE_MEMBERS(seq) \
97 }; \
98 } \
99 static TfStaticData<_TF_TOKENS_STRUCT_NAME_PRIVATE(key)> key
100
102// Private Macros
103
104// Private macro to generate struct name from key.
105//
106// Note that this needs to be a unique struct name for each translation unit.
107//
108#define _TF_TOKENS_STRUCT_NAME_PRIVATE(key) \
109 TF_PP_CAT(key, _PrivateStaticTokenType)
110
111// Private macro to generate struct name from key. This version is used
112// by the public token declarations, and so key must be unique for the entire
113// namespace.
114//
115#define _TF_TOKENS_STRUCT_NAME(key) \
116 TF_PP_CAT(key, _StaticTokenType)
117
119// Declaration Macros
120
121// Private macro used to generate TfToken member variables. elem can either
122// be a tuple on the form (name, value) or just a name.
123//
124#define _TF_TOKENS_DECLARE_MEMBER(unused, elem) \
125 TfToken _TF_PP_IFF(TF_PP_IS_TUPLE(elem), \
126 TF_PP_TUPLE_ELEM(0, elem), elem){ \
127 _TF_PP_IFF(TF_PP_IS_TUPLE(elem), \
128 TF_PP_TUPLE_ELEM(1, elem), TF_PP_STRINGIZE(elem)), \
129 TfToken::Immortal};
130#define _TF_TOKENS_DECLARE_TOKEN_MEMBERS(seq) \
131 TF_PP_SEQ_FOR_EACH(_TF_TOKENS_DECLARE_MEMBER, ~, seq)
132
133#define _TF_TOKENS_FORWARD_TOKEN(unused, elem) TF_PP_TUPLE_ELEM(0, elem),
134#define _TF_TOKENS_DECLARE_ALL_TOKENS(seq) \
135 std::vector<TfToken> allTokens = \
136 {TF_PP_SEQ_FOR_EACH(_TF_TOKENS_FORWARD_TOKEN, ~, seq)};
137
138// Private macro used to declare the list of members as TfTokens
139//
140#define _TF_TOKENS_DECLARE_MEMBERS(seq) \
141 _TF_TOKENS_DECLARE_TOKEN_MEMBERS(seq) \
142 _TF_TOKENS_DECLARE_ALL_TOKENS(seq) \
143
144// Private macro used to generate a struct of TfTokens.
145//
146#define _TF_DECLARE_TOKENS3(key, seq, eiapi) \
147 struct _TF_TOKENS_STRUCT_NAME(key) { \
148 eiapi _TF_TOKENS_STRUCT_NAME(key)(); \
149 eiapi ~_TF_TOKENS_STRUCT_NAME(key)(); \
150 _TF_TOKENS_DECLARE_MEMBERS(seq) \
151 };
152
153#define _TF_DECLARE_TOKENS2(key, seq) \
154 struct _TF_TOKENS_STRUCT_NAME(key) { \
155 _TF_TOKENS_STRUCT_NAME(key)(); \
156 ~_TF_TOKENS_STRUCT_NAME(key)(); \
157 _TF_TOKENS_DECLARE_MEMBERS(seq) \
158 };
159
161// Definition Macros
162
163// Private macro to define the struct of tokens.
164//
165#define _TF_DEFINE_TOKENS(key) \
166 _TF_TOKENS_STRUCT_NAME(key)::~_TF_TOKENS_STRUCT_NAME(key)() = default; \
167 _TF_TOKENS_STRUCT_NAME(key)::_TF_TOKENS_STRUCT_NAME(key)() = default; \
168
169PXR_NAMESPACE_CLOSE_SCOPE
170
171#endif // PXR_BASE_TF_STATIC_TOKENS_H
TfToken class for efficient string referencing and hashing, plus conversions to and from stl string c...