ucx/list.c

branch
dav-2
changeset 886
da79af4baec8
parent 854
1c8401ece69e
child 889
42cdbf9bbd49
--- a/ucx/list.c	Tue Sep 09 16:01:30 2025 +0200
+++ b/ucx/list.c	Tue Sep 09 20:56:47 2025 +0200
@@ -62,7 +62,7 @@
     list->climpl->deallocate(list);
 }
 
-static int cx_pl_insert_element(
+static void *cx_pl_insert_element(
         struct cx_list_s *list,
         size_t index,
         const void *element
@@ -282,7 +282,7 @@
     const char *src = data;
     size_t i = 0;
     for (; i < n; i++) {
-        if (0 != invoke_list_func(
+        if (NULL == invoke_list_func(
             insert_element, list, index + i,
             src + (i * elem_size))) return i;
     }
@@ -329,7 +329,7 @@
 
         // insert the elements at location si
         if (ins == 1) {
-            if (0 != invoke_list_func(
+            if (NULL == invoke_list_func(
                 insert_element, list, di, src)) return inserted;
         } else {
             size_t r = invoke_list_func(insert_array, list, di, src, ins);
@@ -354,7 +354,7 @@
 void cx_list_default_sort(struct cx_list_s *list) {
     size_t elem_size = list->collection.elem_size;
     size_t list_size = list->collection.size;
-    void *tmp = malloc(elem_size * list_size);
+    void *tmp = cxMallocDefault(elem_size * list_size);
     if (tmp == NULL) abort();
 
     // copy elements from source array
@@ -377,7 +377,7 @@
         loc += elem_size;
     }
 
-    free(tmp);
+    cxFreeDefault(tmp);
 }
 
 int cx_list_default_swap(struct cx_list_s *list, size_t i, size_t j) {
@@ -387,7 +387,7 @@
 
     size_t elem_size = list->collection.elem_size;
 
-    void *tmp = malloc(elem_size);
+    void *tmp = cxMallocDefault(elem_size);
     if (tmp == NULL) return 1;
 
     void *ip = invoke_list_func(at, list, i);
@@ -397,7 +397,7 @@
     memcpy(ip, jp, elem_size);
     memcpy(jp, tmp, elem_size);
 
-    free(tmp);
+    cxFreeDefault(tmp);
 
     return 0;
 }
@@ -476,6 +476,7 @@
         CxList *list,
         size_t index
 ) {
+    if (list == NULL) list = cxEmptyList;
     CxIterator it = list->cl->iterator(list, index, false);
     it.base.mutating = true;
     return it;
@@ -485,6 +486,7 @@
         CxList *list,
         size_t index
 ) {
+    if (list == NULL) list = cxEmptyList;
     CxIterator it = list->cl->iterator(list, index, true);
     it.base.mutating = true;
     return it;
@@ -494,3 +496,24 @@
     if (list == NULL) return;
     list->cl->deallocate(list);
 }
+
+int cxListSet(
+        CxList *list,
+        size_t index,
+        const void *elem
+) {
+    if (index >= list->collection.size) {
+        return 1;
+    }
+
+    if (list->collection.store_pointer) {
+        // For pointer collections, always use climpl
+        void **target = list->climpl->at(list, index);
+        *target = (void *)elem;
+    } else {
+        void *target = list->cl->at(list, index);
+        memcpy(target, elem, list->collection.elem_size);
+    }
+
+    return 0;
+}

mercurial