summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/network/ssl/qsslerror.cpp13
-rw-r--r--src/network/ssl/qsslerror.h2
-rw-r--r--src/network/ssl/qsslsocket_winrt.cpp5
-rw-r--r--tests/auto/network/ssl/qsslerror/tst_qsslerror.cpp9
4 files changed, 24 insertions, 5 deletions
diff --git a/src/network/ssl/qsslerror.cpp b/src/network/ssl/qsslerror.cpp
index ff30098347..5004e561a8 100644
--- a/src/network/ssl/qsslerror.cpp
+++ b/src/network/ssl/qsslerror.cpp
@@ -305,6 +305,19 @@ QSslCertificate QSslError::certificate() const
return d->certificate;
}
+/*!
+ Returns the hash value for the \a key, using \a seed to seed the calculation.
+ \since 5.4
+ \relates QHash
+*/
+uint qHash(const QSslError &key, uint seed) Q_DECL_NOTHROW
+{
+ // 2x boost::hash_combine inlined:
+ seed ^= qHash(key.error()) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
+ seed ^= qHash(key.certificate()) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
+ return seed;
+}
+
#ifndef QT_NO_DEBUG_STREAM
//class QDebug;
QDebug operator<<(QDebug debug, const QSslError &error)
diff --git a/src/network/ssl/qsslerror.h b/src/network/ssl/qsslerror.h
index d25546b68b..c00532e294 100644
--- a/src/network/ssl/qsslerror.h
+++ b/src/network/ssl/qsslerror.h
@@ -102,6 +102,8 @@ private:
};
Q_DECLARE_SHARED(QSslError)
+Q_NETWORK_EXPORT uint qHash(const QSslError &key, uint seed = 0) Q_DECL_NOTHROW;
+
#ifndef QT_NO_DEBUG_STREAM
class QDebug;
Q_NETWORK_EXPORT QDebug operator<<(QDebug debug, const QSslError &error);
diff --git a/src/network/ssl/qsslsocket_winrt.cpp b/src/network/ssl/qsslsocket_winrt.cpp
index 69f8b6d68a..da4c72be01 100644
--- a/src/network/ssl/qsslsocket_winrt.cpp
+++ b/src/network/ssl/qsslsocket_winrt.cpp
@@ -65,11 +65,6 @@ using namespace ABI::Windows::Storage::Streams;
QT_BEGIN_NAMESPACE
-// For QSet<QSslError>
-inline uint qHash(const QSslError &error, uint seed)
- Q_DECL_NOEXCEPT_EXPR(noexcept(qHash(error)))
-{ return (qHash(error.error()) ^ seed); }
-
bool QSslSocketPrivate::s_libraryLoaded = true;
bool QSslSocketPrivate::s_loadRootCertsOnDemand = true;
bool QSslSocketPrivate::s_loadedCiphersAndCerts = false;
diff --git a/tests/auto/network/ssl/qsslerror/tst_qsslerror.cpp b/tests/auto/network/ssl/qsslerror/tst_qsslerror.cpp
index 58136f9a68..7fd6dc8233 100644
--- a/tests/auto/network/ssl/qsslerror/tst_qsslerror.cpp
+++ b/tests/auto/network/ssl/qsslerror/tst_qsslerror.cpp
@@ -64,6 +64,7 @@ public:
#ifndef QT_NO_SSL
private slots:
void constructing();
+ void hash();
#endif
private:
@@ -79,6 +80,14 @@ void tst_QSslError::constructing()
QSslError error;
}
+void tst_QSslError::hash()
+{
+ // mostly a compile-only test, to check that qHash(QSslError) is found
+ QSet<QSslError> errors;
+ errors << QSslError();
+ QCOMPARE(errors.size(), 1);
+}
+
#endif // QT_NO_SSL
QTEST_MAIN(tst_QSslError)