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;
}
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

View File

@ -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

View File

@ -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.
*/