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 <QByteArray>
#include <QString> #include <QString>
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
#include <QStringEncoder>
#endif
#include <algorithm> #include <algorithm>
#include <cmath> #include <cmath>
@@ -135,6 +138,10 @@ public:
: BasicSmallString(BasicSmallString::fromQString(qString)) : BasicSmallString(BasicSmallString::fromQString(qString))
{} {}
BasicSmallString(const QStringView qStringView)
: BasicSmallString(BasicSmallString::fromQStringView(qStringView))
{}
BasicSmallString(const QByteArray &qByteArray) BasicSmallString(const QByteArray &qByteArray)
: BasicSmallString(qByteArray.constData(), qByteArray.size()) : BasicSmallString(qByteArray.constData(), qByteArray.size())
{} {}
@@ -353,16 +360,23 @@ public:
return end(); return end();
} }
static static BasicSmallString fromQString(const QString &qString)
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 static BasicSmallString fromQStringView(QStringView qStringView)
BasicSmallString fromQByteArray(const QByteArray &utf8ByteArray) {
BasicSmallString string;
string.append(qStringView);
return string;
}
static BasicSmallString fromQByteArray(const QByteArray &utf8ByteArray)
{ {
return BasicSmallString(utf8ByteArray.constData(), uint(utf8ByteArray.size())); return BasicSmallString(utf8ByteArray.constData(), uint(utf8ByteArray.size()));
} }
@@ -467,6 +481,24 @@ public:
setSize(newSize); 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) BasicSmallString &operator+=(SmallStringView string)
{ {
append(string); append(string);
@@ -474,6 +506,13 @@ public:
return *this; return *this;
} }
BasicSmallString &operator+=(QStringView string)
{
append(string);
return *this;
}
BasicSmallString &operator+=(std::initializer_list<SmallStringView> list) BasicSmallString &operator+=(std::initializer_list<SmallStringView> list)
{ {
appendInitializerList(list, size()); appendInitializerList(list, size());

View File

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