Added singly-linked list
This commit is contained in:
parent
3f156e6d24
commit
69ba191783
4 changed files with 54 additions and 1 deletions
|
|
@ -86,7 +86,11 @@ void* h_arena_malloc(HArena *arena, size_t size) {
|
||||||
return link->rest;
|
return link->rest;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void h_arena_free(HArena *arena, void* ptr) {
|
||||||
|
// To be used later...
|
||||||
|
}
|
||||||
|
|
||||||
void h_delete_arena(HArena *arena) {
|
void h_delete_arena(HArena *arena) {
|
||||||
struct arena_link *link = arena->head;
|
struct arena_link *link = arena->head;
|
||||||
while (link) {
|
while (link) {
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ typedef struct HArena_ HArena ; // hidden implementation
|
||||||
|
|
||||||
HArena *h_new_arena(size_t block_size); // pass 0 for default...
|
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_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);
|
void h_delete_arena(HArena *arena);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
||||||
|
|
@ -30,3 +30,36 @@ void h_carray_append(HCountedArray *array, void* item) {
|
||||||
}
|
}
|
||||||
array->elements[array->used++] = 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);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -154,6 +154,21 @@ HCountedArray *h_carray_new_sized(HArena * arena, size_t size);
|
||||||
HCountedArray *h_carray_new(HArena * arena);
|
HCountedArray *h_carray_new(HArena * arena);
|
||||||
void h_carray_append(HCountedArray *array, void* item);
|
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
|
#if 0
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue