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
* 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,
* 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.
@ -45,11 +45,29 @@
* type, and to 0 otherwise.
* \li An enum \a HasFloatingPoint. It is equal to \c 0 if \a T is \c int,
* 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 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>
: std::numeric_limits<int>
: ei_default_integral_numtraits<int>
{
typedef int Real;
typedef double FloatingPoint;
@ -61,12 +79,10 @@ template<> struct NumTraits<int>
AddCost = 1,
MulCost = 1
};
inline static int dummy_precision() { return 0; }
};
template<> struct NumTraits<float>
: std::numeric_limits<float>
: ei_default_float_numtraits<float>
{
typedef float Real;
typedef float FloatingPoint;
@ -83,7 +99,7 @@ template<> struct NumTraits<float>
};
template<> struct NumTraits<double>
: std::numeric_limits<double>
: ei_default_float_numtraits<double>
{
typedef double Real;
typedef double FloatingPoint;
@ -100,7 +116,7 @@ template<> struct NumTraits<double>
};
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 std::complex<_Real> FloatingPoint;
@ -118,7 +134,7 @@ template<typename _Real> struct NumTraits<std::complex<_Real> >
};
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 double FloatingPoint;
@ -133,7 +149,7 @@ template<> struct NumTraits<long long int>
};
template<> struct NumTraits<long double>
: std::numeric_limits<long double>
: ei_default_float_numtraits<long double>
{
typedef long double Real;
typedef long double FloatingPoint;
@ -150,7 +166,7 @@ template<> struct NumTraits<long double>
};
template<> struct NumTraits<bool>
: std::numeric_limits<bool>
: ei_default_integral_numtraits<bool>
{
typedef bool Real;
typedef float FloatingPoint;
@ -162,8 +178,6 @@ template<> struct NumTraits<bool>
AddCost = 1,
MulCost = 1
};
inline static bool dummy_precision() { return 0; }
};
#endif // EIGEN_NUMTRAITS_H