Utils: Improve string conversion for Qt6

Skip the creation auf a QByteArray. Use QStringEncoder instead.

Change-Id: I3d2297b1fef27acb2136a64587c5af9099d92aa6
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Marco Bubke
2021-09-20 18:02:47 +02:00
parent e79b9050eb
commit 6587feb3d8
2 changed files with 95 additions and 7 deletions

View File

@@ -34,6 +34,9 @@
#include <QByteArray>
#include <QString>
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
#include <QStringEncoder>
#endif
#include <algorithm>
#include <cmath>
@@ -135,6 +138,10 @@ public:
: BasicSmallString(BasicSmallString::fromQString(qString))
{}
BasicSmallString(const QStringView qStringView)
: BasicSmallString(BasicSmallString::fromQStringView(qStringView))
{}
BasicSmallString(const QByteArray &qByteArray)
: BasicSmallString(qByteArray.constData(), qByteArray.size())
{}
@@ -353,16 +360,23 @@ public:
return end();
}
static
BasicSmallString fromQString(const QString &qString)
static BasicSmallString fromQString(const QString &qString)
{
const QByteArray &utf8ByteArray = qString.toUtf8();
BasicSmallString string;
string.append(qString);
return BasicSmallString(utf8ByteArray.constData(), uint(utf8ByteArray.size()));
return string;
}
static
BasicSmallString fromQByteArray(const QByteArray &utf8ByteArray)
static BasicSmallString fromQStringView(QStringView qStringView)
{
BasicSmallString string;
string.append(qStringView);
return string;
}
static BasicSmallString fromQByteArray(const QByteArray &utf8ByteArray)
{
return BasicSmallString(utf8ByteArray.constData(), uint(utf8ByteArray.size()));
}
@@ -467,6 +481,24 @@ public:
setSize(newSize);
}
void append(QStringView string)
{
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QStringEncoder encoder{QStringEncoder::Utf8};
size_type oldSize = size();
size_type newSize = oldSize + static_cast<size_type>(encoder.requiredSpace(string.size()));
reserve(optimalCapacity(newSize));
auto newEnd = encoder.appendToBuffer(data() + size(), string);
*newEnd = 0;
setSize(newEnd - data());
#else
QByteArray array = string.toUtf8();
append(SmallStringView{array.data(), static_cast<size_type>(array.size())});
#endif
}
BasicSmallString &operator+=(SmallStringView string)
{
append(string);
@@ -474,6 +506,13 @@ public:
return *this;
}
BasicSmallString &operator+=(QStringView string)
{
append(string);
return *this;
}
BasicSmallString &operator+=(std::initializer_list<SmallStringView> list)
{
appendInitializerList(list, size());

View File

@@ -825,6 +825,15 @@ TEST(SmallString, AppendNullSmallString)
ASSERT_THAT(text, SmallString("text"));
}
TEST(SmallString, AppendNullQString)
{
SmallString text("text");
text += QString();
ASSERT_THAT(text, SmallString("text"));
}
TEST(SmallString, AppendEmptySmallString)
{
SmallString text("text");
@@ -834,6 +843,15 @@ TEST(SmallString, AppendEmptySmallString)
ASSERT_THAT(text, SmallString("text"));
}
TEST(SmallString, AppendEmptyQString)
{
SmallString text("text");
text += QString("");
ASSERT_THAT(text, SmallString("text"));
}
TEST(SmallString, AppendShortSmallString)
{
SmallString text("some ");
@@ -843,6 +861,15 @@ TEST(SmallString, AppendShortSmallString)
ASSERT_THAT(text, SmallString("some text"));
}
TEST(SmallString, AppendShortQString)
{
SmallString text("some ");
text += QString("text");
ASSERT_THAT(text, SmallString("some text"));
}
TEST(SmallString, AppendLongSmallStringToShortSmallString)
{
SmallString text("some ");
@@ -852,14 +879,36 @@ TEST(SmallString, AppendLongSmallStringToShortSmallString)
ASSERT_THAT(text, SmallString("some very very very very very long string"));
}
TEST(SmallString, AppendLongQStringToShortSmallString)
{
SmallString text("some ");
text += QString("very very very very very long string");
ASSERT_THAT(text, SmallString("some very very very very very long string"));
}
TEST(SmallString, AppendLongSmallString)
{
SmallString longText("some very very very very very very very very very very very long string");
longText+= SmallString(" text");
longText += SmallString(" text");
ASSERT_THAT(longText, SmallString("some very very very very very very very very very very very long string text"));
}
TEST(SmallString, AppendLongQString)
{
SmallString longText("some very very very very very very very very very very very long string");
longText += QString(" text");
ASSERT_THAT(
longText,
SmallString(
"some very very very very very very very very very very very long string text"));
}
TEST(SmallString, AppendInitializerList)
{
SmallString text("some text");