summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2020-11-09 10:29:58 +0100
committerLars Knoll <lars.knoll@qt.io>2020-11-17 11:45:58 +0100
commit4ee3c4a546e4bf9d9f716f9d2e567e380e0453c7 (patch)
treea169297a88cd94534acac09b888c5e82accd6268 /src/corelib
parentfc172c43132a15e17bd435db90e85722c7100361 (diff)
Move emplaceFront/Back() implementation into QArrayDataOps
This simplifies and clean up the code. Change-Id: I4cbfa69bda95187f97daf814eb3d44d90c502d92 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
Diffstat (limited to 'src/corelib')
-rw-r--r--src/corelib/tools/qarraydataops.h26
-rw-r--r--src/corelib/tools/qlist.h18
2 files changed, 22 insertions, 22 deletions
diff --git a/src/corelib/tools/qarraydataops.h b/src/corelib/tools/qarraydataops.h
index c2414f22f2..a0c3da7cce 100644
--- a/src/corelib/tools/qarraydataops.h
+++ b/src/corelib/tools/qarraydataops.h
@@ -1373,18 +1373,32 @@ public:
template <typename ...Args>
void emplaceBack(Args&&... args)
{
- Q_ASSERT(!this->isShared());
- Q_ASSERT(this->freeSpaceAtEnd() >= 1);
- new (this->end()) T(std::forward<Args>(args)...);
+ if (this->needsDetach() || !this->freeSpaceAtEnd()) {
+ // protect against args being an element of the container
+ T tmp(std::forward<Args>(args)...);
+ this->reallocateAndGrow(QArrayData::GrowsAtEnd, 1);
+ Q_ASSERT(!this->isShared());
+ Q_ASSERT(this->freeSpaceAtEnd() >= 1);
+ new (this->end()) T(std::move(tmp));
+ } else {
+ new (this->end()) T(std::forward<Args>(args)...);
+ }
++this->size;
}
template <typename ...Args>
void emplaceFront(Args&&... args)
{
- Q_ASSERT(!this->isShared());
- Q_ASSERT(this->freeSpaceAtBegin() >= 1);
- new (this->ptr - 1) T(std::forward<Args>(args)...);
+ if (this->needsDetach() || !this->freeSpaceAtBegin()) {
+ // protect against args being an element of the container
+ T tmp(std::forward<Args>(args)...);
+ this->reallocateAndGrow(QArrayData::GrowsAtBeginning, 1);
+ Q_ASSERT(!this->isShared());
+ Q_ASSERT(this->freeSpaceAtBegin() >= 1);
+ new (this->ptr - 1) T(std::move(tmp));
+ } else {
+ new (this->ptr - 1) T(std::forward<Args>(args)...);
+ }
--this->ptr;
++this->size;
}
diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h
index 9c95d49bae..eefe7b448f 100644
--- a/src/corelib/tools/qlist.h
+++ b/src/corelib/tools/qlist.h
@@ -715,14 +715,7 @@ template<typename T>
template<typename... Args>
inline typename QList<T>::reference QList<T>::emplaceFront(Args &&... args)
{
- if (d->needsDetach() || !d.freeSpaceAtBegin()) {
- // protect against args being an element of the container
- T tmp(std::forward<Args>(args)...);
- d.reallocateAndGrow(QArrayData::GrowsAtBeginning, 1);
- d->emplaceFront(std::move(tmp));
- } else {
- d->emplaceFront(std::forward<Args>(args)...);
- }
+ d->emplaceFront(std::forward<Args>(args)...);
return *d.begin();
}
@@ -751,14 +744,7 @@ template<typename T>
template<typename... Args>
inline typename QList<T>::reference QList<T>::emplaceBack(Args &&... args)
{
- if (d->needsDetach() || !d.freeSpaceAtEnd()) {
- // protect against args being an element of the container
- T tmp(std::forward<Args>(args)...);
- d.reallocateAndGrow(QArrayData::GrowsAtEnd, 1);
- d->emplaceBack(std::move(tmp));
- } else {
- d->emplaceBack(std::forward<Args>(args)...);
- }
+ d->emplaceBack(std::forward<Args>(args)...);
return *(d.end() - 1);
}