ML Reference
|
00001 // **InsertLicense** code 00002 //-------------------------------------------------------------------------------- 00007 //-------------------------------------------------------------------------------- 00008 00009 #ifndef __mlTypeTraits_H 00010 #define __mlTypeTraits_H 00011 00012 #ifndef __mlInitSystemML_H 00013 #include "mlInitSystemML.h" 00014 #endif 00015 00016 #ifndef __mlRangeCasts_H 00017 // we need the _ml_numeric_limits templates from this file 00018 #include "mlRangeCasts.h" 00019 #endif 00020 00021 // needed to define type traits for complex types: 00022 #include "mlSystemWarningsDisable.h" 00023 #include <complex> 00024 #include "mlSystemWarningsRestore.h" 00025 00026 ML_START_NAMESPACE 00027 00030 00047 template <typename T> 00048 struct TypeTraits 00049 { 00050 typedef void ComponentType; 00051 typedef void IntermediateType; 00052 00053 enum { 00054 dataType = ML_INVALID_DATA_TYPE, 00055 isBuiltInFloatType = false, 00056 isBuiltInIntegerType= false, 00057 isBuiltInSignedType = false, 00058 isScalarType = false, 00059 isStandardType = false, 00060 is8BitInteger = false, 00061 is16BitInteger = false, 00062 is32BitInteger = false, 00063 is64BitInteger = false, 00064 is8_16_32BitInteger = false, 00065 isUnknown = true 00066 }; 00067 00071 static inline bool matches(MLDataType) { return true; } 00073 static inline MLDataType getDataType() { return dataType; } 00074 }; 00075 00079 template <int dataTypeId> struct DataTypeSelector {}; 00080 00081 // Flags for TypeTraits (anonymous, shall only be used for TypeTrait setup. 00082 enum { 00083 ML_INTEGER_TYPE = 0x01, // Flag that is used internally for TypeTraits 00084 ML_FLOAT_TYPE = 0x02, // Flag that is used internally for TypeTraits 00085 ML_SIGNED_TYPE = 0x04 // Flag that is used internally for TypeTraits 00086 }; 00087 00088 #define _ML_DECLARE_SCALAR_TYPETRAIT_BODY(TYPE, FLAGS) \ 00089 template <> struct DataTypeSelector<TYPE##Type> { typedef TYPE Type; }; \ 00090 template <> struct TypeTraits<TYPE > { \ 00091 typedef TYPE ComponentType; \ 00092 typedef double IntermediateType; \ 00093 enum { \ 00094 dataType = TYPE##Type, \ 00095 isBuiltInFloatType = (((FLAGS) & ML_FLOAT_TYPE) != 0), \ 00096 isBuiltInIntegerType = (((FLAGS) & ML_INTEGER_TYPE) != 0), \ 00097 isScalarType = (((FLAGS) & (ML_INTEGER_TYPE | ML_FLOAT_TYPE)) != 0), \ 00098 isStandardType = isScalarType, \ 00099 isBuiltInSignedType = (((FLAGS) & ML_SIGNED_TYPE) != 0), \ 00100 is8BitInteger = ((((FLAGS) & ML_INTEGER_TYPE) != 0) && (sizeof(TYPE)==sizeof(MLuint8)) ), \ 00101 is16BitInteger = ((((FLAGS) & ML_INTEGER_TYPE) != 0) && (sizeof(TYPE)==sizeof(MLuint16)) ), \ 00102 is32BitInteger = ((((FLAGS) & ML_INTEGER_TYPE) != 0) && (sizeof(TYPE)==sizeof(MLuint32)) ), \ 00103 is64BitInteger = ((((FLAGS) & ML_INTEGER_TYPE) != 0) && (sizeof(TYPE)==sizeof(MLuint64)) ), \ 00104 is8_16_32BitInteger = ((((FLAGS) & ML_INTEGER_TYPE) != 0) && \ 00105 ((sizeof(TYPE)==sizeof(MLuint8)) || \ 00106 (sizeof(TYPE)==sizeof(MLuint16)) || \ 00107 (sizeof(TYPE)==sizeof(MLuint32)))), \ 00108 isUnknown = false \ 00109 }; \ 00110 \ 00111 static inline bool matches(MLDataType dt) { return dt == dataType; } \ 00112 static inline MLDataType getDataType() { return dataType; } \ 00113 }; 00114 00116 #define ML_DECLARE_SCALAR_TYPETRAIT(TYPE, FLAGS) \ 00117 _ML_DECLARE_SCALAR_TYPETRAIT_BODY(TYPE, FLAGS) 00118 00119 #define _ML_DECLARE_EXTENDED_TYPETRAIT_BODY(TYPE, TYPE_ID, COMPONENT_TYPE) \ 00120 template <> struct DataTypeSelector<TYPE_ID> { typedef TYPE Type; }; \ 00121 template <> struct TypeTraits<TYPE > { \ 00122 typedef COMPONENT_TYPE ComponentType; \ 00123 typedef TYPE IntermediateType; \ 00124 enum { \ 00125 dataType = TYPE_ID, \ 00126 isBuiltInFloatType = false, \ 00127 isBuiltInIntegerType = false, \ 00128 isScalarType = false, \ 00129 isStandardType = false, \ 00130 isBuiltInSignedType = false, \ 00131 is8BitInteger = false, \ 00132 is16BitInteger = false, \ 00133 is32BitInteger = false, \ 00134 is64BitInteger = false, \ 00135 is8_16_32BitInteger = false, \ 00136 isUnknown = false \ 00137 }; \ 00138 \ 00139 static inline bool matches(MLDataType dt) { return dt == dataType; } \ 00140 static inline MLDataType getDataType() { return dataType; } \ 00141 }; 00142 00144 #define ML_DECLARE_EXTENDED_TYPETRAIT(TYPE, TYPE_ID, COMPONENT_TYPE) \ 00145 _ML_DECLARE_EXTENDED_TYPETRAIT_BODY(TYPE, TYPE_ID, COMPONENT_TYPE) 00146 00148 ML_DECLARE_SCALAR_TYPETRAIT(MLuint8 , ML_INTEGER_TYPE) 00149 ML_DECLARE_SCALAR_TYPETRAIT(MLint8 , ML_INTEGER_TYPE | ML_SIGNED_TYPE) 00150 ML_DECLARE_SCALAR_TYPETRAIT(MLuint16, ML_INTEGER_TYPE) 00151 ML_DECLARE_SCALAR_TYPETRAIT(MLint16 , ML_INTEGER_TYPE | ML_SIGNED_TYPE) 00152 ML_DECLARE_SCALAR_TYPETRAIT(MLuint32, ML_INTEGER_TYPE) 00153 ML_DECLARE_SCALAR_TYPETRAIT(MLint32 , ML_INTEGER_TYPE | ML_SIGNED_TYPE) 00154 ML_DECLARE_SCALAR_TYPETRAIT(MLuint64, ML_INTEGER_TYPE) 00155 ML_DECLARE_SCALAR_TYPETRAIT(MLint64 , ML_INTEGER_TYPE | ML_SIGNED_TYPE) 00156 00158 ML_DECLARE_SCALAR_TYPETRAIT(MLfloat , ML_FLOAT_TYPE | ML_SIGNED_TYPE) 00159 ML_DECLARE_SCALAR_TYPETRAIT(MLdouble , ML_FLOAT_TYPE | ML_SIGNED_TYPE) 00160 00161 #define ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(TEMPLATE_TYPE, BASE_TYPE, TYPE_ID) \ 00162 ML_DECLARE_EXTENDED_TYPETRAIT(TEMPLATE_TYPE<BASE_TYPE>, TYPE_ID, BASE_TYPE) 00163 00165 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(std::complex, MLfloat, MLComplexfType) 00166 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(std::complex, MLdouble, MLComplexdType) 00167 00169 template <typename DT> class TQuaternion; 00170 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(TQuaternion, MLfloat, MLQuaternionfType) 00171 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(TQuaternion, MLdouble, MLQuaterniondType) 00172 00173 00175 template <class DT> class Tvec2; 00176 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec2, MLfloat , MLVector2fType) 00177 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec2, MLdouble, MLVector2dType) 00178 00179 template <class DT> class Tvec3; 00180 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec3, MLfloat , MLVector3fType) 00181 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec3, MLdouble, MLVector3dType) 00182 00183 template <class DT> class Tvec4; 00184 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec4, MLfloat , MLVector4fType) 00185 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec4, MLdouble, MLVector4dType) 00186 00187 template <class DT> class Tvec5; 00188 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec5, MLfloat , MLVector5fType) 00189 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec5, MLdouble, MLVector5dType) 00190 00191 template <class DT> class Tvec6; 00192 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec6, MLfloat , MLVector6fType) 00193 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec6, MLdouble, MLVector6dType) 00194 00195 template <class DT> class Tvec7; 00196 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec7, MLfloat , MLVector7fType) 00197 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec7, MLdouble, MLVector7dType) 00198 00199 template <class DT> class Tvec8; 00200 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec8, MLfloat , MLVector8fType) 00201 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec8, MLdouble, MLVector8dType) 00202 00203 template <class DT> class Tvec9; 00204 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec9, MLfloat , MLVector9fType) 00205 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec9, MLdouble, MLVector9dType) 00206 00207 template <class DT> class Tvec10; 00208 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec10, MLfloat , MLVector10fType) 00209 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec10, MLdouble, MLVector10dType) 00210 00211 template <class DT> class Tvec16; 00212 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec16, MLfloat , MLVector16fType) 00213 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec16, MLdouble, MLVector16dType) 00214 00215 template <class DT> class Tvec32; 00216 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec32, MLfloat , MLVector32fType) 00217 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec32, MLdouble, MLVector32dType) 00218 00219 template <class DT> class Tvec64; 00220 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec64, MLfloat , MLVector64fType) 00221 ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(Tvec64, MLdouble, MLVector64dType) 00222 00223 #undef ML_DECLARE_FLOAT_VECTOR_TYPETRAIT 00224 00225 00226 #define ML_DECLARE_MATRIX_TYPETRAIT(TEMPLATE_TYPE, BASE_TYPE, TYPE_ID) \ 00227 ML_DECLARE_EXTENDED_TYPETRAIT(TEMPLATE_TYPE<BASE_TYPE>, TYPE_ID, BASE_TYPE) 00228 00230 template <class DT> class Tmat2; 00231 ML_DECLARE_MATRIX_TYPETRAIT(Tmat2, MLfloat , MLMatrix2fType) 00232 ML_DECLARE_MATRIX_TYPETRAIT(Tmat2, MLdouble, MLMatrix2dType) 00233 00234 template <class DT> class Tmat3; 00235 ML_DECLARE_MATRIX_TYPETRAIT(Tmat3, MLfloat , MLMatrix3fType) 00236 ML_DECLARE_MATRIX_TYPETRAIT(Tmat3, MLdouble, MLMatrix3dType) 00237 00238 template <class DT> class Tmat4; 00239 ML_DECLARE_MATRIX_TYPETRAIT(Tmat4, MLfloat , MLMatrix4fType) 00240 ML_DECLARE_MATRIX_TYPETRAIT(Tmat4, MLdouble, MLMatrix4dType) 00241 00242 template <class DT> class Tmat5; 00243 ML_DECLARE_MATRIX_TYPETRAIT(Tmat5, MLfloat , MLMatrix5fType) 00244 ML_DECLARE_MATRIX_TYPETRAIT(Tmat5, MLdouble, MLMatrix5dType) 00245 00246 template <class DT> class Tmat6; 00247 ML_DECLARE_MATRIX_TYPETRAIT(Tmat6, MLfloat , MLMatrix6fType) 00248 ML_DECLARE_MATRIX_TYPETRAIT(Tmat6, MLdouble, MLMatrix6dType) 00249 00250 #undef ML_DECLARE_MATRIX_TYPETRAIT 00251 00252 00254 template <typename CompIntType, int NumDim> class TVectorNDBase; 00255 00256 #define INT_VECTOR_EXPANDER(BASE_TYPE, DIM_NUM) TVectorNDBase<BASE_TYPE, DIM_NUM> 00257 00258 #define ML_DECLARE_INT_VECTOR_TYPETRAIT(BASE_TYPE, DIM_NUM, TYPE_ID) \ 00259 _ML_DECLARE_EXTENDED_TYPETRAIT_BODY(INT_VECTOR_EXPANDER(BASE_TYPE, DIM_NUM), TYPE_ID, BASE_TYPE) 00260 00261 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint8 , 2, MLVector2i8Type ) 00262 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint16, 2, MLVector2i16Type) 00263 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint32, 2, MLVector2i32Type) 00264 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint64, 2, MLVector2i64Type) 00265 00266 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint8 , 3, MLVector3i8Type ) 00267 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint16, 3, MLVector3i16Type) 00268 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint32, 3, MLVector3i32Type) 00269 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint64, 3, MLVector3i64Type) 00270 00271 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint8 , 4, MLVector4i8Type ) 00272 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint16, 4, MLVector4i16Type) 00273 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint32, 4, MLVector4i32Type) 00274 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint64, 4, MLVector4i64Type) 00275 00276 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint8 , 5, MLVector5i8Type ) 00277 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint16, 5, MLVector5i16Type) 00278 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint32, 5, MLVector5i32Type) 00279 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint64, 5, MLVector5i64Type) 00280 00281 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint8 , 6, MLVector6i8Type ) 00282 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint16, 6, MLVector6i16Type) 00283 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint32, 6, MLVector6i32Type) 00284 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint64, 6, MLVector6i64Type) 00285 00286 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint8 , 7, MLVector7i8Type ) 00287 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint16, 7, MLVector7i16Type) 00288 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint32, 7, MLVector7i32Type) 00289 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint64, 7, MLVector7i64Type) 00290 00291 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint8 , 8, MLVector8i8Type ) 00292 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint16, 8, MLVector8i16Type) 00293 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint32, 8, MLVector8i32Type) 00294 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint64, 8, MLVector8i64Type) 00295 00296 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint8 , 9, MLVector9i8Type ) 00297 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint16, 9, MLVector9i16Type) 00298 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint32, 9, MLVector9i32Type) 00299 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint64, 9, MLVector9i64Type) 00300 00301 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint8 , 10, MLVector10i8Type ) 00302 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint16, 10, MLVector10i16Type) 00303 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint32, 10, MLVector10i32Type) 00304 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint64, 10, MLVector10i64Type) 00305 00306 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint8 , 16, MLVector16i8Type ) 00307 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint16, 16, MLVector16i16Type) 00308 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint32, 16, MLVector16i32Type) 00309 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint64, 16, MLVector16i64Type) 00310 00311 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint8 , 32, MLVector32i8Type ) 00312 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint16, 32, MLVector32i16Type) 00313 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint32, 32, MLVector32i32Type) 00314 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint64, 32, MLVector32i64Type) 00315 00316 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint8 , 64, MLVector64i8Type ) 00317 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint16, 64, MLVector64i16Type) 00318 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint32, 64, MLVector64i32Type) 00319 ML_DECLARE_INT_VECTOR_TYPETRAIT(MLint64, 64, MLVector64i64Type) 00320 00321 #undef ML_DECLARE_INT_VECTOR_TYPETRAIT 00322 #undef INT_VECTOR_EXPANDER 00323 00324 ML_END_NAMESPACE 00325 00326 00327 namespace OverloadSelector { 00328 00330 template<bool b> struct SwitchType {}; 00331 typedef SwitchType<true> OnTrue; 00332 typedef SwitchType<false> OnFalse; 00333 00338 template<typename T> 00339 SwitchType<ML_NAMESPACE::TypeTraits<T>::isStandardType> isScalarType() { 00340 return SwitchType<ML_NAMESPACE::TypeTraits<T>::isStandardType>(); 00341 } 00342 00343 template<typename T> 00344 SwitchType<ML_NAMESPACE::TypeTraits<T>::isBuiltInIntegerType> isBuiltInIntegerType() { 00345 return SwitchType<ML_NAMESPACE::TypeTraits<T>::isBuiltInIntegerType>(); 00346 } 00347 00348 }; 00349 00351 template<typename T> 00352 inline typename ML_NAMESPACE::TypeTraits<T>::ComponentType ml_component_cast(double v) 00353 { 00354 return static_cast<typename ML_NAMESPACE::TypeTraits<T>::ComponentType>(v); 00355 } 00356 00361 template<typename T> 00362 inline typename ML_NAMESPACE::TypeTraits<typename ML_NAMESPACE::TypeTraits<T>::IntermediateType>::ComponentType 00363 ml_scalar_factor_cast(double v) 00364 { 00365 return ml_component_cast<typename ML_NAMESPACE::TypeTraits<T>::IntermediateType>(v); 00366 } 00367 00369 template<typename T> 00370 inline typename ML_NAMESPACE::TypeTraits<typename ML_NAMESPACE::TypeTraits<T>::IntermediateType>::ComponentType 00371 ml_scalar_factor_cast(double v, const T& dummy) 00372 { 00373 return ml_component_cast<typename ML_NAMESPACE::TypeTraits<T>::IntermediateType>(v); 00374 } 00375 00377 template<typename T> 00378 inline T ml_cast_from_scalar(double v) 00379 { 00380 return static_cast<T>(ml_component_cast<T>(v)); 00381 } 00382 00385 template<typename T> 00386 inline typename ML_NAMESPACE::TypeTraits<T>::IntermediateType ml_cast_to_intermediate_type(const T& v) 00387 { 00388 return static_cast<typename ML_NAMESPACE::TypeTraits<T>::IntermediateType>(v); 00389 } 00390 00392 template<typename T, typename S> 00393 inline typename ML_NAMESPACE::TypeTraits<T>::IntermediateType 00394 ml_cast_to_intermediate_type_and_multiply(const T& v, S s) 00395 { 00396 return static_cast<typename ML_NAMESPACE::TypeTraits<T>::IntermediateType>(v) * 00397 ml_component_cast<typename ML_NAMESPACE::TypeTraits<T>::IntermediateType>(s); 00398 } 00399 00400 // version for built-in integer types, does clamping and rounding 00401 template<typename T> 00402 inline T _ml_cast_from_intermediate_type(const typename ML_NAMESPACE::TypeTraits<T>::IntermediateType& v, OverloadSelector::OnTrue) 00403 { 00404 // clamping to allowed value range: 00405 if (v < _ml_numeric_limits<T>::MinValue) { 00406 return static_cast<T>(_ml_numeric_limits<T>::MinValue); 00407 } else if (v > _ml_numeric_limits<T>::MaxValue) { 00408 return static_cast<T>(_ml_numeric_limits<T>::MaxValue); 00409 } else { 00410 // rounding to next integer: 00411 return static_cast<T>(floor(v+0.5)); 00412 } 00413 } 00414 00415 // version for all other types, does nothing 00416 template<typename T> 00417 inline T _ml_cast_from_intermediate_type(const typename ML_NAMESPACE::TypeTraits<T>::IntermediateType& v, OverloadSelector::OnFalse) 00418 { 00419 return static_cast<T>(v); 00420 } 00421 00424 template<typename T> 00425 inline T ml_cast_from_intermediate_type(const typename ML_NAMESPACE::TypeTraits<T>::IntermediateType& v) 00426 { 00427 return _ml_cast_from_intermediate_type<T>(v, OverloadSelector::isBuiltInIntegerType<T>()); 00428 } 00429 00430 // version for built-in integer types, does rounding 00431 template<typename T> 00432 inline T _ml_cast_from_intermediate_type_without_clamping(const typename ML_NAMESPACE::TypeTraits<T>::IntermediateType& v, OverloadSelector::OnTrue) 00433 { 00434 return static_cast<T>(floor(v+0.5)); 00435 } 00436 00437 // version for all other types, does nothing 00438 template<typename T> 00439 inline T _ml_cast_from_intermediate_type_without_clamping(const typename ML_NAMESPACE::TypeTraits<T>::IntermediateType& v, OverloadSelector::OnFalse) 00440 { 00441 return static_cast<T>(v); 00442 } 00443 00447 template<typename T> 00448 inline T ml_cast_from_intermediate_type_without_clamping(const typename ML_NAMESPACE::TypeTraits<T>::IntermediateType& v) 00449 { 00450 return _ml_cast_from_intermediate_type_without_clamping<T>(v, OverloadSelector::isBuiltInIntegerType<T>()); 00451 } 00452 00453 00454 #endif // of __mlTypeTraits_H 00455