You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
101 lines
2.5 KiB
101 lines
2.5 KiB
|
|
// 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) |
|
|
|
#if !defined(BOOST_FUNCTIONAL_HASH_DETAIL_HASH_FLOAT_HEADER) |
|
#define BOOST_FUNCTIONAL_HASH_DETAIL_HASH_FLOAT_HEADER |
|
|
|
#if defined(_MSC_VER) && (_MSC_VER >= 1020) |
|
# pragma once |
|
#endif |
|
|
|
#include <boost/config.hpp> |
|
#include <boost/functional/hash/detail/float_functions.hpp> |
|
#include <boost/functional/hash/detail/limits.hpp> |
|
#include <boost/integer/static_log2.hpp> |
|
#include <boost/cstdint.hpp> |
|
#include <boost/assert.hpp> |
|
|
|
// Include hash implementation for the current platform. |
|
|
|
// Cygwn |
|
#if defined(__CYGWIN__) |
|
# if defined(__i386__) || defined(_M_IX86) |
|
# include <boost/functional/hash/detail/hash_float_x86.hpp> |
|
# else |
|
# include <boost/functional/hash/detail/hash_float_generic.hpp> |
|
# endif |
|
#else |
|
# include <boost/functional/hash/detail/hash_float_generic.hpp> |
|
#endif |
|
|
|
// Can we use fpclassify? |
|
|
|
// STLport |
|
#if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION) |
|
#define BOOST_HASH_USE_FPCLASSIFY 0 |
|
|
|
// GNU libstdc++ 3 |
|
#elif defined(__GLIBCPP__) || defined(__GLIBCXX__) |
|
# if (defined(__USE_ISOC99) || defined(_GLIBCXX_USE_C99_MATH)) && \ |
|
!(defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)) |
|
# define BOOST_HASH_USE_FPCLASSIFY 1 |
|
# else |
|
# define BOOST_HASH_USE_FPCLASSIFY 0 |
|
# endif |
|
|
|
// Everything else |
|
#else |
|
# define BOOST_HASH_USE_FPCLASSIFY 0 |
|
#endif |
|
|
|
#if BOOST_HASH_USE_FPCLASSIFY |
|
|
|
#include <boost/config/no_tr1/cmath.hpp> |
|
|
|
namespace boost |
|
{ |
|
namespace hash_detail |
|
{ |
|
template <class T> |
|
inline std::size_t float_hash_value(T v) |
|
{ |
|
using namespace std; |
|
switch (fpclassify(v)) { |
|
case FP_ZERO: |
|
return 0; |
|
case FP_INFINITE: |
|
return (std::size_t)(v > 0 ? -1 : -2); |
|
case FP_NAN: |
|
return (std::size_t)(-3); |
|
case FP_NORMAL: |
|
case FP_SUBNORMAL: |
|
return float_hash_impl(v); |
|
default: |
|
BOOST_ASSERT(0); |
|
return 0; |
|
} |
|
} |
|
} |
|
} |
|
|
|
#else // !BOOST_HASH_USE_FPCLASSIFY |
|
|
|
namespace boost |
|
{ |
|
namespace hash_detail |
|
{ |
|
template <class T> |
|
inline std::size_t float_hash_value(T v) |
|
{ |
|
return v == 0 ? 0 : float_hash_impl(v); |
|
} |
|
} |
|
} |
|
|
|
#endif // BOOST_HASH_USE_FPCLASSIFY |
|
|
|
#undef BOOST_HASH_USE_FPCLASSIFY |
|
|
|
#endif
|
|
|