diff --git a/src/corelib/tools/qarraydataops.h b/src/corelib/tools/qarraydataops.h index a864ac4c2b5..d4fd08d54c7 100644 --- a/src/corelib/tools/qarraydataops.h +++ b/src/corelib/tools/qarraydataops.h @@ -1255,7 +1255,20 @@ public: template void emplaceBack(Args&&... args) { - this->emplace(this->end(), std::forward(args)...); + Q_ASSERT(!this->isShared()); + Q_ASSERT(this->freeSpaceAtEnd() >= 1); + new (this->end()) T(std::forward(args)...); + ++this->size; + } + + template + void emplaceFront(Args&&... args) + { + Q_ASSERT(!this->isShared()); + Q_ASSERT(this->freeSpaceAtBegin() >= 1); + new (this->ptr - 1) T(std::forward(args)...); + --this->ptr; + ++this->size; } void erase(T *b, T *e) diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h index 3ea932c0fe2..0d29c459dff 100644 --- a/src/corelib/tools/qlist.h +++ b/src/corelib/tools/qlist.h @@ -711,15 +711,14 @@ inline typename QList::reference QList::emplaceFront(Args &&... args) if (d->needsDetach() || !d.freeSpaceAtBegin()) { DataPointer detached(DataPointer::allocateGrow(d, 1, QArrayData::AllocateAtBeginning)); - detached->emplace(detached.begin(), std::forward(args)...); + detached->emplaceBack(std::forward(args)...); if (!d.needsDetach()) detached->moveAppend(d.begin(), d.end()); else detached->copyAppend(constBegin(), constEnd()); d.swap(detached); } else { - // ### replace with emplaceFront - d->emplace(d.begin(), std::forward(args)...); + d->emplaceFront(std::forward(args)...); } return *d.begin(); } @@ -787,7 +786,7 @@ inline typename QList::reference QList::emplaceBack(Args &&... args) d->emplace(d.end(), std::move(tmp)); } } else { - d->emplace(d.end(), std::forward(args)...); + d->emplaceBack(std::forward(args)...); } return *(d.end() - 1); }