diff --git a/src/util/IntrusiveHashSet.hxx b/src/util/IntrusiveHashSet.hxx index 69929c95b..5b2520a86 100644 --- a/src/util/IntrusiveHashSet.hxx +++ b/src/util/IntrusiveHashSet.hxx @@ -191,30 +191,44 @@ public: counter.reset(); } - void remove_and_dispose_if(std::predicate<const_reference> auto pred, + /** + * Remove and dispose all items matching the given predicate. + * + * @return the number of removed items + */ + std::size_t remove_and_dispose_if(std::predicate<const_reference> auto pred, Disposer<value_type> auto disposer) noexcept { + std::size_t n = 0; for (auto &bucket : table) - counter -= bucket.remove_and_dispose_if(pred, disposer); + n += bucket.remove_and_dispose_if(pred, disposer); + counter -= n; + return n; } /** * Remove and dispose all items with the specified key. + * + * @return the number of removed items */ - constexpr void remove_and_dispose_key(const auto &key, - Disposer<value_type> auto disposer) noexcept { + constexpr std::size_t remove_and_dispose_key(const auto &key, + Disposer<value_type> auto disposer) noexcept { auto &bucket = GetBucket(key); - counter -= bucket.remove_and_dispose_if([this, &key](const auto &item){ + std::size_t n = bucket.remove_and_dispose_if([this, &key](const auto &item){ return ops.equal(key, item); }, disposer); + counter -= n; + return n; } - constexpr void remove_and_dispose_key_if(const auto &key, - std::predicate<const_reference> auto pred, - Disposer<value_type> auto disposer) noexcept { + constexpr std::size_t remove_and_dispose_key_if(const auto &key, + std::predicate<const_reference> auto pred, + Disposer<value_type> auto disposer) noexcept { auto &bucket = GetBucket(key); - counter -= bucket.remove_and_dispose_if([this, &key, &pred](const auto &item){ + std::size_t n = bucket.remove_and_dispose_if([this, &key, &pred](const auto &item){ return ops.equal(key, item) && pred(item); }, disposer); + counter -= n; + return n; } [[nodiscard]]