7#ifndef PXR_USD_SDF_ACCESSOR_HELPERS_H
8#define PXR_USD_SDF_ACCESSOR_HELPERS_H
13#include "pxr/usd/sdf/schema.h"
37PXR_NAMESPACE_OPEN_SCOPE
40#define _GET_KEY_(key_) key_
41#define SDF_NO_PREDICATE true
43#define _GET_WITH_FALLBACK(key_, heldType_) \
45 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
46 const VtValue& value = _Helper::GetField(this, key_); \
47 if (value.IsEmpty() || !value.IsHolding<heldType_>()) { \
48 const SdfSchemaBase& schema = _Helper::GetSchema(this); \
49 return schema.GetFallback(_GET_KEY_(key_)).Get<heldType_>(); \
52 return value.Get<heldType_>(); \
59#define SDF_DEFINE_GET(name_, key_, heldType_) \
61SDF_ACCESSOR_CLASS::Get ## name_() const \
63 if (SDF_ACCESSOR_READ_PREDICATE(_GET_KEY_(key_))) { \
67 _GET_WITH_FALLBACK(key_, heldType_); \
70#define SDF_DEFINE_IS(name_, key_) \
72SDF_ACCESSOR_CLASS::Is ## name_() const \
74 if (!SDF_ACCESSOR_READ_PREDICATE(_GET_KEY_(key_))) { \
78 _GET_WITH_FALLBACK(key_, bool); \
81#define SDF_DEFINE_SET(name_, key_, argType_) \
83SDF_ACCESSOR_CLASS::Set ## name_(argType_ value) \
85 if (SDF_ACCESSOR_WRITE_PREDICATE(_GET_KEY_(key_))) { \
86 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
87 _Helper::SetField(this, _GET_KEY_(key_), value); \
91#define SDF_DEFINE_HAS(name_, key_) \
93SDF_ACCESSOR_CLASS::Has ## name_() const \
95 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
96 return SDF_ACCESSOR_READ_PREDICATE(_GET_KEY_(key_)) ? \
97 _Helper::HasField(this, _GET_KEY_(key_)) : false; \
100#define SDF_DEFINE_CLEAR(name_, key_) \
102SDF_ACCESSOR_CLASS::Clear ## name_() \
104 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
105 if (SDF_ACCESSOR_WRITE_PREDICATE(_GET_KEY_(key_))) { \
106 _Helper::ClearField(this, _GET_KEY_(key_)); \
113#define SDF_DEFINE_GET_PRIVATE(name_, key_, heldType_) \
115SDF_ACCESSOR_CLASS::_Get ## name_() const \
117 if (SDF_ACCESSOR_READ_PREDICATE(_GET_KEY_(key_))) { \
121 _GET_WITH_FALLBACK(key_, heldType_); \
127#define SDF_DEFINE_DICTIONARY_GET(name_, key_) \
129SDF_ACCESSOR_CLASS::name_() const \
131 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
132 return SDF_ACCESSOR_READ_PREDICATE(_GET_KEY_(key_)) ? \
133 SdfDictionaryProxy(_Helper::GetSpecHandle(this), _GET_KEY_(key_)) : \
134 SdfDictionaryProxy(); \
137#define SDF_DEFINE_DICTIONARY_SET(name_, key_) \
139SDF_ACCESSOR_CLASS::name_( \
140 const std::string& name, \
141 const VtValue& value) \
143 typedef Sdf_AccessorHelpers<SDF_ACCESSOR_CLASS> _Helper; \
144 if (SDF_ACCESSOR_WRITE_PREDICATE(_GET_KEY_(key_))) { \
145 SdfDictionaryProxy proxy( \
146 _Helper::GetSpecHandle(this), _GET_KEY_(key_)); \
147 if (value.IsEmpty()) { \
151 proxy[name] = value; \
161using Sdf_SetParameter = std::conditional<
162 std::is_arithmetic<T>::value, std::add_const_t<T>,
163 std::add_lvalue_reference_t<std::add_const_t<T>>>;
165#define SDF_DEFINE_TYPED_GET_SET(name_, key_, getType_, setType_) \
166SDF_DEFINE_GET(name_, key_, getType_) \
167SDF_DEFINE_SET(name_, key_, setType_)
169#define SDF_DEFINE_TYPED_GET_SET_HAS_CLEAR(name_, key_, getType_, setType_) \
170SDF_DEFINE_TYPED_GET_SET(name_, key_, getType_, setType_) \
171SDF_DEFINE_HAS(name_, key_) \
172SDF_DEFINE_CLEAR(name_, key_)
174#define SDF_DEFINE_GET_SET(name_, key_, type_) \
175SDF_DEFINE_TYPED_GET_SET(name_, key_, type_, \
176 Sdf_SetParameter<type_>::type)
178#define SDF_DEFINE_GET_SET_HAS_CLEAR(name_, key_, type_) \
179SDF_DEFINE_TYPED_GET_SET_HAS_CLEAR(name_, key_, type_, \
180 Sdf_SetParameter<type_>::type)
182#define SDF_DEFINE_IS_SET(name_, key_) \
183SDF_DEFINE_IS(name_, key_) \
184SDF_DEFINE_SET(name_, key_, bool)
186#define SDF_DEFINE_DICTIONARY_GET_SET(getName_, setName_, key_) \
187SDF_DEFINE_DICTIONARY_GET(getName_, key_) \
188SDF_DEFINE_DICTIONARY_SET(setName_, key_)
198 bool IsForSpec = std::is_base_of<SdfSpec, T>::value>
199struct Sdf_AccessorHelpers;
202struct Sdf_AccessorHelpers<T, true>
205 {
return spec->GetSchema(); }
208 {
return spec->GetField(key); }
211 static bool SetField(T* spec,
const TfToken& key,
const V& value)
212 {
return spec->SetField(key, value); }
214 static bool HasField(
const T* spec,
const TfToken& key)
215 {
return spec->HasField(key); }
217 static void ClearField(T* spec,
const TfToken& key)
218 { spec->ClearField(key); }
220 static SdfSpecHandle GetSpecHandle(
const T* spec)
221 {
return SdfCreateNonConstHandle(spec); }
225struct Sdf_AccessorHelpers<T, false>
228 {
return spec->_GetSpec().GetSchema(); }
231 {
return spec->_GetSpec().GetField(key); }
234 static bool SetField(T* spec,
const TfToken& key,
const V& value)
235 {
return spec->_GetSpec().SetField(key, value); }
237 static bool HasField(
const T* spec,
const TfToken& key)
238 {
return spec->_GetSpec().HasField(key); }
240 static void ClearField(T* spec,
const TfToken& key)
241 { spec->_GetSpec().ClearField(key); }
243 static SdfSpecHandle GetSpecHandle(
const T* spec)
244 {
return SdfCreateNonConstHandle(&(spec->_GetSpec())); }
247PXR_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...