Replaced GQueue and GSlist with HSlist.

This commit is contained in:
Meredith L. Patterson 2012-10-08 18:16:18 +02:00
parent b6bf0ea30c
commit ef6af551d1
3 changed files with 61 additions and 25 deletions

View file

@ -15,6 +15,7 @@ HCountedArray *h_carray_new_sized(HArena * arena, size_t size) {
ret->elements = h_arena_malloc(arena, sizeof(void*) * size);
return ret;
}
HCountedArray *h_carray_new(HArena * arena) {
return h_carray_new_sized(arena, 4);
}
@ -32,7 +33,6 @@ void h_carray_append(HCountedArray *array, void* item) {
}
// HSlist
HSlist* h_slist_new(HArena *arena) {
HSlist *ret = h_arena_malloc(arena, sizeof(HSlist));
ret->head = NULL;
@ -58,8 +58,42 @@ void h_slist_push(HSlist *slist, void* item) {
slist->head = hnode;
}
bool h_slist_find(HSlist *slist, const void* item) {
assert (item != NULL);
HSlistNode *head = slist->head;
while (head != NULL) {
if (head->elem == item)
return true;
head = head->next;
}
return false;
}
HSlist* h_slist_remove_all(HSlist *slist, const void* item) {
assert (item != NULL);
HSlistNode *node = slist->head;
HSlistNode *prev = NULL;
while (node != NULL) {
if (node->elem == item) {
HSlistNode *next = node->next;
if (prev)
prev->next = next;
else
slist->head = next;
// FIXME free the removed node! this leaks.
node = next;
}
else {
prev = node;
node = prev->next;
}
}
return slist;
}
void h_slist_free(HSlist *slist) {
while (slist->head != NULL)
h_slist_pop(slist);
h_arena_free(slist->arena, slist);
}