diff options
author | Vladimir Belyavsky <belyavskyv@gmail.com> | 2023-06-07 16:38:07 +0300 |
---|---|---|
committer | Vladimir Belyavsky <belyavskyv@gmail.com> | 2023-06-09 09:55:25 +0300 |
commit | 6b8106383228785bf7a184d01f8c9692dd91e6c0 (patch) | |
tree | 9e3c6c01ed80303e590ef1264e8d3a35342448c3 | |
parent | c7b925757f9b55924b788a2f08d777baa0e63250 (diff) |
QStringBuilder: remove QString/QByteArray specializations
This is an improved version of the previous attempt to remove
this 3c6c3eccd1f91bd1ae0a518318ef264f8eff63f5. Now we also take
into account that concatenation of 2 null stings must also produce
null string as a result.
Change-Id: I39c270552839b056247c1cce334cef4fa8f1cfdd
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r-- | src/corelib/text/qstringbuilder.h | 59 | ||||
-rw-r--r-- | tests/auto/corelib/text/qstringbuilder/qstringbuilder1/stringbuilder.cpp | 8 |
2 files changed, 23 insertions, 44 deletions
diff --git a/src/corelib/text/qstringbuilder.h b/src/corelib/text/qstringbuilder.h index 79b854cdb4..a5a6505628 100644 --- a/src/corelib/text/qstringbuilder.h +++ b/src/corelib/text/qstringbuilder.h @@ -37,6 +37,15 @@ namespace QtStringBuilder { { typedef A ConvertTo; }; template <typename T> struct ConvertToTypeHelper<T, QString> { typedef QString ConvertTo; }; + + template <typename T> using HasIsNull = decltype(std::declval<const T &>().isNull()); + template <typename T> bool isNull(const T &t) + { + if constexpr (qxp::is_detected_v<HasIsNull, T>) + return t.isNull(); + else + return false; + } } template<typename Builder, typename T> @@ -72,6 +81,12 @@ private: friend class QString; template <typename T> T convertTo() const { + if (isNull()) { + // appending two null strings must give back a null string, + // so we're special casing this one out, QTBUG-114206 + return T(); + } + const qsizetype len = QConcatenable< QStringBuilder<A, B> >::size(*this); T s(len, Qt::Uninitialized); @@ -96,49 +111,15 @@ public: qsizetype size() const { return Concatenable::size(*this); } + bool isNull() const + { + return QtStringBuilder::isNull(a) && QtStringBuilder::isNull(b); + } + const A &a; const B &b; }; -// This specialization is here for backwards compatibility: appending -// two null strings must give back a null string, so we're special -// casing this one out. -template <> -class QStringBuilder <QString, QString> : public QStringBuilderBase<QStringBuilder<QString, QString>, QString> -{ - public: - QStringBuilder(const QString &a_, const QString &b_) : a(a_), b(b_) {} - QStringBuilder(const QStringBuilder &other) : a(other.a), b(other.b) {} - - operator QString() const - { QString r(a); r += b; return r; } - - const QString &a; - const QString &b; - - private: - QStringBuilder &operator=(const QStringBuilder &) = delete; -}; - -// Ditto, but see QTBUG-114238 -template <> -class QStringBuilder <QByteArray, QByteArray> : public QStringBuilderBase<QStringBuilder<QByteArray, QByteArray>, QByteArray> -{ - public: - QStringBuilder(const QByteArray &a_, const QByteArray &b_) : a(a_), b(b_) {} - QStringBuilder(const QStringBuilder &other) : a(other.a), b(other.b) {} - - operator QByteArray() const - { QByteArray r(a); r += b; return r; } - - const QByteArray &a; - const QByteArray &b; - - private: - QStringBuilder &operator=(const QStringBuilder &) = delete; -}; - - template <> struct QConcatenable<char> : private QAbstractConcatenable { typedef char type; diff --git a/tests/auto/corelib/text/qstringbuilder/qstringbuilder1/stringbuilder.cpp b/tests/auto/corelib/text/qstringbuilder/qstringbuilder1/stringbuilder.cpp index dc2aa9eb39..a547205460 100644 --- a/tests/auto/corelib/text/qstringbuilder/qstringbuilder1/stringbuilder.cpp +++ b/tests/auto/corelib/text/qstringbuilder/qstringbuilder1/stringbuilder.cpp @@ -78,7 +78,7 @@ void checkItWorksWithFreeSpaceAtBegin(const String &chunk, const Separator &sepa } template <typename String> -void checkNullVsEmpty(const String &empty, const char *failureReason = nullptr) +void checkNullVsEmpty(const String &empty) { String a; String b; @@ -92,12 +92,10 @@ void checkNullVsEmpty(const String &empty, const char *failureReason = nullptr) QVERIFY(!d.isNull()); result = a P d; QVERIFY(result.isEmpty()); - if (failureReason) - QEXPECT_FAIL("", failureReason, Continue); QVERIFY(!result.isNull()); result = a P a P a; - QVERIFY(!result.isNull()); + QVERIFY(result.isNull()); } void runScenario() @@ -381,7 +379,7 @@ void runScenario() // null vs. empty checkNullVsEmpty(QStringLiteral("")); - checkNullVsEmpty(QByteArrayLiteral(""), "QTBUG-114238: inconsistent isEmpty/isNull between QString and QByteArray concatenation"); + checkNullVsEmpty(QByteArrayLiteral("")); checkItWorksWithFreeSpaceAtBegin(QByteArray(UTF8_LITERAL), "1234"); if (QTest::currentTestFailed()) |