Replaced GQueue and GSlist with HSlist.
This commit is contained in:
parent
b6bf0ea30c
commit
ef6af551d1
3 changed files with 61 additions and 25 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue