7#ifndef PXR_BASE_VT_VALUE_COMMON_H
8#define PXR_BASE_VT_VALUE_COMMON_H
12#include "pxr/base/tf/anyUniquePtr.h"
13#include "pxr/base/tf/preprocessorUtilsLite.h"
16#include "pxr/base/vt/api.h"
23PXR_NAMESPACE_OPEN_SCOPE
29struct Vt_DefaultValueFactory;
33struct Vt_DefaultValueHolder
38 static Vt_DefaultValueHolder Create() {
39 return Vt_DefaultValueHolder(TfAnyUniquePtr::New<T>(),
typeid(T));
45 static Vt_DefaultValueHolder Create(T
const &val) {
46 return Vt_DefaultValueHolder(TfAnyUniquePtr::New(val),
typeid(T));
50 std::type_info
const &GetType()
const {
56 void const *GetPointer()
const {
61 Vt_DefaultValueHolder(
TfAnyUniquePtr &&ptr, std::type_info
const &type)
62 : _ptr(
std::move(ptr)), _type(&type) {}
65 std::type_info
const *_type;
69Vt_FindOrCreateDefaultValue(std::type_info
const &type,
70 Vt_DefaultValueHolder (*factory)());
72#define VT_VALUE_SET_STORED_TYPE(SRC, DST) \
73 template <> struct Vt_ValueStoredType<SRC> { typedef DST Type; }
75template <
class T>
struct Vt_ValueStoredType {
typedef T Type; };
76VT_VALUE_SET_STORED_TYPE(
char const *, std::string);
77VT_VALUE_SET_STORED_TYPE(
char *, std::string);
80struct Vt_ValueStoredType<char [N]> {
81 using Type = std::string;
84#ifdef PXR_PYTHON_SUPPORT_ENABLED
85VT_VALUE_SET_STORED_TYPE(pxr_boost::python::object,
TfPyObjWrapper);
88#undef VT_VALUE_SET_STORED_TYPE
92using Vt_ValueGetStored = Vt_ValueStoredType<std::decay_t<T>>;
100struct Vt_DefaultValueFactory {
101 static Vt_DefaultValueHolder Invoke();
105inline Vt_DefaultValueHolder
106Vt_DefaultValueFactory<T>::Invoke() {
107 return Vt_DefaultValueHolder::Create<T>();
118#define _VT_DECLARE_ZERO_VALUE_FACTORY(unused, elem) \
120VT_API Vt_DefaultValueHolder Vt_DefaultValueFactory<VT_TYPE(elem)>::Invoke();
122TF_PP_SEQ_FOR_EACH(_VT_DECLARE_ZERO_VALUE_FACTORY, ~,
124 VT_MATRIX_VALUE_TYPES
125 VT_QUATERNION_VALUE_TYPES
126 VT_DUALQUATERNION_VALUE_TYPES)
128#undef _VT_DECLARE_ZERO_VALUE_FACTORY
132PXR_NAMESPACE_CLOSE_SCOPE
Defines all the types "TYPED" for which Vt creates a VtTYPEDArray typedef.
A simple type-erased container that provides only destruction, moves and immutable,...
Boost Python object wrapper.
A file containing basic constants and definitions.