diff options
Diffstat (limited to 'src/corelib/tools/qarraydatapointer.h')
-rw-r--r-- | src/corelib/tools/qarraydatapointer.h | 19 |
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 { |