diff options
author | bonmas14 <bonmas14@gmail.com> | 2025-08-02 23:20:37 +0000 |
---|---|---|
committer | bonmas14 <bonmas14@gmail.com> | 2025-08-02 23:20:37 +0000 |
commit | 1cf89852f951b59b89f2a8bd7b54a0b0b74d439c (patch) | |
tree | 884af08903beba5f0e1e8435df4a1c7015270487 /src/un_list.c | |
download | ungrateful-1cf89852f951b59b89f2a8bd7b54a0b0b74d439c.tar.gz ungrateful-1cf89852f951b59b89f2a8bd7b54a0b0b74d439c.zip |
memory manipulation, strings, allocators list and logger.
Diffstat (limited to 'src/un_list.c')
-rw-r--r-- | src/un_list.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/src/un_list.c b/src/un_list.c new file mode 100644 index 0000000..a670de0 --- /dev/null +++ b/src/un_list.c @@ -0,0 +1,83 @@ +List un_list_create(u64 start_capacity, u64 element_size, Allocator alloc) { + List list; + + list.count = 0; + list.capacity = start_capacity; + list.element_size = element_size; + list.alloc = alloc; + + list.data = un_memory_alloc(list.capacity * list.element_size, alloc); + + assert(list.data != NULL); + return list; +} + +void un_list_destroy(List *list) { + un_memory_destroy(&list->alloc); + UN_CLEAR(*list); +} + +List un_list_clone(List *list, Allocator alloc) { + List result; + + result = *list; + result.alloc = alloc; + result.data = un_memory_alloc(result.capacity * result.element_size, alloc); + assert(result.data != NULL); + + un_memory_copy(result.data, list->data, result.count * result.element_size); + + return result; +} + +static b32 list_grow_if_needed(List *list) { + if ((list->count + 1) <= list->capacity) { + return true; + } else { + void *mem = un_memory_realloc(list->data, list->element_size * list->capacity * 2, list->alloc); + + if (!mem) { + return false; + } + + list->data = mem; + list->capacity *= 2; + } + + return true; +} + +void un_list_append(List *list, void *data) { + void *addr; + + if (list_grow_if_needed(list)) { + addr = (u8*)list->data + list->count * list->element_size; + un_memory_copy(addr, data, list->element_size); + list->count++; + } else { + un_log_write_cstring(UN_LOG_ERROR, UN_CSTR "Failed to grow list"); + } +} + +void *un_list_get(List *list, u64 index) { + if (index >= list->count) return NULL; + + return (u8*)list->data + index * list->element_size; +} + +void un_list_remove(List *list, u64 index) { + void *addr; + u64 move_elements; + + if (index >= list->count) return; + + addr = (u8*)list->data + index * list->element_size; + + move_elements = list->count - (index + 1); + + if (move_elements) { + un_memory_move(addr, (u8*)addr + list->element_size, move_elements * list->element_size); + } + + list->count--; +} |