62 lines
1.6 KiB
C++
62 lines
1.6 KiB
C++
|
|
||
|
// Copyright 2005-2009 Daniel James.
|
||
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||
|
//
|
||
|
// On some platforms std::limits gives incorrect values for long double.
|
||
|
// This tries to work around them.
|
||
|
|
||
|
#if !defined(BOOST_FUNCTIONAL_HASH_DETAIL_LIMITS_HEADER)
|
||
|
#define BOOST_FUNCTIONAL_HASH_DETAIL_LIMITS_HEADER
|
||
|
|
||
|
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
||
|
# pragma once
|
||
|
#endif
|
||
|
|
||
|
#include <boost/limits.hpp>
|
||
|
|
||
|
// On OpenBSD, numeric_limits is not reliable for long doubles, but
|
||
|
// the macros defined in <float.h> are and support long double when STLport
|
||
|
// doesn't.
|
||
|
|
||
|
#if defined(__OpenBSD__) || defined(_STLP_NO_LONG_DOUBLE)
|
||
|
#include <float.h>
|
||
|
#endif
|
||
|
|
||
|
namespace boost
|
||
|
{
|
||
|
namespace hash_detail
|
||
|
{
|
||
|
template <class T>
|
||
|
struct limits : std::numeric_limits<T> {};
|
||
|
|
||
|
#if defined(__OpenBSD__) || defined(_STLP_NO_LONG_DOUBLE)
|
||
|
template <>
|
||
|
struct limits<long double>
|
||
|
: std::numeric_limits<long double>
|
||
|
{
|
||
|
static long double epsilon() {
|
||
|
return LDBL_EPSILON;
|
||
|
}
|
||
|
|
||
|
static long double (max)() {
|
||
|
return LDBL_MAX;
|
||
|
}
|
||
|
|
||
|
static long double (min)() {
|
||
|
return LDBL_MIN;
|
||
|
}
|
||
|
|
||
|
BOOST_STATIC_CONSTANT(int, digits = LDBL_MANT_DIG);
|
||
|
BOOST_STATIC_CONSTANT(int, max_exponent = LDBL_MAX_EXP);
|
||
|
BOOST_STATIC_CONSTANT(int, min_exponent = LDBL_MIN_EXP);
|
||
|
#if defined(_STLP_NO_LONG_DOUBLE)
|
||
|
BOOST_STATIC_CONSTANT(int, radix = FLT_RADIX);
|
||
|
#endif
|
||
|
};
|
||
|
#endif // __OpenBSD__
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif
|