aboutsummaryrefslogtreecommitdiff
path: root/src/un_list.c
diff options
context:
space:
mode:
authorbonmas14 <bonmas14@gmail.com>2025-08-02 23:20:37 +0000
committerbonmas14 <bonmas14@gmail.com>2025-08-02 23:20:37 +0000
commit1cf89852f951b59b89f2a8bd7b54a0b0b74d439c (patch)
tree884af08903beba5f0e1e8435df4a1c7015270487 /src/un_list.c
downloadungrateful-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.c83
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--;
+}