in src/ds/seqset.h [104:144]
SNMALLOC_FAST_PATH void filter(Fn&& f)
{
// Check for empty case.
if (is_empty())
return;
T** prev = &(v.head);
while (true)
{
if constexpr (Fifo)
{
if (*prev == nullptr)
break;
}
T* curr = *prev;
// Note must read curr->next before calling `f` as `f` is allowed to
// mutate that field.
T* next = curr->next;
if (f(curr))
{
// Remove element;
*prev = next;
}
else
{
// Keep element
prev = &(curr->next);
}
if constexpr (!Fifo)
{
if (&(curr->next) == v.end)
break;
}
}
if constexpr (!Fifo)
{
v.end = prev;
}
}