diff --git a/src/corelib/serialization/qcbormap.cpp b/src/corelib/serialization/qcbormap.cpp index 56068e333dc..3934c964e40 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 55a5dbf8717..185b74bc932 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);