aboutsummaryrefslogtreecommitdiff
path: root/src/un_list.c
diff options
context:
space:
mode:
authorbonmas14 <bonmas14@gmail.com>2025-08-23 01:28:41 +0300
committerbonmas14 <bonmas14@gmail.com>2025-08-23 01:28:41 +0300
commit8ebdc95621bc61fdf3c98cd7ae4ddca67398df23 (patch)
tree205413ed09ac001e37267889d429a363c37008f2 /src/un_list.c
parentc96c355b360f18f982459e1a866dcbf5864efdb8 (diff)
downloadungrateful-8ebdc95621bc61fdf3c98cd7ae4ddca67398df23.tar.gz
ungrateful-8ebdc95621bc61fdf3c98cd7ae4ddca67398df23.zip
Ungrateful changes, added more stuffHEADmain
Diffstat (limited to 'src/un_list.c')
-rw-r--r--src/un_list.c39
1 files changed, 34 insertions, 5 deletions
diff --git a/src/un_list.c b/src/un_list.c
index 133dc12..9d6a5ce 100644
--- a/src/un_list.c
+++ b/src/un_list.c
@@ -8,12 +8,16 @@ List un_list_create(u64 start_capacity, u64 element_size, Allocator alloc) {
list.data = un_memory_alloc(list.capacity * list.element_size, alloc);
- assert(list.data != NULL);
+ if (list.data == NULL) {
+ list.alloc = un_allocator_get_temporary();
+ list.data = un_memory_alloc(list.capacity * list.element_size, list.alloc);
+ }
+
return list;
}
-void un_list_destroy(List *list) {
- un_memory_destroy(&list->alloc);
+void un_list_destroy(List *list, b32 delete_allocator) {
+ if (delete_allocator) { un_memory_destroy(&list->alloc); }
UN_CLEAR(*list);
}
@@ -25,6 +29,11 @@ List un_list_clone(List *list, Allocator alloc) {
result.data = un_memory_alloc(result.capacity * result.element_size, alloc);
assert(result.data != NULL);
+ if (result.data == NULL) {
+ result.alloc = un_allocator_get_temporary();
+ result.data = un_memory_alloc(result.capacity * result.element_size, result.alloc);
+ }
+
un_memory_copy(result.data, list->data, result.count * result.element_size);
return result;
@@ -34,12 +43,15 @@ 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);
+ void *mem = un_memory_alloc(list->element_size * list->capacity * 2, list->alloc);
if (!mem) {
return false;
}
+ un_memory_copy(mem, list->data, list->element_size * list->capacity);
+ un_memory_free(list->data, list->alloc);
+
list->data = mem;
list->capacity *= 2;
}
@@ -47,7 +59,22 @@ static b32 list_grow_if_needed(List *list) {
return true;
}
+static void un_list_create_if_needed(List *list) {
+ assert(list != NULL);
+
+ if (list->data != NULL) return;
+
+ assert(list->capacity == 0);
+ assert(list->element_size != 0);
+
+ if (!list->data) {
+ Allocator alloc = list->alloc.proc == NULL ? un_allocator_get_standard() : list->alloc;
+ *list = un_list_create(UN_LIST_STANDARD_CAPACITY, list->element_size, alloc);
+ }
+}
+
b32 un_list_append(List *list, void *data) {
+ un_list_create_if_needed(list);
void *addr;
if (list_grow_if_needed(list)) {
@@ -63,6 +90,8 @@ b32 un_list_append(List *list, void *data) {
void *un_list_get(List *list, u64 index) {
if (index >= list->count) return NULL;
+ assert(list->data != NULL);
+
return (u8*)list->data + index * list->element_size;
}
@@ -72,8 +101,8 @@ void un_list_remove(List *list, u64 index) {
if (index >= list->count) return;
+ assert(list->data != NULL);
addr = (u8*)list->data + index * list->element_size;
-
move_elements = list->count - (index + 1);
if (move_elements) {