From fae4f80ecc0974257c96c64221f245bdae6178f5 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Thu, 27 Aug 2020 09:19:21 +0200 Subject: [PATCH] Make QStringMatcher ready for Qt 6 Use qsizetype for string indices everywhere. Clean up the data structures and remove some Qt 3 or Qt 4 left-overs. This reduces the size of the QStringMatcher from 1056 to 288 bytes. Change-Id: Icc351da8e3aad10a6c940196f52c39f8d2f5bf80 Reviewed-by: Fabian Kosmale --- src/corelib/text/qstringmatcher.cpp | 49 ++++++++++------------------- src/corelib/text/qstringmatcher.h | 30 +++++++++--------- 2 files changed, 31 insertions(+), 48 deletions(-) diff --git a/src/corelib/text/qstringmatcher.cpp b/src/corelib/text/qstringmatcher.cpp index 449f475e662..2fba8daa880 100644 --- a/src/corelib/text/qstringmatcher.cpp +++ b/src/corelib/text/qstringmatcher.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Copyright (C) 2019 Mail.ru Group. ** Contact: https://www.qt.io/licensing/ ** @@ -46,7 +46,7 @@ static void bm_init_skiptable(QStringView needle, uchar *skiptable, Qt::CaseSens { const char16_t *uc = needle.utf16(); const qsizetype len = needle.size(); - int l = int(qMin(len, qsizetype(255))); + qsizetype l = qMin(len, qsizetype(255)); memset(skiptable, l, 256 * sizeof(uchar)); uc += len - l; if (cs == Qt::CaseSensitive) { @@ -130,7 +130,7 @@ static inline qsizetype bm_find(QStringView haystack, qsizetype index, QStringVi void QStringMatcher::updateSkipTable() { - bm_init_skiptable(p.sv, p.q_skiptable, q_cs); + bm_init_skiptable(q_sv, q_skiptable, q_cs); } /*! @@ -156,15 +156,11 @@ void QStringMatcher::updateSkipTable() \sa QString, QByteArrayMatcher, QRegularExpression */ -/*! +/*! \fn QStringMatcher::QStringMatcher() + Constructs an empty string matcher that won't match anything. Call setPattern() to give it a pattern to match. */ -QStringMatcher::QStringMatcher() - : d_ptr(nullptr), q_cs(Qt::CaseSensitive) -{ - memset(q_data, 0, sizeof(q_data)); -} /*! Constructs a string matcher that will search for \a pattern, with @@ -173,23 +169,19 @@ QStringMatcher::QStringMatcher() Call indexIn() to perform a search. */ QStringMatcher::QStringMatcher(const QString &pattern, Qt::CaseSensitivity cs) - : d_ptr(nullptr), q_pattern(pattern), q_cs(cs) + : d_ptr(nullptr), q_cs(cs), q_pattern(pattern) { - p.sv = q_pattern; + q_sv = q_pattern; updateSkipTable(); } /*! - \fn QStringMatcher::QStringMatcher(const QChar *uc, int length, Qt::CaseSensitivity cs) + \fn QStringMatcher::QStringMatcher(const QChar *uc, qsizetype length, Qt::CaseSensitivity cs) \since 4.5 Constructs a string matcher that will search for the pattern referred to by \a uc with the given \a length and case sensitivity specified by \a cs. */ -QStringMatcher::QStringMatcher(const QChar *uc, int len, Qt::CaseSensitivity cs) - : QStringMatcher(QStringView(uc, len), cs) -{ -} /*! \fn QStringMatcher::QStringMatcher(QStringView pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive) @@ -201,9 +193,8 @@ QStringMatcher::QStringMatcher(const QChar *uc, int len, Qt::CaseSensitivity cs) Call indexIn() to perform a search. */ QStringMatcher::QStringMatcher(QStringView str, Qt::CaseSensitivity cs) - : d_ptr(nullptr), q_cs(cs) + : d_ptr(nullptr), q_cs(cs), q_sv(str) { - p.sv = str; updateSkipTable(); } /*! @@ -231,7 +222,8 @@ QStringMatcher &QStringMatcher::operator=(const QStringMatcher &other) if (this != &other) { q_pattern = other.q_pattern; q_cs = other.q_cs; - memcpy(q_data, other.q_data, sizeof(q_data)); + q_sv = other.q_sv; + memcpy(q_skiptable, other.q_skiptable, sizeof(q_skiptable)); } return *this; } @@ -245,7 +237,7 @@ QStringMatcher &QStringMatcher::operator=(const QStringMatcher &other) void QStringMatcher::setPattern(const QString &pattern) { q_pattern = pattern; - p.sv = q_pattern; + q_sv = q_pattern; updateSkipTable(); } @@ -262,7 +254,7 @@ QString QStringMatcher::pattern() const { if (!q_pattern.isEmpty()) return q_pattern; - return p.sv.toString(); + return q_sv.toString(); } /*! @@ -279,7 +271,8 @@ void QStringMatcher::setCaseSensitivity(Qt::CaseSensitivity cs) updateSkipTable(); } -/*! +/*! \fn qsizetype QStringMatcher::indexIn(const QString &str, qsizetype from) const + Searches the string \a str from character position \a from (default 0, i.e. from the first character), for the string pattern() that was set in the constructor or in the most recent @@ -288,12 +281,8 @@ void QStringMatcher::setCaseSensitivity(Qt::CaseSensitivity cs) \sa setPattern(), setCaseSensitivity() */ -int QStringMatcher::indexIn(const QString &str, qsizetype from) const -{ - return int(indexIn(QStringView(str), from)); -} -/*! +/*! \fn qsizetype QStringMatcher::indexIn(const QChar *str, qsizetype length, qsizetype from) const \since 4.5 Searches the string starting at \a str (of length \a length) from @@ -305,10 +294,6 @@ int QStringMatcher::indexIn(const QString &str, qsizetype from) const \sa setPattern(), setCaseSensitivity() */ -int QStringMatcher::indexIn(const QChar *str, qsizetype length, qsizetype from) const -{ - return int(indexIn(QStringView(str, length), from)); -} /*! \since 5.14 @@ -325,7 +310,7 @@ qsizetype QStringMatcher::indexIn(QStringView str, qsizetype from) const { if (from < 0) from = 0; - return bm_find(str, from, p.sv, p.q_skiptable, q_cs); + return bm_find(str, from, q_sv, q_skiptable, q_cs); } /*! diff --git a/src/corelib/text/qstringmatcher.h b/src/corelib/text/qstringmatcher.h index 104d4879b00..39cb8771519 100644 --- a/src/corelib/text/qstringmatcher.h +++ b/src/corelib/text/qstringmatcher.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Copyright (C) 2019 Mail.ru Group. ** Contact: https://www.qt.io/licensing/ ** @@ -53,11 +53,13 @@ class Q_CORE_EXPORT QStringMatcher { void updateSkipTable(); public: - QStringMatcher(); + QStringMatcher() = default; explicit QStringMatcher(const QString &pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive); - QStringMatcher(const QChar *uc, int len, - Qt::CaseSensitivity cs = Qt::CaseSensitive); + QStringMatcher(const QChar *uc, qsizetype len, + Qt::CaseSensitivity cs = Qt::CaseSensitive) + : QStringMatcher(QStringView(uc, len), cs) + {} QStringMatcher(QStringView pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive); QStringMatcher(const QStringMatcher &other); @@ -68,24 +70,20 @@ public: void setPattern(const QString &pattern); void setCaseSensitivity(Qt::CaseSensitivity cs); - int indexIn(const QString &str, qsizetype from = 0) const; - int indexIn(const QChar *str, qsizetype length, qsizetype from = 0) const; + qsizetype indexIn(const QString &str, qsizetype from = 0) const + { return indexIn(QStringView(str), from); } + qsizetype indexIn(const QChar *str, qsizetype length, qsizetype from = 0) const + { return indexIn(QStringView(str, length), from); } qsizetype indexIn(QStringView str, qsizetype from = 0) const; QString pattern() const; inline Qt::CaseSensitivity caseSensitivity() const { return q_cs; } private: - QStringMatcherPrivate *d_ptr; + QStringMatcherPrivate *d_ptr = nullptr; + Qt::CaseSensitivity q_cs = Qt::CaseSensitive; QString q_pattern; - Qt::CaseSensitivity q_cs; - struct Data { - uchar q_skiptable[256]; - QStringView sv; - }; - union { - uint q_data[256]; - Data p; - }; + QStringView q_sv; + uchar q_skiptable[256] = {}; }; QT_END_NAMESPACE