24 #ifndef PXR_USD_SDF_ACCESSOR_HELPERS_H
25 #define PXR_USD_SDF_ACCESSOR_HELPERS_H
34 #include <hboost/call_traits.hpp>
35 #include <type_traits>
58 #define _GET_KEY_(key_) key_
59 #define SDF_NO_PREDICATE true
61 #define _GET_WITH_FALLBACK(key_, heldType_) \
63 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
64 const VtValue& value = _Helper::GetField(this, key_); \
65 if (value.IsEmpty() || !value.IsHolding<heldType_>()) { \
66 const SdfSchemaBase& schema = _Helper::GetSchema(this); \
67 return schema.GetFallback(_GET_KEY_(key_)).Get<heldType_>(); \
70 return value.Get<heldType_>(); \
77 #define SDF_DEFINE_GET(name_, key_, heldType_) \
79 SDF_ACCESSOR_CLASS::Get ## name_() const \
81 if (SDF_ACCESSOR_READ_PREDICATE(_GET_KEY_(key_))) { \
85 _GET_WITH_FALLBACK(key_, heldType_); \
88 #define SDF_DEFINE_IS(name_, key_) \
90 SDF_ACCESSOR_CLASS::Is ## name_() const \
92 if (!SDF_ACCESSOR_READ_PREDICATE(_GET_KEY_(key_))) { \
96 _GET_WITH_FALLBACK(key_, bool); \
99 #define SDF_DEFINE_SET(name_, key_, argType_) \
101 SDF_ACCESSOR_CLASS::Set ## name_(argType_ value) \
103 if (SDF_ACCESSOR_WRITE_PREDICATE(_GET_KEY_(key_))) { \
104 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
105 _Helper::SetField(this, _GET_KEY_(key_), value); \
109 #define SDF_DEFINE_HAS(name_, key_) \
111 SDF_ACCESSOR_CLASS::Has ## name_() const \
113 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
114 return SDF_ACCESSOR_READ_PREDICATE(_GET_KEY_(key_)) ? \
115 _Helper::HasField(this, _GET_KEY_(key_)) : false; \
118 #define SDF_DEFINE_CLEAR(name_, key_) \
120 SDF_ACCESSOR_CLASS::Clear ## name_() \
122 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
123 if (SDF_ACCESSOR_WRITE_PREDICATE(_GET_KEY_(key_))) { \
124 _Helper::ClearField(this, _GET_KEY_(key_)); \
131 #define SDF_DEFINE_GET_PRIVATE(name_, key_, heldType_) \
133 SDF_ACCESSOR_CLASS::_Get ## name_() const \
135 if (SDF_ACCESSOR_READ_PREDICATE(_GET_KEY_(key_))) { \
139 _GET_WITH_FALLBACK(key_, heldType_); \
145 #define SDF_DEFINE_DICTIONARY_GET(name_, key_) \
147 SDF_ACCESSOR_CLASS::name_() const \
149 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
150 return SDF_ACCESSOR_READ_PREDICATE(_GET_KEY_(key_)) ? \
151 SdfDictionaryProxy(_Helper::GetSpecHandle(this), _GET_KEY_(key_)) : \
152 SdfDictionaryProxy(); \
155 #define SDF_DEFINE_DICTIONARY_SET(name_, key_) \
157 SDF_ACCESSOR_CLASS::name_( \
158 const std::string& name, \
159 const VtValue& value) \
161 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
162 if (SDF_ACCESSOR_WRITE_PREDICATE(_GET_KEY_(key_))) { \
163 SdfDictionaryProxy proxy( \
164 _Helper::GetSpecHandle(this), _GET_KEY_(key_)); \
165 if (value.IsEmpty()) { \
169 proxy[name] = value; \
176 #define SDF_DEFINE_TYPED_GET_SET(name_, key_, getType_, setType_) \
177 SDF_DEFINE_GET(name_, key_, getType_) \
178 SDF_DEFINE_SET(name_, key_, setType_)
180 #define SDF_DEFINE_TYPED_GET_SET_HAS_CLEAR(name_, key_, getType_, setType_) \
181 SDF_DEFINE_TYPED_GET_SET(name_, key_, getType_, setType_) \
182 SDF_DEFINE_HAS(name_, key_) \
183 SDF_DEFINE_CLEAR(name_, key_)
185 #define SDF_DEFINE_GET_SET(name_, key_, type_) \
186 SDF_DEFINE_TYPED_GET_SET(name_, key_, type_, \
187 hboost::call_traits<type_>::param_type)
189 #define SDF_DEFINE_GET_SET_HAS_CLEAR(name_, key_, type_) \
190 SDF_DEFINE_TYPED_GET_SET_HAS_CLEAR(name_, key_, type_, \
191 hboost::call_traits<type_>::param_type)
193 #define SDF_DEFINE_IS_SET(name_, key_) \
194 SDF_DEFINE_IS(name_, key_) \
195 SDF_DEFINE_SET(name_, key_, bool)
197 #define SDF_DEFINE_DICTIONARY_GET_SET(getName_, setName_, key_) \
198 SDF_DEFINE_DICTIONARY_GET(getName_, key_) \
199 SDF_DEFINE_DICTIONARY_SET(setName_, key_)
216 {
return spec->GetSchema(); }
219 {
return spec->GetField(key); }
223 {
return spec->SetField(key, value); }
226 {
return spec->HasField(key); }
229 { spec->ClearField(key); }
239 {
return spec->_GetSpec().GetSchema(); }
242 {
return spec->_GetSpec().GetField(key); }
246 {
return spec->_GetSpec().SetField(key, value); }
249 {
return spec->_GetSpec().HasField(key); }
252 { spec->_GetSpec().ClearField(key); }
260 #endif // #ifndef PXR_USD_SDF_ACCESSOR_HELPERS_H
static SdfSpecHandle GetSpecHandle(const T *spec)
static VtValue GetField(const T *spec, const TfToken &key)
static bool HasField(const T *spec, const TfToken &key)
static const SdfSchemaBase & GetSchema(const T *spec)
GLsizei const GLfloat * value
static void ClearField(T *spec, const TfToken &key)
static void ClearField(T *spec, const TfToken &key)
static VtValue GetField(const T *spec, const TfToken &key)
static bool SetField(T *spec, const TfToken &key, const V &value)
static SdfSpecHandle GetSpecHandle(const T *spec)
static bool SetField(T *spec, const TfToken &key, const V &value)
static bool HasField(const T *spec, const TfToken &key)
static const SdfSchemaBase & GetSchema(const T *spec)
SdfHandleTo< T >::Handle SdfCreateNonConstHandle(T const *p)
PXR_NAMESPACE_CLOSE_SCOPE PXR_NAMESPACE_OPEN_SCOPE
#define PXR_NAMESPACE_CLOSE_SCOPE