summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools/qarraydatapointer.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/tools/qarraydatapointer.h')
-rw-r--r--src/corelib/tools/qarraydatapointer.h19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/corelib/tools/qarraydatapointer.h b/src/corelib/tools/qarraydatapointer.h
index d483a5a5e5..20015cbadd 100644
--- a/src/corelib/tools/qarraydatapointer.h
+++ b/src/corelib/tools/qarraydatapointer.h
@@ -244,6 +244,25 @@ public:
return lhs.data() != rhs.data() || lhs.size != rhs.size;
}
+ static void reallocateGrow(QArrayDataPointer &from, qsizetype n)
+ {
+ Q_ASSERT(n > 0);
+
+ if constexpr (!QTypeInfo<T>::isRelocatable || alignof(T) > alignof(std::max_align_t)) {
+ QArrayDataPointer dd(allocateGrow(from, n, QArrayData::AllocateAtEnd));
+ dd->copyAppend(from.data(), from.data() + from.size);
+ from.swap(dd);
+ } else {
+ if (from.needsDetach()) {
+ QArrayDataPointer dd(allocateGrow(from, n, QArrayData::AllocateAtEnd));
+ dd->copyAppend(from.data(), from.data() + from.size);
+ from.swap(dd);
+ } else {
+ from->reallocate(from.constAllocatedCapacity() - from.freeSpaceAtEnd() + n, QArrayData::Grow); // fast path
+ }
+ }
+ }
+
private:
[[nodiscard]] QPair<Data *, T *> clone() const
{