From 69ba1917837c88423e8538f7b0b6e4161773fe83 Mon Sep 17 00:00:00 2001 From: Dan Hirsch <thequux@thequux.com> Date: Mon, 8 Oct 2012 17:11:47 +0200 Subject: [PATCH] Added singly-linked list --- src/allocator.c | 6 +++++- src/allocator.h | 1 + src/datastructures.c | 33 +++++++++++++++++++++++++++++++++ src/internal.h | 15 +++++++++++++++ 4 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/allocator.c b/src/allocator.c index f53b84b..59c6e50 100644 --- a/src/allocator.c +++ b/src/allocator.c @@ -86,7 +86,11 @@ void* h_arena_malloc(HArena *arena, size_t size) { return link->rest; } } - + +void h_arena_free(HArena *arena, void* ptr) { + // To be used later... +} + void h_delete_arena(HArena *arena) { struct arena_link *link = arena->head; while (link) { diff --git a/src/allocator.h b/src/allocator.h index 3ec9ae9..3af22d0 100644 --- a/src/allocator.h +++ b/src/allocator.h @@ -23,6 +23,7 @@ typedef struct HArena_ HArena ; // hidden implementation HArena *h_new_arena(size_t block_size); // pass 0 for default... void* h_arena_malloc(HArena *arena, size_t count) __attribute__(( malloc, alloc_size(2) )); +void h_arena_free(HArena *arena, void* ptr); // For future expansion, with alternate memory managers. void h_delete_arena(HArena *arena); typedef struct { diff --git a/src/datastructures.c b/src/datastructures.c index 004f7e7..e7552e5 100644 --- a/src/datastructures.c +++ b/src/datastructures.c @@ -30,3 +30,36 @@ void h_carray_append(HCountedArray *array, void* item) { } array->elements[array->used++] = item; } + +// HSlist + +HSlist* h_slist_new(HArena *arena) { + HSlist *ret = h_arena_malloc(arena, sizeof(HSlist)); + ret->head = NULL; + ret->arena = arena; + return ret; +} + +void* h_slist_pop(HSlist *slist) { + HSlistNode *head = slist->head; + if (!head) + return NULL; + void* ret = head->elem; + slist->head = head->next; + h_arena_free(slist->arena, head); + return ret; +} + +void h_slist_push(HSlist *slist, void* item) { + HSlistNode *hnode = h_arena_malloc(slist->arena, sizeof(HSlistNode)); + hnode->elem = item; + hnode->next = slist->head; + // write memory barrier here. + slist->head = hnode; +} + +void h_slist_free(HSlist *slist) { + while (slist->head != NULL) + h_slist_pop(slist); + h_arena_free(slist->arena, slist); +} diff --git a/src/internal.h b/src/internal.h index cc35a8b..b59f824 100644 --- a/src/internal.h +++ b/src/internal.h @@ -154,6 +154,21 @@ HCountedArray *h_carray_new_sized(HArena * arena, size_t size); HCountedArray *h_carray_new(HArena * arena); void h_carray_append(HCountedArray *array, void* item); +typedef struct HSlistNode_ { + void* elem; + struct HSlistNode_ *next; +} HSlistNode; + +typedef struct HSlist_ { + HSlistNode *head; + struct HArena_ *arena; +} HSlist; + + +HSlist* h_slist_new(HArena *arena); +void* h_slist_pop(HSlist *slist); +void h_slist_push(HSlist *slist, void* item); +void h_slist_free(HSlist *slist); #if 0 #include <malloc.h> -- GitLab