AK: Make Vector::remove_all_matching() return removal success

This matches the behavior of other remove_*_matching() functions.
This commit is contained in:
Andreas Kling 2022-01-05 17:00:17 +01:00
parent 5279a04c78
commit 558fb0a04a
2 changed files with 27 additions and 1 deletions

View file

@ -405,15 +405,18 @@ public:
}
template<typename TUnaryPredicate>
void remove_all_matching(TUnaryPredicate predicate)
bool remove_all_matching(TUnaryPredicate predicate)
{
bool something_was_removed = false;
for (size_t i = 0; i < size();) {
if (predicate(at(i))) {
remove(i);
something_was_removed = true;
} else {
++i;
}
}
return something_was_removed;
}
ALWAYS_INLINE T take_last()

View file

@ -259,6 +259,29 @@ TEST_CASE(vector_remove)
EXPECT_EQ(ints[0], 4);
}
TEST_CASE(remove_all_matching)
{
Vector<int> ints;
ints.append(1);
ints.append(2);
ints.append(3);
ints.append(4);
EXPECT_EQ(ints.size(), 4u);
EXPECT_EQ(ints.remove_all_matching([&](int value) { return value > 2; }), true);
EXPECT_EQ(ints.remove_all_matching([&](int) { return false; }), false);
EXPECT_EQ(ints.size(), 2u);
EXPECT_EQ(ints.remove_all_matching([&](int) { return true; }), true);
EXPECT(ints.is_empty());
EXPECT_EQ(ints.remove_all_matching([&](int) { return true; }), false);
}
TEST_CASE(nonnullownptrvector)
{
struct Object {