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>
bb10
Mårten Nordheim 2020-10-23 12:00:56 +02:00
parent 2c4874be40
commit 205629bb62
3 changed files with 20 additions and 3 deletions

View File

@ -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));
}

View File

@ -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); }

View File

@ -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()