diff options
author | Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> | 2020-05-04 15:08:09 +0200 |
---|---|---|
committer | Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> | 2020-05-12 01:51:26 +0200 |
commit | 902120c62146e06db953a30cb876ecc7a5be3e28 (patch) | |
tree | ecc871b7aaf67df4361d525690b47aff41742858 /src | |
parent | 707129fd5a7c6390fbdf4270119226df2a427fcd (diff) |
Rhi: improve qHash implementations
Use the combiners and an algorithm.
Change-Id: I577950bbd2e8b0556f28e2a8381e432c22bb0dc9
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/rhi/qshader.cpp | 26 | ||||
-rw-r--r-- | src/gui/rhi/qshader_p.h | 5 |
2 files changed, 26 insertions, 5 deletions
diff --git a/src/gui/rhi/qshader.cpp b/src/gui/rhi/qshader.cpp index 18d0fdef05..2c1b333259 100644 --- a/src/gui/rhi/qshader.cpp +++ b/src/gui/rhi/qshader.cpp @@ -545,10 +545,12 @@ bool operator==(const QShader &lhs, const QShader &rhs) Q_DECL_NOTHROW */ size_t qHash(const QShader &s, size_t seed) Q_DECL_NOTHROW { - size_t h = s.stage(); - for (auto it = s.d->shaders.constBegin(), itEnd = s.d->shaders.constEnd(); it != itEnd; ++it) - h += qHash(it.key(), seed) + qHash(it.value().shader(), seed); - return h; + QtPrivate::QHashCombine hash; + seed = hash(seed, s.stage()); + seed = qHashRange(s.d->shaders.keyValueBegin(), + s.d->shaders.keyValueEnd(), + seed); + return seed; } /*! @@ -598,7 +600,11 @@ bool operator==(const QShaderKey &lhs, const QShaderKey &rhs) Q_DECL_NOTHROW */ size_t qHash(const QShaderKey &k, size_t seed) Q_DECL_NOTHROW { - return seed + 10 * k.source() + k.sourceVersion().version() + k.sourceVersion().flags() + k.sourceVariant(); + return qHashMulti(seed, + k.source(), + k.sourceVersion().version(), + k.sourceVersion().flags(), + k.sourceVariant()); } /*! @@ -620,6 +626,16 @@ bool operator==(const QShaderCode &lhs, const QShaderCode &rhs) Q_DECL_NOTHROW \relates QShaderCode */ +/*! + Returns the hash value for \a k, using \a seed to seed the calculation. + + \relates QShaderCode + */ +size_t qHash(const QShaderCode &k, size_t seed) noexcept +{ + return qHash(k.shader(), seed); +} + #ifndef QT_NO_DEBUG_STREAM QDebug operator<<(QDebug dbg, const QShader &bs) { diff --git a/src/gui/rhi/qshader_p.h b/src/gui/rhi/qshader_p.h index f2d3c4ac2f..449873412f 100644 --- a/src/gui/rhi/qshader_p.h +++ b/src/gui/rhi/qshader_p.h @@ -81,6 +81,9 @@ private: Q_DECLARE_OPERATORS_FOR_FLAGS(QShaderVersion::Flags) Q_DECLARE_TYPEINFO(QShaderVersion, Q_MOVABLE_TYPE); +class QShaderCode; +Q_GUI_EXPORT size_t qHash(const QShaderCode &, size_t = 0) noexcept; + class Q_GUI_EXPORT QShaderCode { public: @@ -94,6 +97,8 @@ public: void setEntryPoint(const QByteArray &entry) { m_entryPoint = entry; } private: + friend Q_GUI_EXPORT size_t qHash(const QShaderCode &, size_t) noexcept; + QByteArray m_shader; QByteArray m_entryPoint; }; |