diff options
Diffstat (limited to 'src/corelib/tools')
-rw-r--r-- | src/corelib/tools/qarraydataops.h | 3 | ||||
-rw-r--r-- | src/corelib/tools/qarraydatapointer.h | 6 | ||||
-rw-r--r-- | src/corelib/tools/qlist.h | 10 |
3 files changed, 11 insertions, 8 deletions
diff --git a/src/corelib/tools/qarraydataops.h b/src/corelib/tools/qarraydataops.h index edfcd82706..03ba93198c 100644 --- a/src/corelib/tools/qarraydataops.h +++ b/src/corelib/tools/qarraydataops.h @@ -460,8 +460,7 @@ public: const bool grows = options & (Data::GrowsForward | Data::GrowsBackwards); // ### optimize me: there may be cases when moving is not obligatory - if (this->d && !grows) { - const auto gap = this->freeSpaceAtBegin(); + if (const auto gap = this->freeSpaceAtBegin(); this->d && !grows && gap) { auto oldBegin = this->begin(); this->ptr -= gap; ::memmove(static_cast<void *>(this->begin()), static_cast<void *>(oldBegin), diff --git a/src/corelib/tools/qarraydatapointer.h b/src/corelib/tools/qarraydatapointer.h index aebc83ba3f..ad5acdb7fd 100644 --- a/src/corelib/tools/qarraydatapointer.h +++ b/src/corelib/tools/qarraydatapointer.h @@ -209,6 +209,12 @@ public: return d->constAllocatedCapacity() - freeSpaceAtBegin() - this->size; } + static QArrayDataPointer allocateGrow(const QArrayDataPointer &from, + qsizetype newSize, QArrayData::ArrayOptions options) + { + return allocateGrow(from, from.detachCapacity(newSize), newSize, options); + } + static QArrayDataPointer allocateGrow(const QArrayDataPointer &from, qsizetype capacity, qsizetype newSize, QArrayData::ArrayOptions options) { diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h index 4298434a94..bd593bae55 100644 --- a/src/corelib/tools/qlist.h +++ b/src/corelib/tools/qlist.h @@ -564,7 +564,7 @@ inline void QList<T>::append(const_iterator i1, const_iterator i2) const size_t newSize = size() + distance; const bool shouldGrow = d->shouldGrowBeforeInsert(d.end(), qsizetype(distance)); if (d->needsDetach() || newSize > d->allocatedCapacity() || shouldGrow) { - DataPointer detached(DataPointer::allocateGrow(d, d->detachCapacity(newSize), newSize, + DataPointer detached(DataPointer::allocateGrow(d, newSize, d->detachFlags() | Data::GrowsForward)); detached->copyAppend(constBegin(), constEnd()); detached->copyAppend(i1, i2); @@ -586,7 +586,7 @@ inline void QList<T>::append(QList<T> &&other) const size_t newSize = size() + other.size(); const bool shouldGrow = d->shouldGrowBeforeInsert(d.end(), other.size()); if (d->needsDetach() || newSize > d->allocatedCapacity() || shouldGrow) { - DataPointer detached(DataPointer::allocateGrow(d, d->detachCapacity(newSize), newSize, + DataPointer detached(DataPointer::allocateGrow(d, newSize, d->detachFlags() | Data::GrowsForward)); if (!d->needsDetach()) @@ -619,8 +619,7 @@ QList<T>::insert(qsizetype i, qsizetype n, parameter_type t) if (size_t(i) <= newSize / 4) flags |= Data::GrowsBackwards; - DataPointer detached(DataPointer::allocateGrow(d, d->detachCapacity(newSize), newSize, - flags)); + DataPointer detached(DataPointer::allocateGrow(d, newSize, flags)); const_iterator where = constBegin() + i; detached->copyAppend(constBegin(), where); detached->copyAppend(n, t); @@ -652,8 +651,7 @@ QList<T>::emplace(qsizetype i, Args&&... args) if (size_t(i) <= newSize / 4) flags |= Data::GrowsBackwards; - DataPointer detached(DataPointer::allocateGrow(d, d->detachCapacity(newSize), newSize, - flags)); + DataPointer detached(DataPointer::allocateGrow(d, newSize, flags)); const_iterator where = constBegin() + i; // Create an element here to handle cases when a user moves the element // from a container to the same container. This is a critical step for |