From b2ea30dde05d30e2c2c672b17ae6f368164e7f88 Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Fri, 16 Oct 2020 20:10:11 +0200 Subject: [PATCH] QString/QByteArray: add erase/erase_if [ChangeLog][QtCore][QString] Added erase() and erase_if() for consistent container erasure. [ChangeLog][QtCore][QByteArray] Added erase() and erase_if() for consistent container erasure. Change-Id: I23e8565d39044c1f1d756500589c1f2b65e1a88f Reviewed-by: Andrei Golubev Reviewed-by: Lars Knoll Reviewed-by: Thiago Macieira --- src/corelib/text/qbytearray.cpp | 31 +++++++++++++++++++++++++++++++ src/corelib/text/qbytearray.h | 18 ++++++++++++++++++ src/corelib/text/qstring.cpp | 33 +++++++++++++++++++++++++++++++++ src/corelib/text/qstring.h | 18 ++++++++++++++++++ 4 files changed, 100 insertions(+) diff --git a/src/corelib/text/qbytearray.cpp b/src/corelib/text/qbytearray.cpp index 3845946ce9..cb38f25c19 100644 --- a/src/corelib/text/qbytearray.cpp +++ b/src/corelib/text/qbytearray.cpp @@ -2066,6 +2066,16 @@ QByteArray &QByteArray::remove(qsizetype pos, qsizetype len) return *this; } +/*! + \fn template QByteArray &QByteArray::removeIf(Predicate pred) + \since 6.1 + + Removes all bytes for which the predicate \a pred returns true + from the byte array. Returns a reference to the byte array. + + \sa remove() +*/ + /*! Replaces \a len bytes from index position \a pos with the byte array \a after, and returns a reference to this byte array. @@ -4750,4 +4760,25 @@ size_t qHash(const QByteArray::FromBase64Result &key, size_t seed) noexcept return qHashMulti(seed, key.decoded, static_cast(key.decodingStatus)); } +/*! \fn template qsizetype erase(QByteArray &ba, const T &t) + \relates QByteArray + \since 6.1 + + Removes all elements that compare equal to \a t from the + byte array \a ba. Returns the number of elements removed, if any. + + \sa erase_if +*/ + +/*! \fn template qsizetype erase_if(QByteArray &ba, Predicate pred) + \relates QByteArray + \since 6.1 + + Removes all elements for which the predicate \a pred returns true + from the byte array \a ba. Returns the number of elements removed, if + any. + + \sa erase +*/ + QT_END_NAMESPACE diff --git a/src/corelib/text/qbytearray.h b/src/corelib/text/qbytearray.h index e185887ad7..13bd178ab6 100644 --- a/src/corelib/text/qbytearray.h +++ b/src/corelib/text/qbytearray.h @@ -309,6 +309,12 @@ public: { return insert(i, QByteArrayView(s, len)); } QByteArray &remove(qsizetype index, qsizetype len); + template + QByteArray &removeIf(Predicate pred) + { + QtPrivate::sequential_erase_if(*this, pred); + return *this; + } QByteArray &replace(qsizetype index, qsizetype len, const char *s, qsizetype alen) { return replace(index, len, QByteArrayView(s, alen)); } @@ -721,6 +727,18 @@ Q_DECLARE_SHARED(QByteArray::FromBase64Result) Q_CORE_EXPORT Q_DECL_PURE_FUNCTION size_t qHash(const QByteArray::FromBase64Result &key, size_t seed = 0) noexcept; +template +qsizetype erase(QByteArray &ba, const T &t) +{ + return QtPrivate::sequential_erase(ba, t); +} + +template +qsizetype erase_if(QByteArray &ba, Predicate pred) +{ + return QtPrivate::sequential_erase_if(ba, pred); +} + // // QByteArrayView members that require QByteArray: // diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp index 76f0e15303..17c3e8d3cf 100644 --- a/src/corelib/text/qstring.cpp +++ b/src/corelib/text/qstring.cpp @@ -3087,6 +3087,16 @@ QString &QString::remove(QChar ch, Qt::CaseSensitivity cs) \sa indexOf(), lastIndexOf(), replace() */ +/*! + \fn template QString &QString::removeIf(Predicate pred) + \since 6.1 + + Removes all elements for which the predicate \a pred returns true + from the string. Returns a reference to the string. + + \sa remove() +*/ + /*! \fn QString &QString::replace(qsizetype position, qsizetype n, const QString &after) @@ -10138,4 +10148,27 @@ float QStringView::toFloat(bool *ok) const return QLocaleData::convertDoubleToFloat(toDouble(ok), ok); } +/*! + \fn template qsizetype erase(QString &s, const T &t) + \relates QString + \since 6.1 + + Removes all elements that compare equal to \a t from the + string \a s. Returns the number of elements removed, if any. + + \sa erase_if +*/ + +/*! + \fn template qsizetype erase_if(QString &s, Predicate pred) + \relates QString + \since 6.1 + + Removes all elements for which the predicate \a pred returns true + from the string \a s. Returns the number of elements removed, if + any. + + \sa erase +*/ + QT_END_NAMESPACE diff --git a/src/corelib/text/qstring.h b/src/corelib/text/qstring.h index 843ee9966e..d6b7dc1522 100644 --- a/src/corelib/text/qstring.h +++ b/src/corelib/text/qstring.h @@ -642,6 +642,12 @@ public: QString &remove(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive); QString &remove(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive); QString &remove(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive); + template + QString &removeIf(Predicate pred) + { + QtPrivate::sequential_erase_if(*this, pred); + return *this; + } QString &replace(qsizetype i, qsizetype len, QChar after); QString &replace(qsizetype i, qsizetype len, const QChar *s, qsizetype slen); QString &replace(qsizetype i, qsizetype len, const QString &after); @@ -1523,6 +1529,18 @@ QString QLatin1String::arg(Args &&...args) const return QtPrivate::argToQStringDispatch(*this, QtPrivate::qStringLikeToArg(args)...); } +template +qsizetype erase(QString &s, const T &t) +{ + return QtPrivate::sequential_erase(s, t); +} + +template +qsizetype erase_if(QString &s, Predicate pred) +{ + return QtPrivate::sequential_erase_if(s, pred); +} + QT_END_NAMESPACE #if defined(QT_USE_FAST_OPERATOR_PLUS) || defined(QT_USE_QSTRINGBUILDER)