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>
This commit is contained in:
Giuseppe D'Angelo 2020-10-16 19:16:29 +02:00
parent c176525f13
commit 62dad9be9e
3 changed files with 38 additions and 0 deletions

View File

@ -198,6 +198,23 @@ auto sequential_erase_if(Container &c, Predicate &pred)
return result; 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 } // namespace QtPrivate
QT_END_NAMESPACE QT_END_NAMESPACE

View File

@ -93,6 +93,12 @@ public:
inline bool remove(const T &value) { return q_hash.remove(value) != 0; } 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); } inline bool contains(const T &value) const { return q_hash.contains(value); }
bool contains(const QSet<T> &set) const; bool contains(const QSet<T> &set) const;
@ -361,6 +367,12 @@ public:
}; };
#endif // QT_NO_JAVA_STYLE_ITERATORS #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 QT_END_NAMESPACE
#endif // QSET_H #endif // QSET_H

View File

@ -896,3 +896,12 @@
The hash value is independent of the order of elements in \a key, that is, sets 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. 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.
*/