summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVladimir Belyavsky <belyavskyv@gmail.com>2023-06-07 16:38:07 +0300
committerVladimir Belyavsky <belyavskyv@gmail.com>2023-06-09 09:55:25 +0300
commit6b8106383228785bf7a184d01f8c9692dd91e6c0 (patch)
tree9e3c6c01ed80303e590ef1264e8d3a35342448c3
parentc7b925757f9b55924b788a2f08d777baa0e63250 (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.h59
-rw-r--r--tests/auto/corelib/text/qstringbuilder/qstringbuilder1/stringbuilder.cpp8
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())