src/array_list.c

changeset 1606
f5883f6e42e7
parent 1605
55b13f583356
child 1607
0ecb13118cac
--- a/src/array_list.c	Sun Dec 14 17:30:17 2025 +0100
+++ b/src/array_list.c	Sun Dec 14 21:14:34 2025 +0100
@@ -218,6 +218,43 @@
     return 0;
 }
 
+int cx_array_init_(CxArray *array, const CxAllocator *allocator, size_t elem_size, size_t capacity) {
+    array->size = 0;
+    array->capacity = capacity;
+    array->data = cxCalloc(allocator, capacity, elem_size);
+    return array->data == NULL;
+}
+
+static size_t cx_array_increase_capacity(size_t old_capacity) {
+    // TODO: make this strategy better
+    if (old_capacity < 1024) {
+        return old_capacity + 64;
+    } else {
+        return old_capacity + 128;
+    }
+}
+
+int cx_array_add_(CxArray *array, const CxAllocator *allocator, size_t elem_size, void *element) {
+    if (array->size >= array->capacity) {
+        size_t newcap = cx_array_increase_capacity(array->capacity);
+        if (cxReallocateArray(allocator, &array->data, newcap, elem_size)) {
+            return -1;
+        }
+        array->capacity = newcap;
+    }
+    char *dst = array->data;
+    dst += elem_size * array->size;
+    memcpy(dst, element, elem_size);
+    array->size++;
+    return 0;
+}
+
+void cx_array_free_(const CxAllocator *allocator, CxArray *array) {
+    cxFree(allocator, array->data);
+    array->data = NULL;
+    array->size = array->capacity = 0;
+}
+
 int cx_array_copy(
         void **target,
         void *size,

mercurial