7#ifndef PXR_BASE_VT_TYPES_H
8#define PXR_BASE_VT_TYPES_H
14#include "pxr/base/vt/api.h"
20#include "pxr/base/tf/meta.h"
21#include "pxr/base/tf/preprocessorUtilsLite.h"
28PXR_NAMESPACE_OPEN_SCOPE
32VT_TYPE_IS_CHEAP_TO_COPY(
TfToken);
39#define VT_FLOATING_POINT_BUILTIN_VALUE_TYPES \
44#define VT_TIMECODE_VALUE_TYPES \
45(( GfTimeCode, TimeCode ))
47#define VT_INTEGRAL_BUILTIN_VALUE_TYPES \
50(( unsigned char, UChar )) \
52(( unsigned short, UShort )) \
54(( unsigned int, UInt )) \
58#define VT_VEC_INT_VALUE_TYPES \
63#define VT_VEC_HALF_VALUE_TYPES \
68#define VT_VEC_FLOAT_VALUE_TYPES \
73#define VT_VEC_DOUBLE_VALUE_TYPES \
78#define VT_VEC_VALUE_TYPES \
79 VT_VEC_INT_VALUE_TYPES \
80 VT_VEC_HALF_VALUE_TYPES \
81 VT_VEC_FLOAT_VALUE_TYPES \
82 VT_VEC_DOUBLE_VALUE_TYPES
84#define VT_MATRIX_FLOAT_VALUE_TYPES \
85(( GfMatrix4f, Matrix4f )) \
86(( GfMatrix3f, Matrix3f )) \
87(( GfMatrix2f, Matrix2f )) \
89#define VT_MATRIX_DOUBLE_VALUE_TYPES \
90(( GfMatrix4d, Matrix4d )) \
91(( GfMatrix3d, Matrix3d )) \
92(( GfMatrix2d, Matrix2d ))
94#define VT_MATRIX_VALUE_TYPES \
95 VT_MATRIX_FLOAT_VALUE_TYPES \
96 VT_MATRIX_DOUBLE_VALUE_TYPES \
98#define VT_GFRANGE_VALUE_TYPES \
99(( GfRange3f, Range3f )) \
100(( GfRange3d, Range3d )) \
101(( GfRange2f, Range2f )) \
102(( GfRange2d, Range2d )) \
103(( GfRange1f, Range1f )) \
104(( GfRange1d, Range1d ))
106#define VT_RANGE_VALUE_TYPES \
107 VT_GFRANGE_VALUE_TYPES \
108(( GfInterval, Interval )) \
109(( GfRect2i, Rect2i ))
111#define VT_STRING_VALUE_TYPES \
112(( std::string, String )) \
115#define VT_QUATERNION_VALUE_TYPES \
116(( GfQuath, Quath )) \
117(( GfQuatf, Quatf )) \
118(( GfQuatd, Quatd )) \
119(( GfQuaternion, Quaternion ))
121#define VT_DUALQUATERNION_VALUE_TYPES \
122(( GfDualQuath, DualQuath )) \
123(( GfDualQuatf, DualQuatf )) \
124(( GfDualQuatd, DualQuatd ))
126#define VT_NONARRAY_VALUE_TYPES \
127(( GfFrustum, Frustum)) \
128(( GfMultiInterval, MultiInterval))
131#define VT_TYPE(elem) \
132TF_PP_TUPLE_ELEM(0, elem)
133#define VT_TYPE_NAME(elem) \
134TF_PP_TUPLE_ELEM(1, elem)
138#define VT_BUILTIN_NUMERIC_VALUE_TYPES \
139VT_INTEGRAL_BUILTIN_VALUE_TYPES VT_FLOATING_POINT_BUILTIN_VALUE_TYPES \
140VT_TIMECODE_VALUE_TYPES
142#define VT_BUILTIN_VALUE_TYPES \
143VT_BUILTIN_NUMERIC_VALUE_TYPES VT_STRING_VALUE_TYPES
145#define VT_SCALAR_CLASS_VALUE_TYPES \
147VT_MATRIX_VALUE_TYPES \
148VT_RANGE_VALUE_TYPES \
149VT_QUATERNION_VALUE_TYPES \
150VT_DUALQUATERNION_VALUE_TYPES
152#define VT_SCALAR_VALUE_TYPES \
153VT_BUILTIN_VALUE_TYPES VT_SCALAR_CLASS_VALUE_TYPES
160template<
typename T>
class VtArray;
161#define VT_ARRAY_ALIAS(unused, elem) \
163 Vt, TF_PP_CAT(VT_TYPE_NAME(elem), Array)) = VtArray< VT_TYPE(elem) >;
164TF_PP_SEQ_FOR_EACH(VT_ARRAY_ALIAS, ~, VT_SCALAR_VALUE_TYPES)
172#define VT_ARRAY_EDIT_ALIAS(unused, elem) \
173using TF_PP_CAT(Vt, TF_PP_CAT(VT_TYPE_NAME(elem), ArrayEdit)) \
174 = VtArrayEdit< VT_TYPE(elem) >;
175TF_PP_SEQ_FOR_EACH(VT_ARRAY_EDIT_ALIAS, ~, VT_SCALAR_VALUE_TYPES)
183#define VT_ARRAY_EDIT_BUILDER_ALIAS(unused, elem) \
184using TF_PP_CAT(Vt, TF_PP_CAT(VT_TYPE_NAME(elem), ArrayEditBuilder)) \
185 = VtArrayEditBuilder< VT_TYPE(elem) >;
186TF_PP_SEQ_FOR_EACH(VT_ARRAY_EDIT_BUILDER_ALIAS, ~, VT_SCALAR_VALUE_TYPES)
190#define VT_ARRAY_TYPE_TUPLE(unused, elem) \
191(( TF_PP_CAT(Vt, TF_PP_CAT(VT_TYPE_NAME(elem), Array)) , \
192 TF_PP_CAT(VT_TYPE_NAME(elem), Array) ))
193#define VT_ARRAY_VALUE_TYPES \
194TF_PP_SEQ_FOR_EACH(VT_ARRAY_TYPE_TUPLE, ~, VT_SCALAR_VALUE_TYPES)
198#define VT_ARRAY_EDIT_TYPE_TUPLE(unused, elem) \
199(( TF_PP_CAT(Vt, TF_PP_CAT(VT_TYPE_NAME(elem), ArrayEdit)) , \
200 TF_PP_CAT(VT_TYPE_NAME(elem), ArrayEdit) ))
201#define VT_ARRAY_EDIT_VALUE_TYPES \
202TF_PP_SEQ_FOR_EACH(VT_ARRAY_EDIT_TYPE_TUPLE, ~, VT_SCALAR_VALUE_TYPES)
206#define VT_VALUE_TYPES_1 \
207 VT_BUILTIN_VALUE_TYPES VT_SCALAR_CLASS_VALUE_TYPES
208#define VT_VALUE_TYPES_2 \
209 VT_ARRAY_VALUE_TYPES VT_ARRAY_EDIT_VALUE_TYPES VT_NONARRAY_VALUE_TYPES
215#define VT_FOR_EACH_VALUE_TYPE(_macro) \
216 TF_PP_SEQ_FOR_EACH(_macro, ~, VT_VALUE_TYPES_1) \
217 TF_PP_SEQ_FOR_EACH(_macro, ~, VT_VALUE_TYPES_2)
222#define VT_COMMA_TYPE(unused, elem) , VT_TYPE(elem)
223using Vt_ValueTypeList =
224 TfMetaApply<TfMetaTail, TfMetaList<
225 void VT_FOR_EACH_VALUE_TYPE(VT_COMMA_TYPE)>>;
228namespace Vt_KnownValueTypeDetail
235GetIndexImpl(TfMetaList<>) {
239template <
typename T,
typename Typelist>
241GetIndexImpl(Typelist) {
242 if (std::is_same_v<T, TfMetaApply<TfMetaHead, Typelist>>) {
245 else if (
const int indexOfTail =
246 GetIndexImpl<T>(TfMetaApply<TfMetaTail, Typelist>{});
248 return 1 + indexOfTail;
258 return GetIndexImpl<T>(Vt_ValueTypeList{});
265VtGetNumKnownValueTypes() {
266 return TfMetaApply<TfMetaLength, Vt_ValueTypeList>::value;
286 constexpr int index = Vt_KnownValueTypeDetail::GetIndex<T>();
287 static_assert(index != -1,
"T is not one of the known VT_VALUE_TYPES.");
296 return Vt_KnownValueTypeDetail::GetIndex<T>() != -1;
303struct VtIsKnownValueType_Workaround
318Vt_IsTypeAllowedToRegisterTransforms()
321 || std::is_same_v<T, GfTimeCode>
329#define VT_SPECIALIZE_IS_VALUE_PROXY(unused, elem) \
331 VtIsValueProxy< VT_TYPE(elem) > : std::false_type {}; \
333 VtIsTypedValueProxy< VT_TYPE(elem) > : std::false_type {}; \
335 VtIsErasedValueProxy< VT_TYPE(elem) > : std::false_type {};
336VT_FOR_EACH_VALUE_TYPE(VT_SPECIALIZE_IS_VALUE_PROXY)
337#undef VT_SPECIALIZE_IS_VALUE_PROXY
349 unsigned int GetRank()
const {
351 otherDims[0] == 0 ? 1 :
352 otherDims[1] == 0 ? 2 :
353 otherDims[2] == 0 ? 3 : 4;
355 bool operator==(Vt_ShapeData
const &other)
const {
356 if (totalSize != other.totalSize)
358 unsigned int thisRank = GetRank(), otherRank = other.GetRank();
359 if (thisRank != otherRank)
361 return std::equal(otherDims, otherDims + GetRank() - 1,
364 bool operator!=(Vt_ShapeData
const &other)
const {
365 return !(*
this == other);
368 memset(
this, 0,
sizeof(*
this));
370 static const int NumOtherDims = 3;
372 unsigned int otherDims[NumOtherDims];
375PXR_NAMESPACE_CLOSE_SCOPE
#define VT_VALUE_TYPE_CAN_TRANSFORM(T)
A helper for specializing the above trait.
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.
Value type that represents a time code.
Token for efficient comparison, assignment, and hashing of known strings.
A builder type that produces instances of VtArrayEdit representing sequences of array edit operations...
An array edit represents a sequence of per-element modifications to a VtArray.
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...