QGrpcCommonOptions: improve and rename mergeHash()

Rename the free function to 'toHash', as no merging was happening, this
name was misleading.

Improve the implementation by adding the missing 'reserve()' and simply
try_emplace() the pair into the hash. This will still take the newest
value as before but without constructing a temporary key list and having
the extra lookup with value().

Pick-to: 6.10
Change-Id: I4834feea43e20614caea3d587055c024012e0596
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
Reviewed-by: Alexey Edelev <alexey.edelev@qt.io>
This commit is contained in:
Dennis Oberst 2025-07-11 10:21:28 +02:00
parent 0e2803842a
commit f636865a23
3 changed files with 15 additions and 9 deletions

View File

@ -9,11 +9,15 @@ QT_BEGIN_NAMESPACE
namespace QtGrpcPrivate {
QHash<QByteArray, QByteArray> mergeHash(const QMultiHash<QByteArray, QByteArray> &multiHash)
QHash<QByteArray, QByteArray>
toHash(const QMultiHash<QByteArray, QByteArray> &multiHash)
{
// Transform a QMultiHash into a QHash by keeping only the first value for each key.
// The first value will be the newest one when iterating the multi-hash.
QHash<QByteArray, QByteArray> out;
for (const auto &key : multiHash.uniqueKeys())
out.insert(key, multiHash.value(key));
out.reserve(multiHash.size());
for (const auto &[k, v] : multiHash.asKeyValueRange())
out.try_emplace(k, v);
return out;
}
@ -50,13 +54,13 @@ const QHash<QByteArray, QByteArray> &QGrpcCommonOptions::metadata() const &
{
m_deprecatedQHashRefUsed = true;
if (m_metadataMulti != m_metadata)
m_metadata = mergeHash(m_metadataMulti);
m_metadata = toHash(m_metadataMulti);
return m_metadata;
}
QHash<QByteArray, QByteArray> QGrpcCommonOptions::metadata() &&
{
if (m_metadataMulti != m_metadata)
m_metadata = mergeHash(m_metadataMulti);
m_metadata = toHash(m_metadataMulti);
return std::move(m_metadata);
}
@ -152,7 +156,7 @@ void QGrpcCommonOptions::setMetadata(const QMultiHash<QByteArray, QByteArray> &m
m_metadataMulti = md;
#if QT_DEPRECATED_SINCE(6, 13)
if (m_deprecatedQHashRefUsed)
m_metadata = mergeHash(m_metadataMulti);
m_metadata = toHash(m_metadataMulti);
#endif
}
@ -161,7 +165,7 @@ void QGrpcCommonOptions::setMetadata(QMultiHash<QByteArray, QByteArray> &&md)
m_metadataMulti = std::move(md);
#if QT_DEPRECATED_SINCE(6, 13)
if (m_deprecatedQHashRefUsed)
m_metadata = mergeHash(m_metadataMulti);
m_metadata = toHash(m_metadataMulti);
#endif
}

View File

@ -60,11 +60,13 @@ private:
namespace QtGrpcPrivate {
QHash<QByteArray, QByteArray> mergeHash(const QMultiHash<QByteArray, QByteArray> &multiHash);
bool operator==(const QMultiHash<QByteArray, QByteArray> &multiHash,
const QHash<QByteArray, QByteArray> &hash);
bool operator!=(const QMultiHash<QByteArray, QByteArray> &multiHash,
const QHash<QByteArray, QByteArray> &hash);
#if QT_DEPRECATED_SINCE(6, 13)
QHash<QByteArray, QByteArray> toHash(const QMultiHash<QByteArray, QByteArray> &multiHash);
#endif
}

View File

@ -313,7 +313,7 @@ void QGrpcOperationContext::setServerInitialMetadata(QMultiHash<QByteArray, QByt
return;
d->serverInitialMetadata = std::move(metadata);
#if QT_DEPRECATED_SINCE(6, 13)
d->deprServerInitialMetadata = QtGrpcPrivate::mergeHash(d->serverInitialMetadata);
d->deprServerInitialMetadata = QtGrpcPrivate::toHash(d->serverInitialMetadata);
#endif
}