diff --git a/src/libs/utils/smallstring.h b/src/libs/utils/smallstring.h index 455634f19a7..f1a95d3a78d 100644 --- a/src/libs/utils/smallstring.h +++ b/src/libs/utils/smallstring.h @@ -34,6 +34,9 @@ #include #include +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +#include +#endif #include #include @@ -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(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(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 list) { appendInitializerList(list, size()); diff --git a/tests/unit/unittest/smallstring-test.cpp b/tests/unit/unittest/smallstring-test.cpp index b9c6347f2eb..1d087e050cc 100644 --- a/tests/unit/unittest/smallstring-test.cpp +++ b/tests/unit/unittest/smallstring-test.cpp @@ -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");