ML Reference
MeVis/Foundation/Sources/ML/include/mlTypeTraits.h File Reference
#include "mlInitSystemML.h"
#include "mlRangeCasts.h"
#include "mlSystemWarningsDisable.h"
#include <complex>
#include "mlSystemWarningsRestore.h"

Go to the source code of this file.

Classes

struct  ml::TypeTraits< T >
 TypeTraits for scalar ML Datatypes. More...
struct  ml::DataTypeSelector< dataTypeId >
 Helper template so select a data type from its type id. More...
struct  OverloadSelector::SwitchType< b >
 helper types to switch between implementations of functions by overloading More...

Namespaces

namespace  ml
 

Define the namespace name like in the ML. Default is ml.


namespace  OverloadSelector

Defines

#define _ML_DECLARE_SCALAR_TYPETRAIT_BODY(TYPE, FLAGS)
#define ML_DECLARE_SCALAR_TYPETRAIT(TYPE, FLAGS)   _ML_DECLARE_SCALAR_TYPETRAIT_BODY(TYPE, FLAGS)
 Macro to declare own type traits.
#define _ML_DECLARE_EXTENDED_TYPETRAIT_BODY(TYPE, TYPE_ID, COMPONENT_TYPE)
#define ML_DECLARE_EXTENDED_TYPETRAIT(TYPE, TYPE_ID, COMPONENT_TYPE)   _ML_DECLARE_EXTENDED_TYPETRAIT_BODY(TYPE, TYPE_ID, COMPONENT_TYPE)
 Macro to declare own type traits.
#define ML_DECLARE_FLOAT_VECTOR_TYPETRAIT(TEMPLATE_TYPE, BASE_TYPE, TYPE_ID)   ML_DECLARE_EXTENDED_TYPETRAIT(TEMPLATE_TYPE<BASE_TYPE>, TYPE_ID, BASE_TYPE)
 Declaration of standard integer type traits.
#define ML_DECLARE_MATRIX_TYPETRAIT(TEMPLATE_TYPE, BASE_TYPE, TYPE_ID)   ML_DECLARE_EXTENDED_TYPETRAIT(TEMPLATE_TYPE<BASE_TYPE>, TYPE_ID, BASE_TYPE)
#define INT_VECTOR_EXPANDER(BASE_TYPE, DIM_NUM)   TVectorNDBase<BASE_TYPE, DIM_NUM>
#define ML_DECLARE_INT_VECTOR_TYPETRAIT(BASE_TYPE, DIM_NUM, TYPE_ID)   _ML_DECLARE_EXTENDED_TYPETRAIT_BODY(INT_VECTOR_EXPANDER(BASE_TYPE, DIM_NUM), TYPE_ID, BASE_TYPE)

Typedefs

typedef SwitchType< true > OverloadSelector::OnTrue
typedef SwitchType< false > OverloadSelector::OnFalse

Enumerations

enum  { ml::ML_INTEGER_TYPE = 0x01, ml::ML_FLOAT_TYPE = 0x02, ml::ML_SIGNED_TYPE = 0x04 }

Functions

template<typename T >
SwitchType< ml::TypeTraits< T >
::isStandardType > 
OverloadSelector::isScalarType ()
 The purpose of this function only is to return different result types depending on if T is a scalar type or not.
template<typename T >
SwitchType< ml::TypeTraits< T >
::isBuiltInIntegerType > 
OverloadSelector::isBuiltInIntegerType ()
template<typename T >
ml::TypeTraits< T >::ComponentType ml_component_cast (double v)
 cast the argument to the component type of the template argument
template<typename T >
ml::TypeTraits< typename
ml::TypeTraits< T >
::IntermediateType >
::ComponentType 
ml_scalar_factor_cast (double v)
 cast the double argument to a type suitable for multiplying with the template type (this is double for all scalar types and the component type for all extended data types), e.g.
template<typename T >
ml::TypeTraits< typename
ml::TypeTraits< T >
::IntermediateType >
::ComponentType 
ml_scalar_factor_cast (double v, const T &dummy)
 same as above with dummy argument of type T (so one doesn't need to specify T explicitly)
template<typename T >
ml_cast_from_scalar (double v)
 cast the (scalar) argument to the type of the template argument
template<typename T >
ml::TypeTraits< T >
::IntermediateType 
ml_cast_to_intermediate_type (const T &v)
 cast type to an intermediate type suitable for consecutive arithmetic operations; integer types will be cast to double, all other types will be left alone
template<typename T , typename S >
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
template<typename T >
_ml_cast_from_intermediate_type (const typename ml::TypeTraits< T >::IntermediateType &v, OverloadSelector::OnTrue)
template<typename T >
ml_cast_from_intermediate_type (const typename ml::TypeTraits< T >::IntermediateType &v)
 cast from an intermediate type to the desired type; does clamping and rounding for the built-in integer types, for all other types this is a simple cast
template<typename T >
_ml_cast_from_intermediate_type_without_clamping (const typename ml::TypeTraits< T >::IntermediateType &v, OverloadSelector::OnTrue)
template<typename T >
ml_cast_from_intermediate_type_without_clamping (const typename ml::TypeTraits< T >::IntermediateType &v)
 cast from an intermediate type to the desired type; does rounding but no clamping for the built-in integer types, for all other types this is a simple cast (use this if you know that the value will always be in the data type's range)

Detailed Description

Author:
Florian Link
Date:
09/2009

Definition in file mlTypeTraits.h.


Define Documentation

#define _ML_DECLARE_EXTENDED_TYPETRAIT_BODY (   TYPE,
  TYPE_ID,
  COMPONENT_TYPE 
)
Value:
template <> struct DataTypeSelector<TYPE_ID>   { typedef TYPE Type; }; \
  template <> struct TypeTraits<TYPE >  {                                    \
  typedef COMPONENT_TYPE ComponentType;                                      \
  typedef TYPE IntermediateType;                                             \
  enum {                           \
  dataType              = TYPE_ID, \
  isBuiltInFloatType    = false,   \
  isBuiltInIntegerType  = false,   \
  isScalarType          = false,   \
  isStandardType        = false,   \
  isBuiltInSignedType   = false,   \
  is8BitInteger         = false,   \
  is16BitInteger        = false,   \
  is32BitInteger        = false,   \
  is64BitInteger        = false,   \
  is8_16_32BitInteger   = false,   \
  isUnknown             = false    \
  };                               \
                                   \
  static inline bool matches(MLDataType dt) { return dt == dataType; }      \
  static inline MLDataType getDataType() { return dataType; }               \
  };

Definition at line 119 of file mlTypeTraits.h.

#define _ML_DECLARE_SCALAR_TYPETRAIT_BODY (   TYPE,
  FLAGS 
)
Value:
template <> struct DataTypeSelector<TYPE##Type>   { typedef TYPE Type; };                      \
  template <> struct TypeTraits<TYPE >  {                                                            \
  typedef TYPE ComponentType;                                                                        \
  typedef double IntermediateType;                                                                   \
  enum {                                                                                             \
  dataType              = TYPE##Type,                                                                \
  isBuiltInFloatType    = (((FLAGS) & ML_FLOAT_TYPE) != 0),                                          \
  isBuiltInIntegerType  = (((FLAGS) & ML_INTEGER_TYPE) != 0),                                        \
  isScalarType          = (((FLAGS) & (ML_INTEGER_TYPE | ML_FLOAT_TYPE)) != 0),                      \
  isStandardType        = isScalarType,                                                              \
  isBuiltInSignedType   = (((FLAGS) & ML_SIGNED_TYPE) != 0),                                         \
  is8BitInteger         = ((((FLAGS) & ML_INTEGER_TYPE) != 0) && (sizeof(TYPE)==sizeof(MLuint8))  ), \
  is16BitInteger        = ((((FLAGS) & ML_INTEGER_TYPE) != 0) && (sizeof(TYPE)==sizeof(MLuint16)) ), \
  is32BitInteger        = ((((FLAGS) & ML_INTEGER_TYPE) != 0) && (sizeof(TYPE)==sizeof(MLuint32)) ), \
  is64BitInteger        = ((((FLAGS) & ML_INTEGER_TYPE) != 0) && (sizeof(TYPE)==sizeof(MLuint64)) ), \
  is8_16_32BitInteger   = ((((FLAGS) & ML_INTEGER_TYPE) != 0) &&                                     \
  ((sizeof(TYPE)==sizeof(MLuint8))  ||                                                               \
  (sizeof(TYPE)==sizeof(MLuint16)) ||                                                                \
  (sizeof(TYPE)==sizeof(MLuint32)))),                                                                \
  isUnknown             = false                                                                      \
  };                                                                                                 \
                                                                                                     \
  static inline bool matches(MLDataType dt) { return dt == dataType; }                               \
  static inline MLDataType getDataType() { return dataType; }                                        \
  };

Definition at line 88 of file mlTypeTraits.h.

#define INT_VECTOR_EXPANDER (   BASE_TYPE,
  DIM_NUM 
)    TVectorNDBase<BASE_TYPE, DIM_NUM>

Definition at line 256 of file mlTypeTraits.h.

#define ML_DECLARE_EXTENDED_TYPETRAIT (   TYPE,
  TYPE_ID,
  COMPONENT_TYPE 
)    _ML_DECLARE_EXTENDED_TYPETRAIT_BODY(TYPE, TYPE_ID, COMPONENT_TYPE)

Macro to declare own type traits.

Definition at line 144 of file mlTypeTraits.h.

#define ML_DECLARE_FLOAT_VECTOR_TYPETRAIT (   TEMPLATE_TYPE,
  BASE_TYPE,
  TYPE_ID 
)    ML_DECLARE_EXTENDED_TYPETRAIT(TEMPLATE_TYPE<BASE_TYPE>, TYPE_ID, BASE_TYPE)

Declaration of standard integer type traits.

Declaration of standard float type traits

Definition at line 161 of file mlTypeTraits.h.

#define ML_DECLARE_INT_VECTOR_TYPETRAIT (   BASE_TYPE,
  DIM_NUM,
  TYPE_ID 
)    _ML_DECLARE_EXTENDED_TYPETRAIT_BODY(INT_VECTOR_EXPANDER(BASE_TYPE, DIM_NUM), TYPE_ID, BASE_TYPE)

Definition at line 258 of file mlTypeTraits.h.

#define ML_DECLARE_MATRIX_TYPETRAIT (   TEMPLATE_TYPE,
  BASE_TYPE,
  TYPE_ID 
)    ML_DECLARE_EXTENDED_TYPETRAIT(TEMPLATE_TYPE<BASE_TYPE>, TYPE_ID, BASE_TYPE)

Definition at line 226 of file mlTypeTraits.h.

#define ML_DECLARE_SCALAR_TYPETRAIT (   TYPE,
  FLAGS 
)    _ML_DECLARE_SCALAR_TYPETRAIT_BODY(TYPE, FLAGS)

Macro to declare own type traits.

Definition at line 116 of file mlTypeTraits.h.


Function Documentation

template<typename T >
T _ml_cast_from_intermediate_type ( const typename ml::TypeTraits< T >::IntermediateType &  v,
OverloadSelector::OnTrue   
) [inline]

Definition at line 402 of file mlTypeTraits.h.

template<typename T >
T _ml_cast_from_intermediate_type_without_clamping ( const typename ml::TypeTraits< T >::IntermediateType &  v,
OverloadSelector::OnTrue   
) [inline]

Definition at line 432 of file mlTypeTraits.h.

template<typename T >
T ml_cast_from_intermediate_type ( const typename ml::TypeTraits< T >::IntermediateType &  v) [inline]

cast from an intermediate type to the desired type; does clamping and rounding for the built-in integer types, for all other types this is a simple cast

Definition at line 425 of file mlTypeTraits.h.

template<typename T >
T ml_cast_from_intermediate_type_without_clamping ( const typename ml::TypeTraits< T >::IntermediateType &  v) [inline]

cast from an intermediate type to the desired type; does rounding but no clamping for the built-in integer types, for all other types this is a simple cast (use this if you know that the value will always be in the data type's range)

Definition at line 448 of file mlTypeTraits.h.

template<typename T >
T ml_cast_from_scalar ( double  v) [inline]

cast the (scalar) argument to the type of the template argument

Definition at line 378 of file mlTypeTraits.h.

References ml_component_cast().

template<typename T >
ml::TypeTraits<T>::IntermediateType ml_cast_to_intermediate_type ( const T &  v) [inline]

cast type to an intermediate type suitable for consecutive arithmetic operations; integer types will be cast to double, all other types will be left alone

Definition at line 386 of file mlTypeTraits.h.

template<typename T , typename S >
ml::TypeTraits<T>::IntermediateType ml_cast_to_intermediate_type_and_multiply ( const T &  v,
s 
) [inline]

same as above, but will also multiply with the second argument

Definition at line 394 of file mlTypeTraits.h.

References ml_component_cast().

template<typename T >
ml::TypeTraits<T>::ComponentType ml_component_cast ( double  v) [inline]

cast the argument to the component type of the template argument

Definition at line 352 of file mlTypeTraits.h.

Referenced by ml_cast_from_scalar(), ml_cast_to_intermediate_type_and_multiply(), and ml_scalar_factor_cast().

template<typename T >
ml::TypeTraits<typename ml::TypeTraits<T>::IntermediateType>::ComponentType ml_scalar_factor_cast ( double  v) [inline]

cast the double argument to a type suitable for multiplying with the template type (this is double for all scalar types and the component type for all extended data types), e.g.

T a = b * ml_scalar_factor_cast<T>(0.1)

Definition at line 363 of file mlTypeTraits.h.

References ml_component_cast().

template<typename T >
ml::TypeTraits<typename ml::TypeTraits<T>::IntermediateType>::ComponentType ml_scalar_factor_cast ( double  v,
const T &  dummy 
) [inline]

same as above with dummy argument of type T (so one doesn't need to specify T explicitly)

Definition at line 371 of file mlTypeTraits.h.

References ml_component_cast().