diff options
author | Marc Mutz <marc.mutz@kdab.com> | 2014-02-12 14:18:40 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-02-16 00:18:32 +0100 |
commit | c0791ac76ec7cfdc3945efa67a6f72ee3623413c (patch) | |
tree | 341d42284f1c50dfc7235baecbbd828e765a8b2a /src/corelib/tools/qhash.cpp | |
parent | d24cceebf2bad8e1172cf992644263cba2098501 (diff) |
Add qHash() overloads for floating-point types
This implementation is based on GCC's implementation of std::hash<FP>, but only
to the extent of checking for zero before hashing the bits. The bit hasher is
the Qt one; I didn't even look what GCC uses.
The check against 0.0 is mandated by the requirement to have
\forall x,y: x == y => qHash(x) == qHash(y)
which would be violated for x = 0.0 and y = -0.0 if we only hashed the bits.
Implemented out-of-line to avoid potential FP-comparison warnings, as well
as to be able to use the file-static hash() functions, which gets inlined
unlike qHashBits(), which cannot be.
[ChangeLog][QtCore][QHash/QSet] Allowed to use float, double and long double
as QHash/QSet keys.
Change-Id: I38cec4afb860f17e9f8be7b67544e58b330f8fff
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@digia.com>
Diffstat (limited to 'src/corelib/tools/qhash.cpp')
-rw-r--r-- | src/corelib/tools/qhash.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/corelib/tools/qhash.cpp b/src/corelib/tools/qhash.cpp index 18d1cee0eb..5320ea1fbf 100644 --- a/src/corelib/tools/qhash.cpp +++ b/src/corelib/tools/qhash.cpp @@ -737,6 +737,38 @@ void QHashData::checkSanity() Returns the hash value for the \a key, using \a seed to seed the calculation. */ +/*! \relates QHash + \since 5.3 + + Returns the hash value for the \a key, using \a seed to seed the calculation. +*/ +uint qHash(float key, uint seed) Q_DECL_NOTHROW +{ + return key != 0.0f ? hash(reinterpret_cast<const uchar *>(&key), sizeof(key), seed) : seed ; +} + +/*! \relates QHash + \since 5.3 + + Returns the hash value for the \a key, using \a seed to seed the calculation. +*/ +uint qHash(double key, uint seed) Q_DECL_NOTHROW +{ + return key != 0.0 ? hash(reinterpret_cast<const uchar *>(&key), sizeof(key), seed) : seed ; +} + +#ifndef Q_OS_DARWIN +/*! \relates QHash + \since 5.3 + + Returns the hash value for the \a key, using \a seed to seed the calculation. +*/ +uint qHash(long double key, uint seed) Q_DECL_NOTHROW +{ + return key != 0.0L ? hash(reinterpret_cast<const uchar *>(&key), sizeof(key), seed) : seed ; +} +#endif + /*! \fn uint qHash(QChar key, uint seed = 0) \relates QHash \since 5.0 |