summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2020-12-03 09:14:27 +0100
committerLars Knoll <lars.knoll@qt.io>2020-12-03 13:49:10 +0100
commit5d8b586e73e37070b0303bee24372550854637eb (patch)
tree742229fb906719e3dc9b8104766b1b283c0dd95b
parent95730dd19cddd65588c902255513517556afc49f (diff)
Add a qHashEquals() method and use it to compare keys in QHash
In some cases, the default equality operator for a class is not suitable for using in hashing (for example because it uses fuzzy comparisons). Add a qHashEquals() method that by default uses the equality operator, but allows to tailor the operations that should be used when using the class as a key in QHash. Pick-to: 6.0 dev Task-number: QTBUG-88966 Change-Id: I346cf0e6e923277a8b42a79e50342a1c2511fd80 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
-rw-r--r--src/corelib/tools/qhash.cpp15
-rw-r--r--src/corelib/tools/qhash.h2
-rw-r--r--src/corelib/tools/qhashfunctions.h6
3 files changed, 22 insertions, 1 deletions
diff --git a/src/corelib/tools/qhash.cpp b/src/corelib/tools/qhash.cpp
index 112a492526..1087f21564 100644
--- a/src/corelib/tools/qhash.cpp
+++ b/src/corelib/tools/qhash.cpp
@@ -1074,6 +1074,21 @@ size_t qHash(long double key, size_t seed) noexcept
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
+/*! \fn template<typename T> bool qHashEquals(const T &a, const T &b)
+ \relates QHash
+ \since 6.0
+ \internal
+
+ This method is being used by QHash to compare two keys. Returns true if the
+ keys \a a and \a b are considered equal for hashing purposes.
+
+ The default implementation returns the result of (a == b). It can be reimplemented
+ for a certain type if the equality operator is not suitable for hashing purposes.
+ This is for example the case if the equality operator uses qFuzzyCompare to compare
+ floating point values.
+*/
+
+
/*!
\class QHash
\inmodule QtCore
diff --git a/src/corelib/tools/qhash.h b/src/corelib/tools/qhash.h
index 5dc88943fc..70e98bed60 100644
--- a/src/corelib/tools/qhash.h
+++ b/src/corelib/tools/qhash.h
@@ -560,7 +560,7 @@ struct Data
return iterator{ this, bucket };
} else {
Node &n = s.atOffset(offset);
- if (n.key == key)
+ if (qHashEquals(n.key, key))
return iterator{ this, bucket };
}
bucket = nextBucket(bucket);
diff --git a/src/corelib/tools/qhashfunctions.h b/src/corelib/tools/qhashfunctions.h
index 9cfa852ba2..a8b5e0f7bc 100644
--- a/src/corelib/tools/qhashfunctions.h
+++ b/src/corelib/tools/qhashfunctions.h
@@ -170,6 +170,12 @@ template<typename T> inline size_t qHash(const T &t, size_t seed)
noexcept(noexcept(qHash(t)))
{ return qHash(t) ^ seed; }
+template<typename T>
+bool qHashEquals(const T &a, const T &b)
+{
+ return a == b;
+}
+
namespace QtPrivate {
struct QHashCombine