13 #ifndef ML_TYPE_TRAITS_H
14 #define ML_TYPE_TRAITS_H
18 #ifndef __mlRangeCasts_H
24 #include <ThirdPartyWarningsDisable.h>
26 #include <ThirdPartyWarningsRestore.h>
58 isBuiltInFloatType =
false,
60 isBuiltInSignedType =
false,
62 is8BitInteger =
false,
63 is16BitInteger =
false,
64 is32BitInteger =
false,
65 is64BitInteger =
false,
66 is8_16_32BitInteger =
false,
90 #define _ML_DECLARE_SCALAR_TYPETRAIT_BODY(TYPE, FLAGS) \
91 template <> struct DataTypeSelector<TYPE##Type> { typedef TYPE Type; }; \
92 template <> struct TypeTraits<TYPE > { \
93 typedef TYPE ComponentType; \
94 typedef double IntermediateType; \
96 dataType = TYPE##Type, \
97 isBuiltInFloatType = (((FLAGS) & ML_FLOAT_TYPE) != 0), \
98 isBuiltInIntegerType = (((FLAGS) & ML_INTEGER_TYPE) != 0), \
99 isScalarType = (((FLAGS) & (ML_INTEGER_TYPE | ML_FLOAT_TYPE)) != 0), \
100 isStandardType = isScalarType, \
101 isBuiltInSignedType = (((FLAGS) & ML_SIGNED_TYPE) != 0), \
102 is8BitInteger = ((((FLAGS) & ML_INTEGER_TYPE) != 0) && (sizeof(TYPE)==sizeof(MLuint8)) ), \
103 is16BitInteger = ((((FLAGS) & ML_INTEGER_TYPE) != 0) && (sizeof(TYPE)==sizeof(MLuint16)) ), \
104 is32BitInteger = ((((FLAGS) & ML_INTEGER_TYPE) != 0) && (sizeof(TYPE)==sizeof(MLuint32)) ), \
105 is64BitInteger = ((((FLAGS) & ML_INTEGER_TYPE) != 0) && (sizeof(TYPE)==sizeof(MLuint64)) ), \
106 is8_16_32BitInteger = ((((FLAGS) & ML_INTEGER_TYPE) != 0) && \
107 ((sizeof(TYPE)==sizeof(MLuint8)) || \
108 (sizeof(TYPE)==sizeof(MLuint16)) || \
109 (sizeof(TYPE)==sizeof(MLuint32)))), \
113 static inline bool matches(MLDataType dt) { return dt == dataType; } \
114 static inline MLDataType getDataType() { return dataType; } \
118 #define ML_DECLARE_SCALAR_TYPETRAIT(TYPE, FLAGS) \
119 _ML_DECLARE_SCALAR_TYPETRAIT_BODY(TYPE, FLAGS)
121 #define _ML_DECLARE_EXTENDED_TYPETRAIT_BODY(TYPE, TYPE_ID, COMPONENT_TYPE) \
122 template <> struct DataTypeSelector<TYPE_ID> { typedef TYPE Type; }; \
123 template <> struct TypeTraits<TYPE > { \
124 typedef COMPONENT_TYPE ComponentType; \
125 typedef TYPE IntermediateType; \
127 dataType = TYPE_ID, \
128 isBuiltInFloatType = false, \
129 isBuiltInIntegerType = false, \
130 isScalarType = false, \
131 isStandardType = false, \
132 isBuiltInSignedType = false, \
133 is8BitInteger = false, \
134 is16BitInteger = false, \
135 is32BitInteger = false, \
136 is64BitInteger = false, \
137 is8_16_32BitInteger = false, \
141 static inline bool matches(MLDataType dt) { return dt == dataType; } \
142 static inline MLDataType getDataType() { return dataType; } \
146 #define ML_DECLARE_EXTENDED_TYPETRAIT(TYPE, TYPE_ID, COMPONENT_TYPE) \
147 _ML_DECLARE_EXTENDED_TYPETRAIT_BODY(TYPE, TYPE_ID, COMPONENT_TYPE)
163 #define ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(TEMPLATE_TYPE, BASE_TYPE, TYPE_ID) \
164 ML_DECLARE_EXTENDED_TYPETRAIT(TEMPLATE_TYPE<BASE_TYPE>, TYPE_ID, BASE_TYPE)
170 template <
typename DT>
class TQuaternion;
176 template <
class DT>
class Tvec2;
181 template <
class DT>
class Tvec3;
185 template <
class DT>
class Tvec4;
189 template <
class DT>
class Tvec5;
193 template <
class DT>
class Tvec6;
197 template <
class DT>
class Tvec7;
201 template <
class DT>
class Tvec8;
205 template <
class DT>
class Tvec9;
209 template <
class DT>
class Tvec10;
213 template <
class DT>
class Tvec16;
217 template <
class DT>
class Tvec32;
221 template <
class DT>
class Tvec64;
225 #undef ML_DECLARE_FLOAT_VECTOR_TYPETRAIT
228 #define ML_DECLARE_MATRIX_TYPETRAIT(TEMPLATE_TYPE, BASE_TYPE, TYPE_ID) \
229 ML_DECLARE_EXTENDED_TYPETRAIT(TEMPLATE_TYPE<BASE_TYPE>, TYPE_ID, BASE_TYPE)
232 template <
class DT>
class Tmat2;
236 template <
class DT>
class Tmat3;
240 template <
class DT>
class Tmat4;
244 template <
class DT>
class Tmat5;
248 template <
class DT>
class Tmat6;
252 #undef ML_DECLARE_MATRIX_TYPETRAIT
256 template <
typename CompIntType,
int NumDim>
class TVectorNDBase;
258 #define INT_VECTOR_EXPANDER(BASE_TYPE, DIM_NUM) TVectorNDBase<BASE_TYPE, DIM_NUM>
260 #define ML_DECLARE_INT_VECTOR_TYPETRAIT(BASE_TYPE, DIM_NUM, TYPE_ID) \
261 _ML_DECLARE_EXTENDED_TYPETRAIT_BODY(INT_VECTOR_EXPANDER(BASE_TYPE, DIM_NUM), TYPE_ID, BASE_TYPE)
323 #undef ML_DECLARE_INT_VECTOR_TYPETRAIT
324 #undef INT_VECTOR_EXPANDER
356 return static_cast<typename ML_NAMESPACE::TypeTraits<T>::ComponentType
>(v);
366 inline typename ML_NAMESPACE::TypeTraits<typename ML_NAMESPACE::TypeTraits<T>::IntermediateType>::ComponentType
369 return ml_component_cast<typename ML_NAMESPACE::TypeTraits<T>::IntermediateType>(v);
374 inline typename ML_NAMESPACE::TypeTraits<typename ML_NAMESPACE::TypeTraits<T>::IntermediateType>::ComponentType
377 return ml_component_cast<typename ML_NAMESPACE::TypeTraits<T>::IntermediateType>(v);
384 return static_cast<T
>(ml_component_cast<T>(v));
392 return static_cast<typename ML_NAMESPACE::TypeTraits<T>::IntermediateType
>(v);
396 template<
typename T,
typename S>
397 inline typename ML_NAMESPACE::TypeTraits<T>::IntermediateType
400 return static_cast<typename ML_NAMESPACE::TypeTraits<T>::IntermediateType
>(v) *
405 #if defined(__GNUC__) && (__GNUC__ >= 7)
406 #pragma GCC diagnostic push
407 #pragma GCC diagnostic warning "-Wfloat-conversion"
421 return static_cast<T
>(floor(v+0.5));
425 #if defined(__GNUC__) && (__GNUC__ >= 7)
426 #pragma GCC diagnostic pop
433 return static_cast<T
>(v);
441 return _ml_cast_from_intermediate_type<T>(v, OverloadSelector::isBuiltInIntegerType<T>());
448 return static_cast<T
>(floor(v+0.5));
455 return static_cast<T
>(v);
464 return _ml_cast_from_intermediate_type_without_clamping<T>(v, OverloadSelector::isBuiltInIntegerType<T>());
#define ML_INVALID_DATA_TYPE
Defines an invalid MLDataType.
MLint32 MLDataType
MLDataType.
UINT64 MLuint64
Introduce platform-independent 64-bit unsigned integer type.
INT64 MLint64
Include 64-bit integer support for Windows or Unix.
ml::TypeTraits< T >::IntermediateType ml_cast_to_intermediate_type_and_multiply(const T &v, S s)
Same as above, but will also multiply with the second argument.
#define ML_DECLARE_INT_VECTOR_TYPETRAIT(BASE_TYPE, DIM_NUM, TYPE_ID)
T ml_cast_from_intermediate_type(const typename ml::TypeTraits< T >::IntermediateType &v)
Casts from an intermediate type to the desired type; performs clamping and rounding for the built-in ...
T _ml_cast_from_intermediate_type_without_clamping(const typename ml::TypeTraits< T >::IntermediateType &v, OverloadSelector::OnTrue)
#define ML_DECLARE_SCALAR_TYPETRAIT(TYPE, FLAGS)
Macro to declare custom type traits.
#define ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(TEMPLATE_TYPE, BASE_TYPE, TYPE_ID)
Declaration of standard integer type traits.
T ml_cast_from_intermediate_type_without_clamping(const typename ml::TypeTraits< T >::IntermediateType &v)
Casts from an intermediate type to the desired type; performs rounding but no clamping for the built-...
ml::TypeTraits< T >::IntermediateType ml_cast_to_intermediate_type(const T &v)
Casts type to an intermediate type suitable for consecutive arithmetic operations; integer types will...
#define ML_DECLARE_MATRIX_TYPETRAIT(TEMPLATE_TYPE, BASE_TYPE, TYPE_ID)
T _ml_cast_from_intermediate_type(const typename ml::TypeTraits< T >::IntermediateType &v, OverloadSelector::OnTrue)
T ml_cast_from_scalar(double v)
Casts the (scalar) argument to the type of the template argument.
ml::TypeTraits< T >::ComponentType ml_component_cast(double v)
Casts the argument to the component type of the template argument.
ml::TypeTraits< typename ml::TypeTraits< T >::IntermediateType >::ComponentType ml_scalar_factor_cast(double v)
Casts the double argument to a type suitable for multiplying with the template type.
SwitchType< true > OnTrue
SwitchType< ml::TypeTraits< T >::isBuiltInIntegerType > isBuiltInIntegerType()
SwitchType< ml::TypeTraits< T >::isStandardType > isScalarType()
The purpose of this function is only to return different result types depending on whether T is a sca...
SwitchType< false > OnFalse
Helper types to switch between implementations of functions by overloading.
Defines a template to get the minimum and maximum values for each basic integer type.
Helper template so select a data type from its type ID.
TypeTraits for scalar ML datatypes.
static MLDataType getDataType()
Returns the data type.
static bool matches(MLDataType)
Returns whether the template argument matches the given data type id.