From b47cf3fe2ddb2fee27d1d30a532f726785c13fd0 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Wed, 26 Feb 2020 16:47:31 +0100 Subject: De-inline Qt::SplitBehavior splitters of QString and QStringRef Convert the QString::SplitBehavior variants to call them, rather than the other way round and convert the internal infrastructure to use Qt::SplitBehavior, ready to deprecate the QString::SplitBehavior versions without generating intenal warnings. Task-number: QTBUG-81853 Change-Id: Ia6b78881c3d0e30a7bbd4dfd00cc15a407f448a2 Reviewed-by: Lars Knoll --- src/corelib/text/qstring.cpp | 150 ++++++++++++++++++++++++++++++++++------- src/corelib/text/qstring.h | 38 +++++------ src/corelib/text/qstringlist.h | 17 ----- src/corelib/tools/qvector.h | 18 ----- 4 files changed, 142 insertions(+), 81 deletions(-) (limited to 'src') diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp index a4a79e8318..5c76d3e42b 100644 --- a/src/corelib/text/qstring.cpp +++ b/src/corelib/text/qstring.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Copyright (C) 2018 Intel Corporation. ** Copyright (C) 2019 Mail.ru Group. ** Contact: https://www.qt.io/licensing/ @@ -7725,23 +7725,28 @@ QString QString::number(double n, char f, int prec) namespace { template static ResultList splitString(const StringSource &source, const QChar *sep, - QString::SplitBehavior behavior, Qt::CaseSensitivity cs, const int separatorSize) + Qt::SplitBehavior behavior, Qt::CaseSensitivity cs, const int separatorSize) { ResultList list; typename StringSource::size_type start = 0; typename StringSource::size_type end; typename StringSource::size_type extra = 0; while ((end = QtPrivate::findString(QStringView(source.constData(), source.size()), start + extra, QStringView(sep, separatorSize), cs)) != -1) { - if (start != end || behavior == QString::KeepEmptyParts) + if (start != end || behavior == Qt::KeepEmptyParts) list.append(source.mid(start, end - start)); start = end + separatorSize; extra = (separatorSize == 0 ? 1 : 0); } - if (start != source.size() || behavior == QString::KeepEmptyParts) + if (start != source.size() || behavior == Qt::KeepEmptyParts) list.append(source.mid(start, -1)); return list; } +Qt::SplitBehavior mapSplitBehavior(QString::SplitBehavior sb) +{ + return sb & QString::SkipEmptyParts ? Qt::SkipEmptyParts : Qt::KeepEmptyParts; +} + } // namespace /*! @@ -7771,12 +7776,22 @@ static ResultList splitString(const StringSource &source, const QChar *sep, \snippet qstring/main.cpp 62-slashes \sa QStringList::join(), section() + + \since 5.14 */ -QStringList QString::split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const +QStringList QString::split(const QString &sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const { return splitString(*this, sep.constData(), behavior, cs, sep.size()); } +/*! + \overload +*/ +QStringList QString::split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const +{ + return split(sep, mapSplitBehavior(behavior), cs); +} + /*! Splits the string into substring references wherever \a sep occurs, and returns the list of those strings. @@ -7787,28 +7802,59 @@ QStringList QString::split(const QString &sep, SplitBehavior behavior, Qt::CaseS \note All references are valid as long this string is alive. Destroying this string will cause all references to be dangling pointers. - \since 5.4 + \since 5.14 \sa QStringRef split() */ +QVector QString::splitRef(const QString &sep, Qt::SplitBehavior behavior, + Qt::CaseSensitivity cs) const +{ + return splitString>(QStringRef(this), sep.constData(), behavior, + cs, sep.size()); +} + +/*! + \overload + \since 5.4 +*/ QVector QString::splitRef(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const { - return splitString >(QStringRef(this), sep.constData(), behavior, cs, sep.size()); + return splitRef(sep, mapSplitBehavior(behavior), cs); } + /*! \overload + \since 5.14 */ -QStringList QString::split(QChar sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const +QStringList QString::split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const { return splitString(*this, &sep, behavior, cs, 1); } +/*! + \overload +*/ +QStringList QString::split(QChar sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const +{ + return split(sep, mapSplitBehavior(behavior), cs); +} + +/*! + \overload + \since 5.14 +*/ +QVector QString::splitRef(QChar sep, Qt::SplitBehavior behavior, + Qt::CaseSensitivity cs) const +{ + return splitString >(QStringRef(this), &sep, behavior, cs, 1); +} + /*! \overload \since 5.4 */ QVector QString::splitRef(QChar sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const { - return splitString >(QStringRef(this), &sep, behavior, cs, 1); + return splitRef(sep, mapSplitBehavior(behavior), cs); } /*! @@ -7821,11 +7867,29 @@ QVector QString::splitRef(QChar sep, SplitBehavior behavior, Qt::Cas \note All references are valid as long this string is alive. Destroying this string will cause all references to be dangling pointers. + \since 5.14 +*/ +QVector QStringRef::split(const QString &sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const +{ + return splitString >(*this, sep.constData(), behavior, cs, sep.size()); +} + +/*! + \overload \since 5.4 */ QVector QStringRef::split(const QString &sep, QString::SplitBehavior behavior, Qt::CaseSensitivity cs) const { - return splitString >(*this, sep.constData(), behavior, cs, sep.size()); + return split(sep, mapSplitBehavior(behavior), cs); +} + +/*! + \overload + \since 5.14 +*/ +QVector QStringRef::split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const +{ + return splitString >(*this, &sep, behavior, cs, 1); } /*! @@ -7834,13 +7898,13 @@ QVector QStringRef::split(const QString &sep, QString::SplitBehavior */ QVector QStringRef::split(QChar sep, QString::SplitBehavior behavior, Qt::CaseSensitivity cs) const { - return splitString >(*this, &sep, behavior, cs, 1); + return split(sep, mapSplitBehavior(behavior), cs); } #ifndef QT_NO_REGEXP namespace { template -static ResultList splitString(const QString &source, MidMethod mid, const QRegExp &rx, QString::SplitBehavior behavior) +static ResultList splitString(const QString &source, MidMethod mid, const QRegExp &rx, Qt::SplitBehavior behavior) { QRegExp rx2(rx); ResultList list; @@ -7849,12 +7913,12 @@ static ResultList splitString(const QString &source, MidMethod mid, const QRegEx int end; while ((end = rx2.indexIn(source, start + extra)) != -1) { int matchedLen = rx2.matchedLength(); - if (start != end || behavior == QString::KeepEmptyParts) + if (start != end || behavior == Qt::KeepEmptyParts) list.append((source.*mid)(start, end - start)); start = end + matchedLen; extra = (matchedLen == 0) ? 1 : 0; } - if (start != source.size() || behavior == QString::KeepEmptyParts) + if (start != source.size() || behavior == Qt::KeepEmptyParts) list.append((source.*mid)(start, -1)); return list; } @@ -7862,6 +7926,7 @@ static ResultList splitString(const QString &source, MidMethod mid, const QRegEx /*! \overload + \since 5.14 Splits the string into substrings wherever the regular expression \a rx matches, and returns the list of those strings. If \a rx @@ -7886,14 +7951,22 @@ static ResultList splitString(const QString &source, MidMethod mid, const QRegEx \sa QStringList::join(), section() */ -QStringList QString::split(const QRegExp &rx, SplitBehavior behavior) const +QStringList QString::split(const QRegExp &rx, Qt::SplitBehavior behavior) const { return splitString(*this, &QString::mid, rx, behavior); } /*! \overload - \since 5.4 +*/ +QStringList QString::split(const QRegExp &rx, SplitBehavior behavior) const +{ + return split(rx, mapSplitBehavior(behavior)); +} + +/*! + \overload + \since 5.14 Splits the string into substring references wherever the regular expression \a rx matches, and returns the list of those strings. If \a rx @@ -7905,17 +7978,26 @@ QStringList QString::split(const QRegExp &rx, SplitBehavior behavior) const \sa QStringRef split() */ -QVector QString::splitRef(const QRegExp &rx, SplitBehavior behavior) const +QVector QString::splitRef(const QRegExp &rx, Qt::SplitBehavior behavior) const { return splitString >(*this, &QString::midRef, rx, behavior); } -#endif + +/*! + \overload + \since 5.4 +*/ +QVector QString::splitRef(const QRegExp &rx, SplitBehavior behavior) const +{ + return splitRef(rx, mapSplitBehavior(behavior)); +} +#endif // QT_NO_REGEXP #if QT_CONFIG(regularexpression) namespace { template static ResultList splitString(const QString &source, MidMethod mid, const QRegularExpression &re, - QString::SplitBehavior behavior) + Qt::SplitBehavior behavior) { ResultList list; if (!re.isValid()) { @@ -7929,12 +8011,12 @@ static ResultList splitString(const QString &source, MidMethod mid, const QRegul while (iterator.hasNext()) { QRegularExpressionMatch match = iterator.next(); end = match.capturedStart(); - if (start != end || behavior == QString::KeepEmptyParts) + if (start != end || behavior == Qt::KeepEmptyParts) list.append((source.*mid)(start, end - start)); start = match.capturedEnd(); } - if (start != source.size() || behavior == QString::KeepEmptyParts) + if (start != source.size() || behavior == Qt::KeepEmptyParts) list.append((source.*mid)(start, -1)); return list; @@ -7943,7 +8025,7 @@ static ResultList splitString(const QString &source, MidMethod mid, const QRegul /*! \overload - \since 5.0 + \since 5.14 Splits the string into substrings wherever the regular expression \a re matches, and returns the list of those strings. If \a re @@ -7968,14 +8050,23 @@ static ResultList splitString(const QString &source, MidMethod mid, const QRegul \sa QStringList::join(), section() */ -QStringList QString::split(const QRegularExpression &re, SplitBehavior behavior) const +QStringList QString::split(const QRegularExpression &re, Qt::SplitBehavior behavior) const { return splitString(*this, &QString::mid, re, behavior); } /*! \overload - \since 5.4 + \since 5.0 +*/ +QStringList QString::split(const QRegularExpression &re, SplitBehavior behavior) const +{ + return split(re, mapSplitBehavior(behavior)); +} + +/*! + \overload + \since 5.14 Splits the string into substring references wherever the regular expression \a re matches, and returns the list of those strings. If \a re @@ -7987,10 +8078,19 @@ QStringList QString::split(const QRegularExpression &re, SplitBehavior behavior) \sa split() QStringRef */ -QVector QString::splitRef(const QRegularExpression &re, SplitBehavior behavior) const +QVector QString::splitRef(const QRegularExpression &re, Qt::SplitBehavior behavior) const { return splitString >(*this, &QString::midRef, re, behavior); } + +/*! + \overload + \since 5.4 +*/ +QVector QString::splitRef(const QRegularExpression &re, SplitBehavior behavior) const +{ + return splitRef(re, mapSplitBehavior(behavior)); +} #endif // QT_CONFIG(regularexpression) /*! diff --git a/src/corelib/text/qstring.h b/src/corelib/text/qstring.h index 61325c7486..611fedd529 100644 --- a/src/corelib/text/qstring.h +++ b/src/corelib/text/qstring.h @@ -582,7 +582,7 @@ public: { return replace(re, QString()); } #endif - enum SplitBehavior { KeepEmptyParts, SkipEmptyParts }; + enum SplitBehavior { KeepEmptyParts, SkipEmptyParts }; // ### Qt 6: replace with Qt:: version Q_REQUIRED_RESULT QStringList split(const QString &sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; @@ -601,26 +601,22 @@ public: Q_REQUIRED_RESULT QVector splitRef(const QRegularExpression &sep, SplitBehavior behavior = KeepEmptyParts) const; #endif -private: - static Q_DECL_CONSTEXPR SplitBehavior _sb(Qt::SplitBehavior sb) Q_DECL_NOTHROW - { return sb & Qt::SkipEmptyParts ? SkipEmptyParts : KeepEmptyParts; } public: - - Q_REQUIRED_RESULT inline QStringList split(const QString &sep, Qt::SplitBehavior behavior, - Qt::CaseSensitivity cs = Qt::CaseSensitive) const; - Q_REQUIRED_RESULT inline QVector splitRef(const QString &sep, Qt::SplitBehavior behavior, - Qt::CaseSensitivity cs = Qt::CaseSensitive) const; - Q_REQUIRED_RESULT inline QStringList split(QChar sep, Qt::SplitBehavior behavior, - Qt::CaseSensitivity cs = Qt::CaseSensitive) const; - Q_REQUIRED_RESULT inline QVector splitRef(QChar sep, Qt::SplitBehavior behavior, - Qt::CaseSensitivity cs = Qt::CaseSensitive) const; + Q_REQUIRED_RESULT QStringList split(const QString &sep, Qt::SplitBehavior behavior, + Qt::CaseSensitivity cs = Qt::CaseSensitive) const; + Q_REQUIRED_RESULT QVector splitRef(const QString &sep, Qt::SplitBehavior behavior, + Qt::CaseSensitivity cs = Qt::CaseSensitive) const; + Q_REQUIRED_RESULT QStringList split(QChar sep, Qt::SplitBehavior behavior, + Qt::CaseSensitivity cs = Qt::CaseSensitive) const; + Q_REQUIRED_RESULT QVector splitRef(QChar sep, Qt::SplitBehavior behavior, + Qt::CaseSensitivity cs = Qt::CaseSensitive) const; #ifndef QT_NO_REGEXP - Q_REQUIRED_RESULT inline QStringList split(const QRegExp &sep, Qt::SplitBehavior behavior) const; - Q_REQUIRED_RESULT inline QVector splitRef(const QRegExp &sep, Qt::SplitBehavior behavior) const; + Q_REQUIRED_RESULT QStringList split(const QRegExp &sep, Qt::SplitBehavior behavior) const; + Q_REQUIRED_RESULT QVector splitRef(const QRegExp &sep, Qt::SplitBehavior behavior) const; #endif #ifndef QT_NO_REGULAREXPRESSION - Q_REQUIRED_RESULT inline QStringList split(const QRegularExpression &sep, Qt::SplitBehavior behavior) const; - Q_REQUIRED_RESULT inline QVector splitRef(const QRegularExpression &sep, Qt::SplitBehavior behavior) const; + Q_REQUIRED_RESULT QStringList split(const QRegularExpression &sep, Qt::SplitBehavior behavior) const; + Q_REQUIRED_RESULT QVector splitRef(const QRegularExpression &sep, Qt::SplitBehavior behavior) const; #endif @@ -1624,10 +1620,10 @@ public: Q_REQUIRED_RESULT QVector split(QChar sep, QString::SplitBehavior behavior = QString::KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive) const; - Q_REQUIRED_RESULT inline QVector split(const QString &sep, Qt::SplitBehavior behavior, - Qt::CaseSensitivity cs = Qt::CaseSensitive) const; - Q_REQUIRED_RESULT inline QVector split(QChar sep, Qt::SplitBehavior behavior, - Qt::CaseSensitivity cs = Qt::CaseSensitive) const; + Q_REQUIRED_RESULT QVector split(const QString &sep, Qt::SplitBehavior behavior, + Qt::CaseSensitivity cs = Qt::CaseSensitive) const; + Q_REQUIRED_RESULT QVector split(QChar sep, Qt::SplitBehavior behavior, + Qt::CaseSensitivity cs = Qt::CaseSensitive) const; Q_REQUIRED_RESULT QStringRef left(int n) const; Q_REQUIRED_RESULT QStringRef right(int n) const; diff --git a/src/corelib/text/qstringlist.h b/src/corelib/text/qstringlist.h index a464d443dc..9ea379bb92 100644 --- a/src/corelib/text/qstringlist.h +++ b/src/corelib/text/qstringlist.h @@ -384,23 +384,6 @@ inline int QStringList::lastIndexOf(const QRegularExpression &rx, int from) cons #endif // QT_CONFIG(regularexpression) #endif // Q_QDOC -// -// QString inline functions: -// - -QStringList QString::split(const QString &sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const -{ return split(sep, _sb(behavior), cs); } -QStringList QString::split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const -{ return split(sep, _sb(behavior), cs); } -#ifndef QT_NO_REGEXP -QStringList QString::split(const QRegExp &sep, Qt::SplitBehavior behavior) const -{ return split(sep, _sb(behavior)); } -#endif -#if QT_CONFIG(regularexpression) -QStringList QString::split(const QRegularExpression &sep, Qt::SplitBehavior behavior) const -{ return split(sep, _sb(behavior)); } -#endif - QT_END_NAMESPACE #endif // QSTRINGLIST_H diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h index b8b9b7da40..288c082c44 100644 --- a/src/corelib/tools/qvector.h +++ b/src/corelib/tools/qvector.h @@ -1133,24 +1133,6 @@ extern template class Q_CORE_EXPORT QVector; QVector QStringView::toUcs4() const { return QtPrivate::convertToUcs4(*this); } -QVector QString::splitRef(const QString &sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const -{ return splitRef(sep, _sb(behavior), cs); } -QVector QString::splitRef(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const -{ return splitRef(sep, _sb(behavior), cs); } -#ifndef QT_NO_REGEXP -QVector QString::splitRef(const QRegExp &sep, Qt::SplitBehavior behavior) const -{ return splitRef(sep, _sb(behavior)); } -#endif -#if QT_CONFIG(regularexpression) -QVector QString::splitRef(const QRegularExpression &sep, Qt::SplitBehavior behavior) const -{ return splitRef(sep, _sb(behavior)); } -#endif -QVector QStringRef::split(const QString &sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const -{ return split(sep, QString::_sb(behavior), cs); } -QVector QStringRef::split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const -{ return split(sep, QString::_sb(behavior), cs); } - - QT_END_NAMESPACE #endif // QVECTOR_H -- cgit v1.2.3