summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/tools/qcontainertools_impl.h17
-rw-r--r--src/corelib/tools/qset.h12
-rw-r--r--src/corelib/tools/qset.qdoc9
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.
+*/