diff options
author | Mårten Nordheim <marten.nordheim@qt.io> | 2020-10-23 12:00:56 +0200 |
---|---|---|
committer | Mårten Nordheim <marten.nordheim@qt.io> | 2020-10-28 08:48:23 +0200 |
commit | 205629bb6240a4aae52aa62f6f6c9c302148efd2 (patch) | |
tree | 16b18f48b9ea58b284a1ae46b1c96bd5ef41bcbc | |
parent | 2c4874be40aa40b698315cac0ad768e5c650a740 (diff) |
QByteArray: make (ap|pre)pend(const QByteArray &) consider reserved
Append was previously optimized for lhs being empty but it should've
also taken into account if space had been reserved.
Apply the same optimization to prepend while we're at it.
Change-Id: I5e5d33a3189b9ad88d45e858a2ac412cbc294f79
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r-- | src/corelib/text/qbytearray.cpp | 8 | ||||
-rw-r--r-- | src/corelib/text/qbytearray.h | 3 | ||||
-rw-r--r-- | tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp | 12 |
3 files changed, 20 insertions, 3 deletions
diff --git a/src/corelib/text/qbytearray.cpp b/src/corelib/text/qbytearray.cpp index 459e00887d..1ff61ed11a 100644 --- a/src/corelib/text/qbytearray.cpp +++ b/src/corelib/text/qbytearray.cpp @@ -1784,6 +1784,12 @@ QByteArray QByteArray::nulTerminated() const Prepends \a ba to this byte array. */ +QByteArray &QByteArray::prepend(const QByteArray &ba) +{ + if (size() == 0 && ba.size() > d.constAllocatedCapacity() && ba.d.isMutable()) + return (*this = ba); + return prepend(QByteArrayView(ba)); +} /*! \fn QByteArray &QByteArray::prepend(const char *str) @@ -1842,7 +1848,7 @@ QByteArray QByteArray::nulTerminated() const QByteArray &QByteArray::append(const QByteArray &ba) { - if (size() == 0 && ba.d.isMutable()) + if (size() == 0 && ba.size() > d.constAllocatedCapacity() && ba.d.isMutable()) return (*this = ba); return append(QByteArrayView(ba)); } diff --git a/src/corelib/text/qbytearray.h b/src/corelib/text/qbytearray.h index 60f1bd01f5..c2d65e2c55 100644 --- a/src/corelib/text/qbytearray.h +++ b/src/corelib/text/qbytearray.h @@ -283,8 +283,7 @@ public: { return insert(0, QByteArrayView(s, qsizetype(qstrlen(s)))); } QByteArray &prepend(const char *s, qsizetype len) { return insert(0, QByteArrayView(s, len)); } - QByteArray &prepend(const QByteArray &a) - { return insert(0, a); } + QByteArray &prepend(const QByteArray &a); QByteArray &prepend(QByteArrayView a) { return insert(0, a); } diff --git a/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp b/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp index 2f0f5654ca..cf70a7bbaa 100644 --- a/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp +++ b/tests/auto/corelib/text/qbytearray/tst_qbytearray.cpp @@ -838,6 +838,12 @@ void tst_QByteArray::prepend() QCOMPARE(ba.prepend(-1, 'x'), QByteArray("321foo")); QCOMPARE(ba.prepend(3, 'x'), QByteArray("xxx321foo")); QCOMPARE(ba.prepend("\0 ", 2), QByteArray::fromRawData("\0 xxx321foo", 11)); + + QByteArray tenChars; + tenChars.reserve(10); + QByteArray twoChars("ab"); + tenChars.prepend(twoChars); + QCOMPARE(tenChars.capacity(), 10); } void tst_QByteArray::prependExtended_data() @@ -882,6 +888,12 @@ void tst_QByteArray::append() QCOMPARE(ba.append("\0"), QByteArray("foo123xxx")); QCOMPARE(ba.append("\0", 1), QByteArray::fromRawData("foo123xxx\0", 10)); QCOMPARE(ba.size(), 10); + + QByteArray tenChars; + tenChars.reserve(10); + QByteArray twoChars("ab"); + tenChars.append(twoChars); + QCOMPARE(tenChars.capacity(), 10); } void tst_QByteArray::appendExtended_data() |