24#ifndef PXR_USD_SDF_ACCESSOR_HELPERS_H
25#define PXR_USD_SDF_ACCESSOR_HELPERS_H
30#include "pxr/usd/sdf/schema.h"
54PXR_NAMESPACE_OPEN_SCOPE
57#define _GET_KEY_(key_) key_
58#define SDF_NO_PREDICATE true
60#define _GET_WITH_FALLBACK(key_, heldType_) \
62 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
63 const VtValue& value = _Helper::GetField(this, key_); \
64 if (value.IsEmpty() || !value.IsHolding<heldType_>()) { \
65 const SdfSchemaBase& schema = _Helper::GetSchema(this); \
66 return schema.GetFallback(_GET_KEY_(key_)).Get<heldType_>(); \
69 return value.Get<heldType_>(); \
76#define SDF_DEFINE_GET(name_, key_, heldType_) \
78SDF_ACCESSOR_CLASS::Get ## name_() const \
80 if (SDF_ACCESSOR_READ_PREDICATE(_GET_KEY_(key_))) { \
84 _GET_WITH_FALLBACK(key_, heldType_); \
87#define SDF_DEFINE_IS(name_, key_) \
89SDF_ACCESSOR_CLASS::Is ## name_() const \
91 if (!SDF_ACCESSOR_READ_PREDICATE(_GET_KEY_(key_))) { \
95 _GET_WITH_FALLBACK(key_, bool); \
98#define SDF_DEFINE_SET(name_, key_, argType_) \
100SDF_ACCESSOR_CLASS::Set ## name_(argType_ value) \
102 if (SDF_ACCESSOR_WRITE_PREDICATE(_GET_KEY_(key_))) { \
103 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
104 _Helper::SetField(this, _GET_KEY_(key_), value); \
108#define SDF_DEFINE_HAS(name_, key_) \
110SDF_ACCESSOR_CLASS::Has ## name_() const \
112 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
113 return SDF_ACCESSOR_READ_PREDICATE(_GET_KEY_(key_)) ? \
114 _Helper::HasField(this, _GET_KEY_(key_)) : false; \
117#define SDF_DEFINE_CLEAR(name_, key_) \
119SDF_ACCESSOR_CLASS::Clear ## name_() \
121 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
122 if (SDF_ACCESSOR_WRITE_PREDICATE(_GET_KEY_(key_))) { \
123 _Helper::ClearField(this, _GET_KEY_(key_)); \
130#define SDF_DEFINE_GET_PRIVATE(name_, key_, heldType_) \
132SDF_ACCESSOR_CLASS::_Get ## name_() const \
134 if (SDF_ACCESSOR_READ_PREDICATE(_GET_KEY_(key_))) { \
138 _GET_WITH_FALLBACK(key_, heldType_); \
144#define SDF_DEFINE_DICTIONARY_GET(name_, key_) \
146SDF_ACCESSOR_CLASS::name_() const \
148 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
149 return SDF_ACCESSOR_READ_PREDICATE(_GET_KEY_(key_)) ? \
150 SdfDictionaryProxy(_Helper::GetSpecHandle(this), _GET_KEY_(key_)) : \
151 SdfDictionaryProxy(); \
154#define SDF_DEFINE_DICTIONARY_SET(name_, key_) \
156SDF_ACCESSOR_CLASS::name_( \
157 const std::string& name, \
158 const VtValue& value) \
160 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
161 if (SDF_ACCESSOR_WRITE_PREDICATE(_GET_KEY_(key_))) { \
162 SdfDictionaryProxy proxy( \
163 _Helper::GetSpecHandle(this), _GET_KEY_(key_)); \
164 if (value.IsEmpty()) { \
168 proxy[name] = value; \
178using Sdf_SetParameter = std::conditional<
179 std::is_arithmetic<T>::value, std::add_const_t<T>,
180 std::add_lvalue_reference_t<std::add_const_t<T>>>;
182#define SDF_DEFINE_TYPED_GET_SET(name_, key_, getType_, setType_) \
183SDF_DEFINE_GET(name_, key_, getType_) \
184SDF_DEFINE_SET(name_, key_, setType_)
186#define SDF_DEFINE_TYPED_GET_SET_HAS_CLEAR(name_, key_, getType_, setType_) \
187SDF_DEFINE_TYPED_GET_SET(name_, key_, getType_, setType_) \
188SDF_DEFINE_HAS(name_, key_) \
189SDF_DEFINE_CLEAR(name_, key_)
191#define SDF_DEFINE_GET_SET(name_, key_, type_) \
192SDF_DEFINE_TYPED_GET_SET(name_, key_, type_, \
193 Sdf_SetParameter<type_>::type)
195#define SDF_DEFINE_GET_SET_HAS_CLEAR(name_, key_, type_) \
196SDF_DEFINE_TYPED_GET_SET_HAS_CLEAR(name_, key_, type_, \
197 Sdf_SetParameter<type_>::type)
199#define SDF_DEFINE_IS_SET(name_, key_) \
200SDF_DEFINE_IS(name_, key_) \
201SDF_DEFINE_SET(name_, key_, bool)
203#define SDF_DEFINE_DICTIONARY_GET_SET(getName_, setName_, key_) \
204SDF_DEFINE_DICTIONARY_GET(getName_, key_) \
205SDF_DEFINE_DICTIONARY_SET(setName_, key_)
215 bool IsForSpec = std::is_base_of<SdfSpec, T>::value>
216struct Sdf_AccessorHelpers;
219struct Sdf_AccessorHelpers<T, true>
222 {
return spec->GetSchema(); }
225 {
return spec->GetField(key); }
228 static bool SetField(T* spec,
const TfToken& key,
const V& value)
229 {
return spec->SetField(key, value); }
231 static bool HasField(
const T* spec,
const TfToken& key)
232 {
return spec->HasField(key); }
234 static void ClearField(T* spec,
const TfToken& key)
235 { spec->ClearField(key); }
237 static SdfSpecHandle GetSpecHandle(
const T* spec)
238 {
return SdfCreateNonConstHandle(spec); }
242struct Sdf_AccessorHelpers<T, false>
245 {
return spec->_GetSpec().GetSchema(); }
248 {
return spec->_GetSpec().GetField(key); }
251 static bool SetField(T* spec,
const TfToken& key,
const V& value)
252 {
return spec->_GetSpec().SetField(key, value); }
254 static bool HasField(
const T* spec,
const TfToken& key)
255 {
return spec->_GetSpec().HasField(key); }
257 static void ClearField(T* spec,
const TfToken& key)
258 { spec->_GetSpec().ClearField(key); }
260 static SdfSpecHandle GetSpecHandle(
const T* spec)
261 {
return SdfCreateNonConstHandle(&(spec->_GetSpec())); }
264PXR_NAMESPACE_CLOSE_SCOPE
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...