SNMALLOC_FAST_PATH void filter()

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;
      }
    }