diff options
author | Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> | 2020-10-16 19:16:29 +0200 |
---|---|---|
committer | Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> | 2020-12-01 18:55:55 +0100 |
commit | 62dad9be9e172597c56a970202299563aa04918e (patch) | |
tree | 30164786bdc708d2e3e33696ddba4fcfdf082b8b | |
parent | c176525f13bfcea8649d9e987bdff0dc45a56bf7 (diff) | |
download | qtbase-62dad9be9e172597c56a970202299563aa04918e.tar.gz |
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 <andrei.golubev@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
-rw-r--r-- | src/corelib/tools/qcontainertools_impl.h | 17 | ||||
-rw-r--r-- | src/corelib/tools/qset.h | 12 | ||||
-rw-r--r-- | src/corelib/tools/qset.qdoc | 9 |
3 files changed, 38 insertions, 0 deletions
diff --git a/src/corelib/tools/qcontainertools_impl.h b/src/corelib/tools/qcontainertools_impl.h index 79c41fee87..54de6a8815 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 <typename T, typename Predicate> +qsizetype qset_erase_if(QSet<T> &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 a3e541ea5e..3a51988852 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 <typename Pred> + 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<T> &set) const; @@ -361,6 +367,12 @@ public: }; #endif // QT_NO_JAVA_STYLE_ITERATORS +template <typename T, typename Predicate> +qsizetype erase_if(QSet<T> &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 4f26d1678c..131d398016 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 <class T, class Predicate> qsizetype erase_if(QSet<T> &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. +*/ |