From f1c305cbd2e6b489074360056d9a7820fe5c7ae0 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Fri, 12 Nov 2021 12:49:53 -0800 Subject: [PATCH] QCborMap: merge the operator[] methods into a template Change-Id: I5e52dc5b093c43a3b678fffd16b6e7a123338178 Reviewed-by: Edward Welbourne --- src/corelib/serialization/qcbormap.cpp | 44 +++++++----------------- src/corelib/serialization/qcborvalue_p.h | 24 +++++++++++++ 2 files changed, 36 insertions(+), 32 deletions(-) diff --git a/src/corelib/serialization/qcbormap.cpp b/src/corelib/serialization/qcbormap.cpp index 56068e333d..3934c964e4 100644 --- a/src/corelib/serialization/qcbormap.cpp +++ b/src/corelib/serialization/qcbormap.cpp @@ -422,14 +422,7 @@ QList QCborMap::keys() const */ QCborValueRef QCborMap::operator[](qint64 key) { - auto it = find(key); - if (it == constEnd()) { - // insert element - detach(it.item.i + 2); - d->append(key); - d->append(Undefined{}); - } - return { d.data(), it.item.i }; + return QCborContainerPrivate::findOrAddMapKey(*this, key); } /*! @@ -549,14 +542,7 @@ QCborValueRef QCborMap::operator[](qint64 key) */ QCborValueRef QCborMap::operator[](QLatin1String key) { - auto it = find(key); - if (it == constEnd()) { - // insert element - detach(it.item.i + 2); - d->append(key); - d->append(Undefined{}); - } - return { d.data(), it.item.i }; + return QCborContainerPrivate::findOrAddMapKey(*this, key); } /*! @@ -678,14 +664,7 @@ QCborValueRef QCborMap::operator[](QLatin1String key) */ QCborValueRef QCborMap::operator[](const QString & key) { - auto it = find(key); - if (it == constEnd()) { - // insert element - detach(it.item.i + 2); - d->append(key); - d->append(Undefined{}); - } - return { d.data(), it.item.i }; + return QCborContainerPrivate::findOrAddMapKey(*this, qToStringViewIgnoringNull(key)); } /*! @@ -803,14 +782,15 @@ QCborValueRef QCborMap::operator[](const QString & key) */ QCborValueRef QCborMap::operator[](const QCborValue &key) { - auto it = find(key); - if (it == constEnd()) { - // insert element - detach(it.item.i + 2); - d->append(key); - d->append(Undefined{}); - } - return { d.data(), it.item.i }; + return QCborContainerPrivate::findOrAddMapKey(*this, key); +} + +template inline QCborValueRef +QCborContainerPrivate::findOrAddMapKey(QCborMap &map, KeyType key) +{ + QCborValueRef result = findOrAddMapKey(map.d.data(), key); + map.d = result.d; + return result; } /*! diff --git a/src/corelib/serialization/qcborvalue_p.h b/src/corelib/serialization/qcborvalue_p.h index 55a5dbf871..185b74bc93 100644 --- a/src/corelib/serialization/qcborvalue_p.h +++ b/src/corelib/serialization/qcborvalue_p.h @@ -439,6 +439,30 @@ public: } return QCborValueRef{ this, i + 1 }; } + template static QCborValueRef + findOrAddMapKey(QCborContainerPrivate *container, KeyType key) + { + qsizetype size = 0; + qsizetype index = size + 1; + if (container) { + size = container->elements.size(); + index = container->findCborMapKey(key).i; // returns size + 1 if not found + } + Q_ASSERT(index & 1); + Q_ASSERT((size & 1) == 0); + + container = detach(container, qMax(index + 1, size)); + Q_ASSERT(container); + Q_ASSERT((container->elements.size() & 1) == 0); + + if (index >= size) { + container->append(key); + container->append(QCborValue()); + } + Q_ASSERT(index < container->elements.size()); + return { container, index }; + } + template static QCborValueRef findOrAddMapKey(QCborMap &map, KeyType key); #if QT_CONFIG(cborstreamreader) void decodeValueFromCbor(QCborStreamReader &reader, int remainingStackDepth);