diff options
author | Andrei Golubev <andrei.golubev@qt.io> | 2020-08-27 22:10:53 +0200 |
---|---|---|
committer | Andrei Golubev <andrei.golubev@qt.io> | 2020-09-10 17:31:23 +0200 |
commit | ec7e680c5007345c34542a57bd2ac344fb112063 (patch) | |
tree | d246b9bb323acaf844a650dae6929d27fa68f386 /src/corelib/text/qstring.h | |
parent | 04d78df344c341b6a13d4cbe0162ed20e828c88a (diff) |
Remove '\0' space reservation logic in QString
Changed QString to use implicit element reserved by QArrayData
Task-number: QTBUG-84320
Change-Id: If517500b3f0e71bb8d2989c64815a634aa8dd554
Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/corelib/text/qstring.h')
-rw-r--r-- | src/corelib/text/qstring.h | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/src/corelib/text/qstring.h b/src/corelib/text/qstring.h index d86d659e75..62826d67e2 100644 --- a/src/corelib/text/qstring.h +++ b/src/corelib/text/qstring.h @@ -1094,15 +1094,14 @@ inline QChar *QString::data() inline const QChar *QString::constData() const { return data(); } inline void QString::detach() -{ if (d->needsDetach()) reallocData(d.size + 1u, d->detachFlags()); } +{ if (d->needsDetach()) reallocData(d.size, d->detachFlags()); } inline bool QString::isDetached() const { return !d->isShared(); } inline void QString::clear() { if (!isNull()) *this = QString(); } inline QString::QString(const QString &other) noexcept : d(other.d) { } -inline qsizetype QString::capacity() const -{ const auto realCapacity = d->constAllocatedCapacity(); return realCapacity ? int(realCapacity) - 1 : 0; } +inline qsizetype QString::capacity() const { return qsizetype(d->constAllocatedCapacity()); } inline QString &QString::setNum(short n, int base) { return setNum(qlonglong(n), base); } inline QString &QString::setNum(ushort n, int base) @@ -1167,22 +1166,22 @@ inline QString::~QString() {} inline void QString::reserve(qsizetype asize) { - if (d->needsDetach() || asize >= capacity() - d.freeSpaceAtBegin()) - reallocData(uint(qMax(asize, size())) + 1u, d->detachFlags()); - - // we're not shared anymore, for sure - d->setFlag(Data::CapacityReserved); + if (d->needsDetach() || asize >= capacity() - d.freeSpaceAtBegin()) { + reallocData(size_t(qMax(asize, size())), d->detachFlags() | Data::CapacityReserved); + } else { + d->setFlag(Data::CapacityReserved); + } } inline void QString::squeeze() { if ((d->flags() & Data::CapacityReserved) == 0) return; - if (d->needsDetach() || int(d.size) < capacity()) - reallocData(uint(d.size) + 1u, d->detachFlags()); - - // we're not shared anymore, for sure - d->clearFlag(Data::CapacityReserved); + if (d->needsDetach() || int(d.size) < capacity()) { + reallocData(size_t(d.size), d->detachFlags() & ~Data::CapacityReserved); + } else { + d->clearFlag(Data::CapacityReserved); + } } inline QString &QString::setUtf16(const ushort *autf16, qsizetype asize) |