ML Reference
MeVis/Foundation/Sources/ML/include/mlTypeTraits.h
Go to the documentation of this file.
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