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>
This commit is contained in:
Giuseppe D'Angelo 2020-05-04 15:08:09 +02:00
parent 707129fd5a
commit 902120c621
2 changed files with 26 additions and 5 deletions

View File

@ -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)
{

View File

@ -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;
};