void RlistFilter(Rlist **list, bool (*KeepPredicate)(void *, void *), void *predicate_user_data, void (*DestroyItem)(void *)) { assert(KeepPredicate); Rlist *start = *list; Rlist *prev = NULL; for (Rlist *rp = start; rp;) { if (!KeepPredicate(rp->item, predicate_user_data)) { if (prev) { prev->next = rp->next; } else { *list = rp->next; } if (DestroyItem) { DestroyItem(rp->item); rp->item = NULL; } Rlist *next = rp->next; rp->next = NULL; RlistDestroy(rp); rp = next; } else { prev = rp; rp = rp->next; } } }
void RlistFilter(Rlist **list, bool (*KeepPredicate)(void *, void *), void *predicate_user_data, void (*DestroyItem)(void *)) { assert(KeepPredicate); Rlist *start = *list, *prev = NULL, *next; for (Rlist *rp = start; rp; rp = next) { next = rp->next; if (KeepPredicate(RlistScalarValue(rp), predicate_user_data)) { prev = rp; } else { if (prev) { prev->next = next; } else { assert(rp == *list); *list = next; } if (DestroyItem) { DestroyItem(rp->val.item); rp->val.item = NULL; } rp->next = NULL; RlistDestroy(rp); } } }