#include "ref.h" #include "list.h" #include "util.h" #include struct ref * ref_alloc(void *data) { struct ref *ref; ref = malloc(sizeof(struct ref)); if (!ref) ERROR(SYSTEM, "malloc"); ref->link = LIST_LINK_INIT; ref->data = data; return ref; } void ref_free(void *ref) { free(ref); } void refs_free(struct list *list) { list_free_items(list, ref_free, LIST_OFFSET(struct ref, link)); } int refs_index(struct list *list, void *data) { struct list_link *iter; struct ref *ref; int index; index = 0; for (LIST_ITER(list, iter)) { ref = LIST_UPCAST(iter, struct ref, link); if (ref->data == data) return index; index++; } return -1; } struct list_link * refs_find(struct list *list, void *data) { struct list_link *iter; struct ref *ref; for (LIST_ITER(list, iter)) { ref = LIST_UPCAST(iter, struct ref, link); if (ref->data == data) return iter; } return NULL; } int refs_incl(struct list *list, void *data) { struct list_link *ref; ref = refs_find(list, data); return ref != NULL; } void refs_rm(struct list *list, void *data) { struct list_link *ref; struct ref *dataref; ref = refs_find(list, data); if (!ref) return; dataref = LIST_UPCAST(ref, struct ref, link); list_link_pop(ref); free(dataref); }