From f1e15832ddcd3d90af5ddcafcb33ca6395506dfc Mon Sep 17 00:00:00 2001 From: Ahmad Samir Date: Thu, 8 Aug 2024 14:48:06 +0300 Subject: [PATCH] String Views: optimize the QByteArray/QString constructors By using {QString,QByteArray}::begin() instead of data() (for const objectst); both begin() methods, respectively [1], return nullptr for a const null {QString,QByteArray}. Whereas data() returns &_empty if QT5_NULL_STRINGS is defined. [1] QByteArray::begin() since a116b2ddfc9e91736b1ec4edda6500e9c8f5f301 QString::begin() since 287ace562ee5ddff22f7dbf4e49ae5f0520f2308 [ChangeLog][QtCore][QLatin1StringView] Creation of QLatin1StringView from QByteArray or QByteArrayView now preserves the origin's isNull() status. This matches the behavior of creating a QUtf8StringView from those types. Change-Id: Icbdfe282e315c08ca6a17201bcd32c1a3bba8bf5 Reviewed-by: Ivan Solovev (cherry picked from commit 221d8fdfb14c16472267320f859105f1a3834952) Reviewed-by: Qt Cherry-pick Bot --- src/corelib/text/qbytearrayview.h | 2 +- src/corelib/text/qlatin1stringview.h | 4 ++-- src/corelib/text/qstring.h | 4 ++-- src/corelib/text/qstringview.h | 2 +- src/corelib/text/qutf8stringview.h | 2 +- .../corelib/text/qlatin1stringview/tst_qlatin1stringview.cpp | 2 -- 6 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/corelib/text/qbytearrayview.h b/src/corelib/text/qbytearrayview.h index 5a4b7028123..34e38a36ffb 100644 --- a/src/corelib/text/qbytearrayview.h +++ b/src/corelib/text/qbytearrayview.h @@ -166,7 +166,7 @@ public: #else template = true> QByteArrayView(const ByteArray &ba) noexcept - : QByteArrayView(ba.isNull() ? nullptr : ba.data(), qsizetype(ba.size())) {} + : QByteArrayView{ba.begin(), ba.size()} {} #endif template = true> diff --git a/src/corelib/text/qlatin1stringview.h b/src/corelib/text/qlatin1stringview.h index 7232be7c9ba..c3872aaba0a 100644 --- a/src/corelib/text/qlatin1stringview.h +++ b/src/corelib/text/qlatin1stringview.h @@ -40,7 +40,7 @@ public: : QLatin1StringView(f, qsizetype(l - f)) {} constexpr QLatin1StringView(const char *s, qsizetype sz) noexcept : m_data(s), m_size(sz) {} explicit QLatin1StringView(const QByteArray &s) noexcept - : QLatin1StringView(s.constData(), s.size()) {} + : QLatin1StringView{s.begin(), s.size()} {} constexpr explicit QLatin1StringView(QByteArrayView s) noexcept : QLatin1StringView(s.constData(), s.size()) {} #else @@ -52,7 +52,7 @@ public: constexpr QLatin1String(const char *f, const char *l) : QLatin1String(f, qsizetype(l - f)) {} constexpr QLatin1String(const char *s, qsizetype sz) noexcept : m_size(sz), m_data(s) {} - explicit QLatin1String(const QByteArray &s) noexcept : m_size(s.size()), m_data(s.constData()) {} + explicit QLatin1String(const QByteArray &s) noexcept : QLatin1String(s.begin(), s.size()) {} constexpr explicit QLatin1String(QByteArrayView s) noexcept : m_size(s.size()), m_data(s.data()) {} #endif // !Q_L1S_VIEW_IS_PRIMARY diff --git a/src/corelib/text/qstring.h b/src/corelib/text/qstring.h index f4ebb66d14f..0e0aef82670 100644 --- a/src/corelib/text/qstring.h +++ b/src/corelib/text/qstring.h @@ -1213,9 +1213,9 @@ template // QAnyStringView::QAnyStringView(const QByteArray &str) noexcept - : QAnyStringView{str.isNull() ? nullptr : str.data(), str.size()} {} + : QAnyStringView{str.begin(), str.size()} {} QAnyStringView::QAnyStringView(const QString &str) noexcept - : QAnyStringView{str.isNull() ? nullptr : str.data(), str.size()} {} + : QAnyStringView{str.begin(), str.size()} {} QString QAnyStringView::toString() const { return QtPrivate::convertToQString(*this); } diff --git a/src/corelib/text/qstringview.h b/src/corelib/text/qstringview.h index 2ad245caa38..9578363806f 100644 --- a/src/corelib/text/qstringview.h +++ b/src/corelib/text/qstringview.h @@ -160,7 +160,7 @@ public: #else template = true> QStringView(const String &str) noexcept - : QStringView(str.isNull() ? nullptr : str.data(), qsizetype(str.size())) {} + : QStringView{str.begin(), str.size()} {} #endif template = true> diff --git a/src/corelib/text/qutf8stringview.h b/src/corelib/text/qutf8stringview.h index 87a974414ca..872ff759cc4 100644 --- a/src/corelib/text/qutf8stringview.h +++ b/src/corelib/text/qutf8stringview.h @@ -181,7 +181,7 @@ public: #else template = true> QBasicUtf8StringView(const String &str) noexcept - : QBasicUtf8StringView(str.isNull() ? nullptr : str.data(), qsizetype(str.size())) {} + : QBasicUtf8StringView{str.begin(), str.size()} {} #endif template = true> diff --git a/tests/auto/corelib/text/qlatin1stringview/tst_qlatin1stringview.cpp b/tests/auto/corelib/text/qlatin1stringview/tst_qlatin1stringview.cpp index e719c817314..5f22a7fb1d2 100644 --- a/tests/auto/corelib/text/qlatin1stringview/tst_qlatin1stringview.cpp +++ b/tests/auto/corelib/text/qlatin1stringview/tst_qlatin1stringview.cpp @@ -272,12 +272,10 @@ void tst_QLatin1StringView::nullString() QVERIFY(null.isNull()); QLatin1StringView l1(null); - QEXPECT_FAIL("", "null QByteArrays become non-null QLatin1Strings...", Continue); QCOMPARE(static_cast(l1.data()), static_cast(nullptr)); QCOMPARE(l1.size(), 0); QString s = l1; - QEXPECT_FAIL("", "null QByteArrays become non-null QLatin1Strings become non-null QStrings...", Continue); QVERIFY(s.isNull()); } }