From 62dad9be9e172597c56a970202299563aa04918e Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Fri, 16 Oct 2020 19:16:29 +0200 Subject: [PATCH] QSet: add erase_if [ChangeLog][QtCore][QSet] Added erase_if() for consistent container erasure. Added removeIf() as a method. Change-Id: I4af57b654036aa08bee3f769ab2f60be37115094 Reviewed-by: Andrei Golubev Reviewed-by: Lars Knoll --- src/corelib/tools/qcontainertools_impl.h | 17 +++++++++++++++++ src/corelib/tools/qset.h | 12 ++++++++++++ src/corelib/tools/qset.qdoc | 9 +++++++++ 3 files changed, 38 insertions(+) diff --git a/src/corelib/tools/qcontainertools_impl.h b/src/corelib/tools/qcontainertools_impl.h index 79c41fee879..54de6a88157 100644 --- a/src/corelib/tools/qcontainertools_impl.h +++ b/src/corelib/tools/qcontainertools_impl.h @@ -198,6 +198,23 @@ auto sequential_erase_if(Container &c, Predicate &pred) return result; } +template +qsizetype qset_erase_if(QSet &set, Predicate &pred) +{ + qsizetype result = 0; + auto it = set.begin(); + const auto e = set.end(); + while (it != e) { + if (pred(*it)) { + ++result; + it = set.erase(it); + } else { + ++it; + } + } + return result; +} + } // namespace QtPrivate QT_END_NAMESPACE diff --git a/src/corelib/tools/qset.h b/src/corelib/tools/qset.h index a3e541ea5e7..3a519888522 100644 --- a/src/corelib/tools/qset.h +++ b/src/corelib/tools/qset.h @@ -93,6 +93,12 @@ public: inline bool remove(const T &value) { return q_hash.remove(value) != 0; } + template + inline qsizetype removeIf(Pred predicate) + { + return QtPrivate::qset_erase_if(*this, predicate); + } + inline bool contains(const T &value) const { return q_hash.contains(value); } bool contains(const QSet &set) const; @@ -361,6 +367,12 @@ public: }; #endif // QT_NO_JAVA_STYLE_ITERATORS +template +qsizetype erase_if(QSet &set, Predicate pred) +{ + return QtPrivate::qset_erase_if(set, pred); +} + QT_END_NAMESPACE #endif // QSET_H diff --git a/src/corelib/tools/qset.qdoc b/src/corelib/tools/qset.qdoc index 4f26d1678c9..131d3980169 100644 --- a/src/corelib/tools/qset.qdoc +++ b/src/corelib/tools/qset.qdoc @@ -896,3 +896,12 @@ The hash value is independent of the order of elements in \a key, that is, sets that contain the same elements hash to the same value. */ + +/*! \fn template qsizetype erase_if(QSet &set, Predicate pred) + \relates QSet + \since 6.1 + + Removes all elements for which the predicate \a pred returns true + from the set \a set. Returns the number of elements removed, if + any. +*/