summaryrefslogtreecommitdiffstats
path: root/src/corelib/text/qstring.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2020-09-23 19:32:24 +0200
committerLars Knoll <lars.knoll@qt.io>2020-10-07 14:57:51 +0200
commit8a7b74f6e71d6b8264f365148bf5a04db4038617 (patch)
treebe16b5d1fb3299f75fa9641f5c113db4ed3791e0 /src/corelib/text/qstring.cpp
parent3807559d3779d2d6df4fb9180d2c4093ea1706ae (diff)
Optimize equality operators for string classes
Using compare() for those operators is not a good idea, as we can't shortcut comparisons if the string sizes are different. This alone made our HTML parser in QtGui around 15% slower. Don't go through QAnyStringView to implement compare() for QUtf8StringView, use QtPrivate::compareStrings() directly instead. Task-number: QTBUG-86354 Change-Id: I04869c29c9918161990dc1baf8e943b3a264ff3c Reviewed-by: Karsten Heimrich <karsten.heimrich@qt.io>
Diffstat (limited to 'src/corelib/text/qstring.cpp')
-rw-r--r--src/corelib/text/qstring.cpp57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp
index 2838e513f1..71e51ab0fc 100644
--- a/src/corelib/text/qstring.cpp
+++ b/src/corelib/text/qstring.cpp
@@ -1325,6 +1325,63 @@ int QAnyStringView::compare(QAnyStringView lhs, QAnyStringView rhs, Qt::CaseSens
});
}
+bool QtPrivate::equalStrings(QStringView lhs, QStringView rhs) noexcept
+{
+ return ucstrcmp(lhs.begin(), lhs.size(), rhs.begin(), rhs.size()) == 0;
+}
+
+bool QtPrivate::equalStrings(QStringView lhs, QLatin1String rhs) noexcept
+{
+ return ucstrcmp(lhs.begin(), lhs.size(), rhs.begin(), rhs.size()) == 0;
+}
+
+bool QtPrivate::equalStrings(QLatin1String lhs, QStringView rhs) noexcept
+{
+ return QtPrivate::equalStrings(rhs, lhs);
+}
+
+bool QtPrivate::equalStrings(QLatin1String lhs, QLatin1String rhs) noexcept
+{
+ return lhs.size() == rhs.size() && (!lhs.size() || qstrncmp(lhs.data(), rhs.data(), lhs.size()) == 0);
+}
+
+bool QtPrivate::equalStrings(QBasicUtf8StringView<false> lhs, QStringView rhs) noexcept
+{
+ return QUtf8::compareUtf8(lhs, rhs) == 0;
+}
+
+bool QtPrivate::equalStrings(QStringView lhs, QBasicUtf8StringView<false> rhs) noexcept
+{
+ return QtPrivate::equalStrings(rhs, lhs);
+}
+
+bool QtPrivate::equalStrings(QLatin1String lhs, QBasicUtf8StringView<false> rhs) noexcept
+{
+ QString r = rhs.toString();
+ return QtPrivate::equalStrings(lhs, r); // ### optimize!
+}
+
+bool QtPrivate::equalStrings(QBasicUtf8StringView<false> lhs, QLatin1String rhs) noexcept
+{
+ return QtPrivate::equalStrings(rhs, lhs);
+}
+
+bool QtPrivate::equalStrings(QBasicUtf8StringView<false> lhs, QBasicUtf8StringView<false> rhs) noexcept
+{
+ return lhs.size() == rhs.size() && (!lhs.size() || qstrncmp(lhs.data(), rhs.data(), lhs.size()) == 0);
+}
+
+bool QAnyStringView::equal(QAnyStringView lhs, QAnyStringView rhs) noexcept
+{
+ if (lhs.size() != rhs.size() && lhs.isUtf8() == rhs.isUtf8())
+ return false;
+ return lhs.visit([rhs](auto lhs) {
+ return rhs.visit([lhs](auto rhs) {
+ return QtPrivate::equalStrings(lhs, rhs);
+ });
+ });
+}
+
/*!
\relates QStringView
\internal