24 #ifndef PXR_USD_SDF_ACCESSOR_HELPERS_H
25 #define PXR_USD_SDF_ACCESSOR_HELPERS_H
30 #include "pxr/usd/sdf/schema.h"
52 PXR_NAMESPACE_OPEN_SCOPE
55 #define _GET_KEY_(key_) key_
56 #define SDF_NO_PREDICATE true
58 #define _GET_WITH_FALLBACK(key_, heldType_) \
60 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
61 const VtValue& value = _Helper::GetField(this, key_); \
62 if (value.IsEmpty() || !value.IsHolding<heldType_>()) { \
63 const SdfSchemaBase& schema = _Helper::GetSchema(this); \
64 return schema.GetFallback(_GET_KEY_(key_)).Get<heldType_>(); \
67 return value.Get<heldType_>(); \
74 #define SDF_DEFINE_GET(name_, key_, heldType_) \
76 SDF_ACCESSOR_CLASS::Get ## name_() const \
78 if (SDF_ACCESSOR_READ_PREDICATE(_GET_KEY_(key_))) { \
82 _GET_WITH_FALLBACK(key_, heldType_); \
85 #define SDF_DEFINE_IS(name_, key_) \
87 SDF_ACCESSOR_CLASS::Is ## name_() const \
89 if (!SDF_ACCESSOR_READ_PREDICATE(_GET_KEY_(key_))) { \
93 _GET_WITH_FALLBACK(key_, bool); \
96 #define SDF_DEFINE_SET(name_, key_, argType_) \
98 SDF_ACCESSOR_CLASS::Set ## name_(argType_ value) \
100 if (SDF_ACCESSOR_WRITE_PREDICATE(_GET_KEY_(key_))) { \
101 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
102 _Helper::SetField(this, _GET_KEY_(key_), value); \
106 #define SDF_DEFINE_HAS(name_, key_) \
108 SDF_ACCESSOR_CLASS::Has ## name_() const \
110 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
111 return SDF_ACCESSOR_READ_PREDICATE(_GET_KEY_(key_)) ? \
112 _Helper::HasField(this, _GET_KEY_(key_)) : false; \
115 #define SDF_DEFINE_CLEAR(name_, key_) \
117 SDF_ACCESSOR_CLASS::Clear ## name_() \
119 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
120 if (SDF_ACCESSOR_WRITE_PREDICATE(_GET_KEY_(key_))) { \
121 _Helper::ClearField(this, _GET_KEY_(key_)); \
128 #define SDF_DEFINE_GET_PRIVATE(name_, key_, heldType_) \
130 SDF_ACCESSOR_CLASS::_Get ## name_() const \
132 if (SDF_ACCESSOR_READ_PREDICATE(_GET_KEY_(key_))) { \
136 _GET_WITH_FALLBACK(key_, heldType_); \
142 #define SDF_DEFINE_DICTIONARY_GET(name_, key_) \
144 SDF_ACCESSOR_CLASS::name_() const \
146 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
147 return SDF_ACCESSOR_READ_PREDICATE(_GET_KEY_(key_)) ? \
148 SdfDictionaryProxy(_Helper::GetSpecHandle(this), _GET_KEY_(key_)) : \
149 SdfDictionaryProxy(); \
152 #define SDF_DEFINE_DICTIONARY_SET(name_, key_) \
154 SDF_ACCESSOR_CLASS::name_( \
155 const std::string& name, \
156 const VtValue& value) \
158 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
159 if (SDF_ACCESSOR_WRITE_PREDICATE(_GET_KEY_(key_))) { \
160 SdfDictionaryProxy proxy( \
161 _Helper::GetSpecHandle(this), _GET_KEY_(key_)); \
162 if (value.IsEmpty()) { \
166 proxy[name] = value; \
173 #define SDF_DEFINE_TYPED_GET_SET(name_, key_, getType_, setType_) \
174 SDF_DEFINE_GET(name_, key_, getType_) \
175 SDF_DEFINE_SET(name_, key_, setType_)
177 #define SDF_DEFINE_TYPED_GET_SET_HAS_CLEAR(name_, key_, getType_, setType_) \
178 SDF_DEFINE_TYPED_GET_SET(name_, key_, getType_, setType_) \
179 SDF_DEFINE_HAS(name_, key_) \
180 SDF_DEFINE_CLEAR(name_, key_)
182 #define SDF_DEFINE_GET_SET(name_, key_, type_) \
183 SDF_DEFINE_TYPED_GET_SET(name_, key_, type_, \
184 boost::call_traits<type_>::param_type)
186 #define SDF_DEFINE_GET_SET_HAS_CLEAR(name_, key_, type_) \
187 SDF_DEFINE_TYPED_GET_SET_HAS_CLEAR(name_, key_, type_, \
188 boost::call_traits<type_>::param_type)
190 #define SDF_DEFINE_IS_SET(name_, key_) \
191 SDF_DEFINE_IS(name_, key_) \
192 SDF_DEFINE_SET(name_, key_, bool)
194 #define SDF_DEFINE_DICTIONARY_GET_SET(getName_, setName_, key_) \
195 SDF_DEFINE_DICTIONARY_GET(getName_, key_) \
196 SDF_DEFINE_DICTIONARY_SET(setName_, key_)
206 bool IsForSpec = boost::is_base_of<SdfSpec, T>::value>
207 struct Sdf_AccessorHelpers;
210 struct Sdf_AccessorHelpers<T, true>
213 {
return spec->GetSchema(); }
216 {
return spec->GetField(key); }
219 static bool SetField(T* spec,
const TfToken& key,
const V& value)
220 {
return spec->SetField(key, value); }
222 static bool HasField(
const T* spec,
const TfToken& key)
223 {
return spec->HasField(key); }
225 static void ClearField(T* spec,
const TfToken& key)
226 { spec->ClearField(key); }
228 static SdfSpecHandle GetSpecHandle(
const T* spec)
229 {
return SdfCreateNonConstHandle(spec); }
233 struct Sdf_AccessorHelpers<T, false>
236 {
return spec->_GetSpec().GetSchema(); }
239 {
return spec->_GetSpec().GetField(key); }
242 static bool SetField(T* spec,
const TfToken& key,
const V& value)
243 {
return spec->_GetSpec().SetField(key, value); }
245 static bool HasField(
const T* spec,
const TfToken& key)
246 {
return spec->_GetSpec().HasField(key); }
248 static void ClearField(T* spec,
const TfToken& key)
249 { spec->_GetSpec().ClearField(key); }
251 static SdfSpecHandle GetSpecHandle(
const T* spec)
252 {
return SdfCreateNonConstHandle(&(spec->_GetSpec())); }
255 PXR_NAMESPACE_CLOSE_SCOPE
257 #endif // #ifndef PXR_USD_SDF_ACCESSOR_HELPERS_H
Generic class that provides information about scene description fields but doesn't actually provide a...
Token for efficient comparison, assignment, and hashing of known strings.
Provides a container which may hold any type, and provides introspection and iteration over array typ...