24#ifndef PXR_BASE_VT_TYPES_H
25#define PXR_BASE_VT_TYPES_H
31#include "pxr/base/vt/api.h"
36#include "pxr/base/tf/meta.h"
37#include "pxr/base/tf/preprocessorUtilsLite.h"
44PXR_NAMESPACE_OPEN_SCOPE
48VT_TYPE_IS_CHEAP_TO_COPY(
TfToken);
52#define VT_FLOATING_POINT_BUILTIN_VALUE_TYPES \
57#define VT_INTEGRAL_BUILTIN_VALUE_TYPES \
60(( unsigned char, UChar )) \
62(( unsigned short, UShort )) \
64(( unsigned int, UInt )) \
68#define VT_VEC_INT_VALUE_TYPES \
73#define VT_VEC_HALF_VALUE_TYPES \
78#define VT_VEC_FLOAT_VALUE_TYPES \
83#define VT_VEC_DOUBLE_VALUE_TYPES \
88#define VT_VEC_VALUE_TYPES \
89 VT_VEC_INT_VALUE_TYPES \
90 VT_VEC_HALF_VALUE_TYPES \
91 VT_VEC_FLOAT_VALUE_TYPES \
92 VT_VEC_DOUBLE_VALUE_TYPES
94#define VT_MATRIX_FLOAT_VALUE_TYPES \
95(( GfMatrix4f, Matrix4f )) \
96(( GfMatrix3f, Matrix3f )) \
97(( GfMatrix2f, Matrix2f )) \
99#define VT_MATRIX_DOUBLE_VALUE_TYPES \
100(( GfMatrix4d, Matrix4d )) \
101(( GfMatrix3d, Matrix3d )) \
102(( GfMatrix2d, Matrix2d ))
104#define VT_MATRIX_VALUE_TYPES \
105 VT_MATRIX_FLOAT_VALUE_TYPES \
106 VT_MATRIX_DOUBLE_VALUE_TYPES \
108#define VT_GFRANGE_VALUE_TYPES \
109(( GfRange3f, Range3f )) \
110(( GfRange3d, Range3d )) \
111(( GfRange2f, Range2f )) \
112(( GfRange2d, Range2d )) \
113(( GfRange1f, Range1f )) \
114(( GfRange1d, Range1d ))
116#define VT_RANGE_VALUE_TYPES \
117 VT_GFRANGE_VALUE_TYPES \
118(( GfInterval, Interval )) \
119(( GfRect2i, Rect2i ))
121#define VT_STRING_VALUE_TYPES \
122(( std::string, String )) \
125#define VT_QUATERNION_VALUE_TYPES \
126(( GfQuath, Quath )) \
127(( GfQuatf, Quatf )) \
128(( GfQuatd, Quatd )) \
129(( GfQuaternion, Quaternion ))
131#define VT_DUALQUATERNION_VALUE_TYPES \
132(( GfDualQuath, DualQuath )) \
133(( GfDualQuatf, DualQuatf )) \
134(( GfDualQuatd, DualQuatd ))
136#define VT_NONARRAY_VALUE_TYPES \
137(( GfFrustum, Frustum)) \
138(( GfMultiInterval, MultiInterval))
141#define VT_TYPE(elem) \
142TF_PP_TUPLE_ELEM(0, elem)
143#define VT_TYPE_NAME(elem) \
144TF_PP_TUPLE_ELEM(1, elem)
148#define VT_BUILTIN_NUMERIC_VALUE_TYPES \
149VT_INTEGRAL_BUILTIN_VALUE_TYPES VT_FLOATING_POINT_BUILTIN_VALUE_TYPES
151#define VT_BUILTIN_VALUE_TYPES \
152VT_BUILTIN_NUMERIC_VALUE_TYPES VT_STRING_VALUE_TYPES
154#define VT_SCALAR_CLASS_VALUE_TYPES \
156VT_MATRIX_VALUE_TYPES \
157VT_RANGE_VALUE_TYPES \
158VT_QUATERNION_VALUE_TYPES \
159VT_DUALQUATERNION_VALUE_TYPES
161#define VT_SCALAR_VALUE_TYPES \
162VT_SCALAR_CLASS_VALUE_TYPES VT_BUILTIN_VALUE_TYPES
170template<
typename T>
class VtArray;
171#define VT_ARRAY_TYPEDEF(unused, elem) \
172typedef VtArray< VT_TYPE(elem) > \
173TF_PP_CAT(Vt, TF_PP_CAT(VT_TYPE_NAME(elem), Array)) ;
174TF_PP_SEQ_FOR_EACH(VT_ARRAY_TYPEDEF, ~, VT_SCALAR_VALUE_TYPES)
178#define VT_ARRAY_TYPE_TUPLE(unused, elem) \
179(( TF_PP_CAT(Vt, TF_PP_CAT(VT_TYPE_NAME(elem), Array)) , \
180 TF_PP_CAT(VT_TYPE_NAME(elem), Array) ))
181#define VT_ARRAY_VALUE_TYPES \
182TF_PP_SEQ_FOR_EACH(VT_ARRAY_TYPE_TUPLE, ~, VT_SCALAR_VALUE_TYPES)
184#define VT_CLASS_VALUE_TYPES \
185VT_ARRAY_VALUE_TYPES VT_SCALAR_CLASS_VALUE_TYPES VT_NONARRAY_VALUE_TYPES
187#define VT_VALUE_TYPES \
188 VT_BUILTIN_VALUE_TYPES VT_CLASS_VALUE_TYPES
190#define _VT_MAP_TYPE_LIST(unused, elem) , VT_TYPE(elem)
195using Vt_ValueTypeList =
196 TfMetaApply<TfMetaTail, TfMetaList<
197 void TF_PP_SEQ_FOR_EACH(_VT_MAP_TYPE_LIST, ~, VT_VALUE_TYPES)>>;
199namespace Vt_KnownValueTypeDetail
206GetIndexImpl(TfMetaList<>) {
210template <
typename T,
typename Typelist>
212GetIndexImpl(Typelist) {
213 if (std::is_same_v<T, TfMetaApply<TfMetaHead, Typelist>>) {
216 else if (
const int indexOfTail =
217 GetIndexImpl<T>(TfMetaApply<TfMetaTail, Typelist>{});
219 return 1 + indexOfTail;
229 return GetIndexImpl<T>(Vt_ValueTypeList{});
236VtGetNumKnownValueTypes() {
237 return TfMetaApply<TfMetaLength, Vt_ValueTypeList>::value;
256 constexpr int index = Vt_KnownValueTypeDetail::GetIndex<T>();
257 static_assert(index != -1,
"T is not one of the known VT_VALUE_TYPES.");
266 return Vt_KnownValueTypeDetail::GetIndex<T>() != -1;
273struct VtIsKnownValueType_Workaround
275 static const bool value = VtIsKnownValueType<T>();
281#define VT_SPECIALIZE_IS_VALUE_PROXY(unused, elem) \
283 VtIsValueProxy< VT_TYPE(elem) > : std::false_type {}; \
285 VtIsTypedValueProxy< VT_TYPE(elem) > : std::false_type {}; \
287 VtIsErasedValueProxy< VT_TYPE(elem) > : std::false_type {};
288TF_PP_SEQ_FOR_EACH(VT_SPECIALIZE_IS_VALUE_PROXY, ~, VT_VALUE_TYPES)
289#undef VT_SPECIALIZE_IS_VALUE_PROXY
301 unsigned int GetRank()
const {
303 otherDims[0] == 0 ? 1 :
304 otherDims[1] == 0 ? 2 :
305 otherDims[2] == 0 ? 3 : 4;
307 bool operator==(Vt_ShapeData
const &other)
const {
308 if (totalSize != other.totalSize)
310 unsigned int thisRank = GetRank(), otherRank = other.GetRank();
311 if (thisRank != otherRank)
313 return std::equal(otherDims, otherDims + GetRank() - 1,
316 bool operator!=(Vt_ShapeData
const &other)
const {
317 return !(*
this == other);
320 memset(
this, 0,
sizeof(*
this));
322 static const int NumOtherDims = 3;
324 unsigned int otherDims[NumOtherDims];
327PXR_NAMESPACE_CLOSE_SCOPE
constexpr int VtGetKnownValueTypeIndex()
Provide compile-time value type indexes for types that are "known" to Vt – specifically,...
constexpr bool VtIsKnownValueType()
Returns true if T is a type that appears in VT_VALUE_TYPES.
Token for efficient comparison, assignment, and hashing of known strings.
Represents an arbitrary dimensional rectangular container class.
This header serves to simply bring in the half float datatype and provide a hash_value function.
TfToken class for efficient string referencing and hashing, plus conversions to and from stl string c...