7#ifndef PXR_USD_SDF_ABSTRACT_DATA_H
8#define PXR_USD_SDF_ABSTRACT_DATA_H
11#include "pxr/usd/sdf/path.h"
14#include "pxr/base/vt/value.h"
25PXR_NAMESPACE_OPEN_SCOPE
33#define SDF_DATA_TOKENS \
34 ((TimeSamples, "timeSamples"))
68 virtual void CopyFrom(
const SdfAbstractDataConstPtr& source);
116 virtual bool Equals(
const SdfAbstractDataRefPtr &rhs)
const;
175 VtValue *value = NULL)
const = 0;
211 const TfToken& fieldName)
const = 0;
222 virtual std::type_info
const &
253 const T& defaultValue = T())
const;
267 virtual bool HasDictKey(
const SdfPath& path,
272 virtual bool HasDictKey(
const SdfPath& path,
289 virtual void SetDictValueByKey(
const SdfPath& path,
294 virtual void SetDictValueByKey(
const SdfPath& path,
303 virtual void EraseDictValueByKey(
const SdfPath& path,
311 virtual std::vector<TfToken> ListDictKeys(
const SdfPath& path,
330 virtual std::set<double>
331 ListAllTimeSamples()
const = 0;
334 virtual std::set<double>
335 ListTimeSamplesForPath(
const SdfPath& path)
const = 0;
339 GetBracketingTimeSamples(
double time,
double* tLower,
340 double* tUpper)
const = 0;
344 GetNumTimeSamplesForPath(
const SdfPath& path)
const = 0;
348 GetBracketingTimeSamplesForPath(
const SdfPath& path,
350 double* tLower,
double* tUpper)
const = 0;
367 double* tPrevious)
const;
371 QueryTimeSample(
const SdfPath& path,
double time,
372 VtValue *optionalValue = NULL)
const = 0;
375 QueryTimeSample(
const SdfPath& path,
double time,
386 virtual const std::type_info &
391 SetTimeSample(
const SdfPath& path,
double time,
396 EraseTimeSample(
const SdfPath& path,
double time) = 0;
413 const TfToken& field,
const T& defaultVal)
const
431 bool StoreValue(T &&v)
434 using Type = std::remove_cv_t<std::remove_reference_t<T>>;
436 if constexpr (std::is_same_v<Type, VtValue>) {
437 return _StoreVtValue(std::forward<T>(v));
440 isValueBlock =
false;
441 isAnimationBlock =
false;
442 typeMismatch =
false;
443 if constexpr (std::is_same_v<Type, SdfValueBlock>) {
446 }
else if constexpr (std::is_same_v<Type, SdfAnimationBlock>) {
447 isAnimationBlock =
true;
451 *
static_cast<Type*
>(value) = std::forward<T>(v);
459 const std::type_info& valueType;
461 bool isAnimationBlock;
467 , valueType(valueType_)
468 , isValueBlock(
false)
469 , isAnimationBlock(
false)
470 , typeMismatch(
false)
474 virtual bool _StoreVtValue(
const VtValue& value) = 0;
475 virtual bool _StoreVtValue(
VtValue &&value) = 0;
500 T
const &_Get(
const VtValue &v) {
508 template <
class Value>
509 bool _StoreVtValueImpl(Value &&v) {
510 typeMismatch =
false;
511 isValueBlock =
false;
512 isAnimationBlock =
false;
513 if (ARCH_LIKELY(std::forward<Value>(v).
template IsHolding<T>())) {
514 *
static_cast<T*
>(value) = _Get(std::forward<Value>(v));
515 if constexpr (std::is_same_v<T, SdfValueBlock>) {
517 }
else if constexpr (std::is_same_v<T, SdfAnimationBlock>) {
518 isAnimationBlock =
true;
523 if (std::forward<Value>(v).template IsHolding<SdfValueBlock>()) {
527 else if (std::forward<Value>(v).template IsHolding<SdfAnimationBlock>())
529 isAnimationBlock =
true;
539 _StoreVtValue(
const VtValue& v)
override {
540 return _StoreVtValueImpl(v);
544 _StoreVtValue(
VtValue &&v)
override {
545 return _StoreVtValueImpl(v);
557 virtual bool GetValue(
VtValue* value)
const = 0;
559 template <
class T>
bool GetValue(T* v)
const
562 *v = *
static_cast<const T*
>(value);
568 virtual bool IsEqual(
const VtValue& value)
const = 0;
571 const std::type_info& valueType;
572 const bool isArrayEdit;
573 const std::type_info& elementValueType;
577 const std::type_info& valueType_,
578 const bool isArrayEdit_,
579 const std::type_info& elementValueType_)
581 , valueType(valueType_)
582 , isArrayEdit(isArrayEdit_)
583 , elementValueType(elementValueType_)
605 static std::type_info
const &_GetElementType() {
607 return typeid(
typename T::ElementType);
619 virtual bool GetValue(
VtValue* v)
const
625 virtual bool IsEqual(
const VtValue& v)
const
631 const T& _GetValue()
const
633 return *
static_cast<const T*
>(value);
644 typedef char CharArray[N];
678PXR_NAMESPACE_CLOSE_SCOPE
The fully-typed container for a field value in an SdfAbstractData.
A type-erased container for a const field value in an SdfAbstractData.
Interface for scene description data storage.
virtual SDF_API void Set(const SdfPath &path, const TfToken &fieldName, const SdfAbstractDataConstValue &value)=0
Set the value of the given path and fieldName.
virtual SDF_API const std::type_info & QueryTimeSampleTypeid(const SdfPath &path, double time) const
If there is a time sample authored at time, return its value's typeid(), otherwise return typeid(void...
virtual SDF_API bool HasSpec(const SdfPath &path) const =0
Return true if this data has a spec for path.
virtual SDF_API bool Has(const SdfPath &path, const TfToken &fieldName, SdfAbstractDataValue *value) const =0
Returns whether a value exists for the given path and fieldName.
virtual SDF_API bool Has(const SdfPath &path, const TfToken &fieldName, VtValue *value=NULL) const =0
Return whether a value exists for the given path and fieldName.
virtual SDF_API bool IsDetached() const
Returns true if this data object is detached from its serialized data store, false otherwise.
virtual SDF_API bool GetPreviousTimeSampleForPath(const SdfPath &path, double time, double *tPrevious) const
Returns the previous time sample authored just before the querying time.
virtual SDF_API std::type_info const & GetTypeid(const SdfPath &path, const TfToken &fieldName) const
Return the type of the value for fieldName on spec path.
virtual SDF_API bool IsEmpty() const
Returns true if this data object has no specs, false otherwise.
virtual SDF_API bool Equals(const SdfAbstractDataRefPtr &rhs) const
Returns true if this data object contains the same specs and fields as lhs, false otherwise.
virtual SDF_API void CopyFrom(const SdfAbstractDataConstPtr &source)
Copy the data in source into this data object.
virtual SDF_API VtValue Get(const SdfPath &path, const TfToken &fieldName) const =0
Return the value for the given path and fieldName.
virtual SDF_API void CreateSpec(const SdfPath &path, SdfSpecType specType)=0
Create a new spec at path with the given specType.
virtual SDF_API bool HasSpecAndField(const SdfPath &path, const TfToken &fieldName, VtValue *value, SdfSpecType *specType) const
Fill specType (which cannot be nullptr) as if by a call to GetSpecType(path).
virtual SDF_API void EraseSpec(const SdfPath &path)=0
Erase the spec at path and any fields that are on it.
virtual SDF_API void WriteToStream(std::ostream &out) const
Writes the contents of this data object to out.
virtual SDF_API std::vector< TfToken > List(const SdfPath &path) const =0
Return the names of all the fields that are set at path.
virtual SDF_API void Set(const SdfPath &path, const TfToken &fieldName, const VtValue &value)=0
Set the value of the given path and fieldName.
virtual SDF_API bool StreamsData() const =0
Returns true if this data object streams its data to and from its serialized data store on demand.
virtual SDF_API bool HasSpecAndField(const SdfPath &path, const TfToken &fieldName, SdfAbstractDataValue *value, SdfSpecType *specType) const
Fill specType (which cannot be nullptr) as if by a call to GetSpecType(path).
virtual SDF_API void _VisitSpecs(SdfAbstractDataSpecVisitor *visitor) const =0
Visits every spec in this SdfAbstractData object with the given visitor.
SDF_API void VisitSpecs(SdfAbstractDataSpecVisitor *visitor) const
Visits every spec in this SdfAbstractData object with the given visitor.
virtual SDF_API void MoveSpec(const SdfPath &oldPath, const SdfPath &newPath)=0
Move the spec at oldPath to newPath, including all the fields that are on it.
T GetAs(const SdfPath &path, const TfToken &fieldName, const T &defaultValue=T()) const
Return the value for the given path and fieldName.
virtual SDF_API void Erase(const SdfPath &path, const TfToken &fieldName)=0
Remove the field at path and fieldName, if one exists.
virtual SdfSpecType GetSpecType(const SdfPath &path) const =0
Return the spec type for the spec at path.
Base class for objects used to visit specs in an SdfAbstractData object.
virtual SDF_API bool VisitSpec(const SdfAbstractData &data, const SdfPath &path)=0
SdfAbstractData::VisitSpecs calls this function for every entry it contains, passing itself as data a...
virtual SDF_API void Done(const SdfAbstractData &data)=0
SdfAbstractData::VisitSpecs will call this after visitation is complete, even if some VisitSpec() ret...
The fully-typed container for a field value in an SdfAbstractData.
A type-erased container for a field value in an SdfAbstractData.
A path value used to locate objects in layers or scenegraphs.
Enable a concrete base class for use with TfRefPtr.
Token for efficient comparison, assignment, and hashing of known strings.
Enable a concrete base class for use with TfWeakPtr.
Provides a container which may hold any type, and provides introspection and iteration over array typ...
T UncheckedRemove()
Make this value empty and return the held T instance.
bool IsHolding() const
Return true if this value is holding an object of type T, false otherwise.
T const & UncheckedGet() const &
Returns a const reference to the held object if the held object is of type T.
Standard pointer typedefs.
#define TF_DECLARE_WEAK_AND_REF_PTRS(type)
Define standard weak, ref, and vector pointer types.
SdfSpecType
An enum that specifies the type of an object.
bool TfSafeTypeCompare(const std::type_info &t1, const std::type_info &t2)
Safely compare std::type_info structures.
This file defines some macros that are useful for declaring and using static TfTokens.
#define TF_DECLARE_PUBLIC_TOKENS(...)
Macro to define public tokens.
A trait to detect instantiations of VtArrayEdit, specialized in arrayEdit.h.
TfToken class for efficient string referencing and hashing, plus conversions to and from stl string c...