add highest and lowest functions to NumTraits

This commit is contained in:
Gael Guennebaud 2010-02-10 11:11:21 +01:00
parent fe0827495a
commit bb290977b8

View File

@ -34,7 +34,7 @@
* \c std::complex<float>, \c std::complex<double>, and \c long \c double (especially * \c std::complex<float>, \c std::complex<double>, and \c long \c double (especially
* useful to enforce x87 arithmetics when SSE is the default). * useful to enforce x87 arithmetics when SSE is the default).
* *
* The provided data consists of: * The provided data consists of everything that is supported by std::numeric_limits, plus:
* \li A typedef \a Real, giving the "real part" type of \a T. If \a T is already real, * \li A typedef \a Real, giving the "real part" type of \a T. If \a T is already real,
* then \a Real is just a typedef to \a T. If \a T is \c std::complex<U> then \a Real * then \a Real is just a typedef to \a T. If \a T is \c std::complex<U> then \a Real
* is a typedef to \a U. * is a typedef to \a U.
@ -45,11 +45,29 @@
* type, and to 0 otherwise. * type, and to 0 otherwise.
* \li An enum \a HasFloatingPoint. It is equal to \c 0 if \a T is \c int, * \li An enum \a HasFloatingPoint. It is equal to \c 0 if \a T is \c int,
* and to \c 1 otherwise. * and to \c 1 otherwise.
* \li An epsilon() function which, unlike std::numeric_limits::epsilon(), returns a \a Real instead of a \a T.
* \li A dummy_precision() function returning a weak epsilon value. It is mainly used by the fuzzy comparison operators.
* \li Two higest() and lowest() functions returning the higest and lowest possible values respectively.
*/ */
template<typename T> struct NumTraits; template<typename T> struct NumTraits;
template<typename T> struct ei_default_float_numtraits
: std::numeric_limits<T>
{
inline static T higest() { return std::numeric_limits<T>::max(); }
inline static T lowest() { return -std::numeric_limits<T>::max(); }
};
template<typename T> struct ei_default_integral_numtraits
: std::numeric_limits<T>
{
inline static int dummy_precision() { return 0; }
inline static T highest() { return std::numeric_limits<T>::max(); }
inline static T lowest() { return std::numeric_limits<T>::min(); }
};
template<> struct NumTraits<int> template<> struct NumTraits<int>
: std::numeric_limits<int> : ei_default_integral_numtraits<int>
{ {
typedef int Real; typedef int Real;
typedef double FloatingPoint; typedef double FloatingPoint;
@ -61,12 +79,10 @@ template<> struct NumTraits<int>
AddCost = 1, AddCost = 1,
MulCost = 1 MulCost = 1
}; };
inline static int dummy_precision() { return 0; }
}; };
template<> struct NumTraits<float> template<> struct NumTraits<float>
: std::numeric_limits<float> : ei_default_float_numtraits<float>
{ {
typedef float Real; typedef float Real;
typedef float FloatingPoint; typedef float FloatingPoint;
@ -83,7 +99,7 @@ template<> struct NumTraits<float>
}; };
template<> struct NumTraits<double> template<> struct NumTraits<double>
: std::numeric_limits<double> : ei_default_float_numtraits<double>
{ {
typedef double Real; typedef double Real;
typedef double FloatingPoint; typedef double FloatingPoint;
@ -100,7 +116,7 @@ template<> struct NumTraits<double>
}; };
template<typename _Real> struct NumTraits<std::complex<_Real> > template<typename _Real> struct NumTraits<std::complex<_Real> >
: std::numeric_limits<std::complex<_Real> > : ei_default_float_numtraits<std::complex<_Real> >
{ {
typedef _Real Real; typedef _Real Real;
typedef std::complex<_Real> FloatingPoint; typedef std::complex<_Real> FloatingPoint;
@ -118,7 +134,7 @@ template<typename _Real> struct NumTraits<std::complex<_Real> >
}; };
template<> struct NumTraits<long long int> template<> struct NumTraits<long long int>
: std::numeric_limits<long long int> : ei_default_integral_numtraits<long long int>
{ {
typedef long long int Real; typedef long long int Real;
typedef long double FloatingPoint; typedef long double FloatingPoint;
@ -133,7 +149,7 @@ template<> struct NumTraits<long long int>
}; };
template<> struct NumTraits<long double> template<> struct NumTraits<long double>
: std::numeric_limits<long double> : ei_default_float_numtraits<long double>
{ {
typedef long double Real; typedef long double Real;
typedef long double FloatingPoint; typedef long double FloatingPoint;
@ -150,7 +166,7 @@ template<> struct NumTraits<long double>
}; };
template<> struct NumTraits<bool> template<> struct NumTraits<bool>
: std::numeric_limits<bool> : ei_default_integral_numtraits<bool>
{ {
typedef bool Real; typedef bool Real;
typedef float FloatingPoint; typedef float FloatingPoint;
@ -162,8 +178,6 @@ template<> struct NumTraits<bool>
AddCost = 1, AddCost = 1,
MulCost = 1 MulCost = 1
}; };
inline static bool dummy_precision() { return 0; }
}; };
#endif // EIGEN_NUMTRAITS_H #endif // EIGEN_NUMTRAITS_H