rsx/util: Change the filter function to an in-place erase-if operation

This commit is contained in:
kd-11 2024-11-03 04:17:26 +03:00 committed by kd-11
parent b94ddb0cd3
commit 109b841d8d

View file

@ -382,22 +382,26 @@ namespace rsx
return false; return false;
} }
void filter(std::predicate<const Ty&> auto predicate) bool erase_if(std::predicate<const Ty&> auto predicate)
{ {
if (!_size) if (!_size)
{ {
return; return false;
} }
bool ret = false;
for (auto ptr = _data, last = _data + _size - 1; ptr < last; ptr++) for (auto ptr = _data, last = _data + _size - 1; ptr < last; ptr++)
{ {
if (!predicate(*ptr)) if (predicate(*ptr))
{ {
// Move item to the end of the list and shrink by 1 // Move item to the end of the list and shrink by 1
std::memcpy(ptr, last, sizeof(Ty)); std::memcpy(ptr, last, sizeof(Ty));
last = _data + (--_size); last = _data + (--_size);
ret = true;
} }
} }
return ret;
} }
void sort(std::predicate<const Ty&, const Ty&> auto predicate) void sort(std::predicate<const Ty&, const Ty&> auto predicate)