diff options
Diffstat (limited to 'src/corelib/tools/qhashfunctions.h')
-rw-r--r-- | src/corelib/tools/qhashfunctions.h | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/corelib/tools/qhashfunctions.h b/src/corelib/tools/qhashfunctions.h index 5e714806ff..2ff3464912 100644 --- a/src/corelib/tools/qhashfunctions.h +++ b/src/corelib/tools/qhashfunctions.h @@ -45,6 +45,7 @@ #include <QtCore/qpair.h> #include <numeric> // for std::accumulate +#include <functional> // for std::hash #if 0 #pragma qt_class(QHashFunctions) @@ -172,6 +173,41 @@ template <typename T1, typename T2> inline uint qHash(const std::pair<T1, T2> &k return seed; } +#define QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH(Class, Arguments) \ + QT_BEGIN_INCLUDE_NAMESPACE \ + namespace std { \ + template <> \ + struct hash< QT_PREPEND_NAMESPACE(Class) > { \ + using argument_type = QT_PREPEND_NAMESPACE(Class); \ + using result_type = size_t; \ + size_t operator()(Arguments s) const \ + noexcept(noexcept(QT_PREPEND_NAMESPACE(qHash)(s))) \ + { \ + /* this seeds qHash with the result of */ \ + /* std::hash applied to an int, to reap */ \ + /* any protection against predictable hash */ \ + /* values the std implementation may provide */ \ + return QT_PREPEND_NAMESPACE(qHash)(s, \ + QT_PREPEND_NAMESPACE(qHash)( \ + std::hash<int>{}(0))); \ + } \ + }; \ + } \ + QT_END_INCLUDE_NAMESPACE \ + /*end*/ + +#define QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_CREF(Class) \ + QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH(Class, const argument_type &) +#define QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_VALUE(Class) \ + QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH(Class, argument_type) + +QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_CREF(QString) +QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_CREF(QStringRef) +QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_VALUE(QStringView) +QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_VALUE(QLatin1String) +QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_CREF(QByteArray) +QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_CREF(QBitArray) + QT_END_NAMESPACE #if defined(Q_CC_MSVC) |