24 #ifndef PXR_BASE_VT_TYPES_H 25 #define PXR_BASE_VT_TYPES_H 31 #include "pxr/base/vt/api.h" 38 #include <boost/preprocessor/cat.hpp> 39 #include <boost/preprocessor/seq/for_each.hpp> 40 #include <boost/preprocessor/seq/for_each_i.hpp> 41 #include <boost/preprocessor/tuple/elem.hpp> 47 PXR_NAMESPACE_OPEN_SCOPE
51 VT_TYPE_IS_CHEAP_TO_COPY(
TfToken);
55 #define VT_FLOATING_POINT_BUILTIN_VALUE_TYPES \ 56 (( double, Double )) \ 60 #define VT_INTEGRAL_BUILTIN_VALUE_TYPES \ 63 (( unsigned char, UChar )) \ 65 (( unsigned short, UShort )) \ 67 (( unsigned int, UInt )) \ 68 (( int64_t, Int64 )) \ 69 (( uint64_t, UInt64 )) 71 #define VT_VEC_INT_VALUE_TYPES \ 72 (( GfVec4i, Vec4i )) \ 73 (( GfVec3i, Vec3i )) \ 76 #define VT_VEC_HALF_VALUE_TYPES \ 77 (( GfVec4h, Vec4h )) \ 78 (( GfVec3h, Vec3h )) \ 81 #define VT_VEC_FLOAT_VALUE_TYPES \ 82 (( GfVec4f, Vec4f )) \ 83 (( GfVec3f, Vec3f )) \ 86 #define VT_VEC_DOUBLE_VALUE_TYPES \ 87 (( GfVec4d, Vec4d )) \ 88 (( GfVec3d, Vec3d )) \ 91 #define VT_VEC_VALUE_TYPES \ 92 VT_VEC_INT_VALUE_TYPES \ 93 VT_VEC_HALF_VALUE_TYPES \ 94 VT_VEC_FLOAT_VALUE_TYPES \ 95 VT_VEC_DOUBLE_VALUE_TYPES 97 #define VT_MATRIX_FLOAT_VALUE_TYPES \ 98 (( GfMatrix4f, Matrix4f )) \ 99 (( GfMatrix3f, Matrix3f )) \ 100 (( GfMatrix2f, Matrix2f )) \ 102 #define VT_MATRIX_DOUBLE_VALUE_TYPES \ 103 (( GfMatrix4d, Matrix4d )) \ 104 (( GfMatrix3d, Matrix3d )) \ 105 (( GfMatrix2d, Matrix2d )) 107 #define VT_MATRIX_VALUE_TYPES \ 108 VT_MATRIX_FLOAT_VALUE_TYPES \ 109 VT_MATRIX_DOUBLE_VALUE_TYPES \ 111 #define VT_GFRANGE_VALUE_TYPES \ 112 (( GfRange3f, Range3f )) \ 113 (( GfRange3d, Range3d )) \ 114 (( GfRange2f, Range2f )) \ 115 (( GfRange2d, Range2d )) \ 116 (( GfRange1f, Range1f )) \ 117 (( GfRange1d, Range1d )) 119 #define VT_RANGE_VALUE_TYPES \ 120 VT_GFRANGE_VALUE_TYPES \ 121 (( GfInterval, Interval )) \ 122 (( GfRect2i, Rect2i )) 124 #define VT_STRING_VALUE_TYPES \ 125 (( std::string, String )) \ 128 #define VT_QUATERNION_VALUE_TYPES \ 129 (( GfQuath, Quath )) \ 130 (( GfQuatf, Quatf )) \ 131 (( GfQuatd, Quatd )) \ 132 (( GfQuaternion, Quaternion )) 134 #define VT_DUALQUATERNION_VALUE_TYPES \ 135 (( GfDualQuath, DualQuath )) \ 136 (( GfDualQuatf, DualQuatf )) \ 137 (( GfDualQuatd, DualQuatd )) 139 #define VT_NONARRAY_VALUE_TYPES \ 140 (( GfFrustum, Frustum)) \ 141 (( GfMultiInterval, MultiInterval)) 144 #define VT_TYPE(elem) \ 145 BOOST_PP_TUPLE_ELEM(2, 0, elem) 146 #define VT_TYPE_NAME(elem) \ 147 BOOST_PP_TUPLE_ELEM(2, 1, elem) 151 #define VT_BUILTIN_NUMERIC_VALUE_TYPES \ 152 VT_INTEGRAL_BUILTIN_VALUE_TYPES VT_FLOATING_POINT_BUILTIN_VALUE_TYPES 154 #define VT_BUILTIN_VALUE_TYPES \ 155 VT_BUILTIN_NUMERIC_VALUE_TYPES VT_STRING_VALUE_TYPES 157 #define VT_SCALAR_CLASS_VALUE_TYPES \ 159 VT_MATRIX_VALUE_TYPES \ 160 VT_RANGE_VALUE_TYPES \ 161 VT_QUATERNION_VALUE_TYPES \ 162 VT_DUALQUATERNION_VALUE_TYPES 164 #define VT_SCALAR_VALUE_TYPES \ 165 VT_SCALAR_CLASS_VALUE_TYPES VT_BUILTIN_VALUE_TYPES 173 template<
typename T>
class VtArray;
174 #define VT_ARRAY_TYPEDEF(r, unused, elem) \ 175 typedef VtArray< VT_TYPE(elem) > \ 176 BOOST_PP_CAT(Vt, BOOST_PP_CAT(VT_TYPE_NAME(elem), Array)) ; 177 BOOST_PP_SEQ_FOR_EACH(VT_ARRAY_TYPEDEF, ~, VT_SCALAR_VALUE_TYPES)
181 #define VT_ARRAY_TYPE_TUPLE(r, unused, elem) \ 182 (( BOOST_PP_CAT(Vt, BOOST_PP_CAT(VT_TYPE_NAME(elem), Array)) , \ 183 BOOST_PP_CAT(VT_TYPE_NAME(elem), Array) )) 184 #define VT_ARRAY_VALUE_TYPES \ 185 BOOST_PP_SEQ_FOR_EACH(VT_ARRAY_TYPE_TUPLE, ~, VT_SCALAR_VALUE_TYPES) 187 #define VT_CLASS_VALUE_TYPES \ 188 VT_ARRAY_VALUE_TYPES VT_SCALAR_CLASS_VALUE_TYPES VT_NONARRAY_VALUE_TYPES 190 #define VT_VALUE_TYPES \ 191 VT_BUILTIN_VALUE_TYPES VT_CLASS_VALUE_TYPES 193 namespace Vt_KnownValueTypeDetail
206 #define VT_SET_VALUE_TYPE_INDEX(r, unused, i, elem) \ 207 template <> constexpr int \ 208 GetIndex< VT_TYPE(elem) >() { \ 211 BOOST_PP_SEQ_FOR_EACH_I(VT_SET_VALUE_TYPE_INDEX, ~, VT_VALUE_TYPES)
212 #undef VT_SET_VALUE_TYPE_INDEX 218 VtGetNumKnownValueTypes() {
219 return BOOST_PP_SEQ_SIZE(VT_VALUE_TYPES);
238 constexpr
int index = Vt_KnownValueTypeDetail::GetIndex<T>();
239 static_assert(index != -1,
"T is not one of the known VT_VALUE_TYPES.");
248 return Vt_KnownValueTypeDetail::GetIndex<T>() != -1;
255 struct VtIsKnownValueType_Workaround
257 static const bool value = VtIsKnownValueType<T>();
263 #define VT_SPECIALIZE_IS_VALUE_PROXY(r, unused, elem) \ 265 VtIsValueProxy< VT_TYPE(elem) > : std::false_type {}; \ 267 VtIsTypedValueProxy< VT_TYPE(elem) > : std::false_type {}; \ 269 VtIsErasedValueProxy< VT_TYPE(elem) > : std::false_type {}; 270 BOOST_PP_SEQ_FOR_EACH(VT_SPECIALIZE_IS_VALUE_PROXY, ~, VT_VALUE_TYPES)
271 #undef VT_SPECIALIZE_IS_VALUE_PROXY 282 struct Vt_ShapeData {
283 unsigned int GetRank()
const {
285 otherDims[0] == 0 ? 1 :
286 otherDims[1] == 0 ? 2 :
287 otherDims[2] == 0 ? 3 : 4;
289 bool operator==(Vt_ShapeData
const &other)
const {
290 if (totalSize != other.totalSize)
292 unsigned int thisRank = GetRank(), otherRank = other.GetRank();
293 if (thisRank != otherRank)
295 return std::equal(otherDims, otherDims + GetRank() - 1,
298 bool operator!=(Vt_ShapeData
const &other)
const {
299 return !(*
this == other);
302 memset(
this, 0,
sizeof(*
this));
304 static const int NumOtherDims = 3;
306 unsigned int otherDims[NumOtherDims];
309 PXR_NAMESPACE_CLOSE_SCOPE
311 #endif // PXR_BASE_VT_TYPES_H This header serves to simply bring in the half float datatype and provide a hash_value function.
Token for efficient comparison, assignment, and hashing of known strings.
constexpr int VtGetKnownValueTypeIndex()
Provide compile-time value type indexes for types that are "known" to Vt – specifically,...
Represents an arbitrary dimensional rectangular container class.
constexpr bool VtIsKnownValueType()
Returns true if T is a type that appears in VT_VALUE_TYPES.
VT_API bool operator==(VtDictionary const &, VtDictionary const &)
Equality comparison.
TfToken class for efficient string referencing and hashing, plus conversions to and from stl string c...