Commit 0a1b471e authored by Zhaodong Wang's avatar Zhaodong Wang Committed by Facebook GitHub Bot

Return erased size in erase_if

Summary:
To have parity with C++20 `std::erase_if`: https://en.cppreference.com/w/cpp/container/unordered_set/erase_if

Added a return value for `folly::erase_if` for the number of the removed elements.

(Note: this ignores all push blocking failures!)

Reviewed By: yfeldblum

Differential Revision: D23779631

fbshipit-source-id: cea42b90557dd570db8e010d68c2b9ecf0bcc515
parent cfd29074
......@@ -1412,8 +1412,8 @@ template <
typename E,
typename A,
typename Pred>
void erase_if(F14ValueMap<K, M, H, E, A>& c, Pred pred) {
f14::detail::erase_if_impl(c, pred);
std::size_t erase_if(F14ValueMap<K, M, H, E, A>& c, Pred pred) {
return f14::detail::erase_if_impl(c, pred);
}
template <
......@@ -1423,8 +1423,8 @@ template <
typename E,
typename A,
typename Pred>
void erase_if(F14NodeMap<K, M, H, E, A>& c, Pred pred) {
f14::detail::erase_if_impl(c, pred);
std::size_t erase_if(F14NodeMap<K, M, H, E, A>& c, Pred pred) {
return f14::detail::erase_if_impl(c, pred);
}
template <
......@@ -1434,8 +1434,8 @@ template <
typename E,
typename A,
typename Pred>
void erase_if(F14VectorMap<K, M, H, E, A>& c, Pred pred) {
f14::detail::erase_if_impl(c, pred);
std::size_t erase_if(F14VectorMap<K, M, H, E, A>& c, Pred pred) {
return f14::detail::erase_if_impl(c, pred);
}
template <
......@@ -1445,8 +1445,8 @@ template <
typename E,
typename A,
typename Pred>
void erase_if(F14FastMap<K, M, H, E, A>& c, Pred pred) {
f14::detail::erase_if_impl(c, pred);
std::size_t erase_if(F14FastMap<K, M, H, E, A>& c, Pred pred) {
return f14::detail::erase_if_impl(c, pred);
}
} // namespace folly
......@@ -1127,23 +1127,23 @@ void swap(F14FastSet<K, H, E, A>& lhs, F14FastSet<K, H, E, A>& rhs) noexcept(
}
template <typename K, typename H, typename E, typename A, typename Pred>
void erase_if(F14ValueSet<K, H, E, A>& c, Pred pred) {
f14::detail::erase_if_impl(c, pred);
std::size_t erase_if(F14ValueSet<K, H, E, A>& c, Pred pred) {
return f14::detail::erase_if_impl(c, pred);
}
template <typename K, typename H, typename E, typename A, typename Pred>
void erase_if(F14NodeSet<K, H, E, A>& c, Pred pred) {
f14::detail::erase_if_impl(c, pred);
std::size_t erase_if(F14NodeSet<K, H, E, A>& c, Pred pred) {
return f14::detail::erase_if_impl(c, pred);
}
template <typename K, typename H, typename E, typename A, typename Pred>
void erase_if(F14VectorSet<K, H, E, A>& c, Pred pred) {
f14::detail::erase_if_impl(c, pred);
std::size_t erase_if(F14VectorSet<K, H, E, A>& c, Pred pred) {
return f14::detail::erase_if_impl(c, pred);
}
template <typename K, typename H, typename E, typename A, typename Pred>
void erase_if(F14FastSet<K, H, E, A>& c, Pred pred) {
f14::detail::erase_if_impl(c, pred);
std::size_t erase_if(F14FastSet<K, H, E, A>& c, Pred pred) {
return f14::detail::erase_if_impl(c, pred);
}
} // namespace folly
......@@ -195,13 +195,17 @@ struct StdNodeReplica<
#endif
template <class Container, class Predicate>
void erase_if_impl(Container& c, Predicate& predicate) {
typename Container::size_type erase_if_impl(
Container& c,
Predicate& predicate) {
auto const old_size = c.size();
for (auto i = c.begin(), last = c.end(); i != last;) {
auto prev = i++;
if (predicate(*prev)) {
c.erase(prev);
}
}
return old_size - c.size();
}
template <
......
......@@ -2100,7 +2100,7 @@ template <template <class...> class TMap>
void testEraseIf() {
TMap<int, int> m{{1, 1}, {2, 2}, {3, 3}, {4, 4}};
const auto isEvenKey = [](const auto& p) { return p.first % 2 == 0; };
erase_if(m, isEvenKey);
EXPECT_EQ(2u, erase_if(m, isEvenKey));
ASSERT_EQ(2u, m.size());
EXPECT_TRUE(m.contains(1));
EXPECT_TRUE(m.contains(3));
......
......@@ -1574,7 +1574,7 @@ template <template <class...> class TSet>
void testEraseIf() {
TSet<int> s{1, 2, 3, 4};
const auto isEvenKey = [](const auto& key) { return key % 2 == 0; };
erase_if(s, isEvenKey);
EXPECT_EQ(2u, erase_if(s, isEvenKey));
ASSERT_EQ(2u, s.size());
EXPECT_TRUE(s.contains(1));
EXPECT_TRUE(s.contains(3));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment