src/list.c

changeset 1428
0ac4aa1737fd
parent 1426
3a89b31f0724
child 1429
6e0c3a8a914a
--- a/src/list.c	Fri Oct 17 14:14:21 2025 +0200
+++ b/src/list.c	Fri Oct 17 15:04:56 2025 +0200
@@ -597,17 +597,24 @@
 }
 
 int cxListInsertSorted(CxList *list, const void *elem) {
-    assert(list->collection.sorted || list->collection.size == 0);
+    assert(cxCollectionSorted(list));
     list->collection.sorted = true;
     const void *data = list->collection.store_pointer ? &elem : elem;
     return list->cl->insert_sorted(list, data, 1) == 0;
 }
 
 int cxListInsertUnique(CxList *list, const void *elem) {
-    assert(list->collection.sorted || list->collection.size == 0);
-    list->collection.sorted = true;
-    const void *data = list->collection.store_pointer ? &elem : elem;
-    return list->cl->insert_unique(list, data, 1) == 0;
+    if (cxCollectionSorted(list)) {
+        list->collection.sorted = true;
+        const void *data = list->collection.store_pointer ? &elem : elem;
+        return list->cl->insert_unique(list, data, 1) == 0;
+    } else {
+        if (cxListContains(list, elem)) {
+            return 0;
+        } else {
+            return cxListAdd(list, elem);
+        }
+    }
 }
 
 size_t cxListInsertArray(CxList *list, size_t index, const void *array, size_t n) {
@@ -616,15 +623,30 @@
 }
 
 size_t cxListInsertSortedArray(CxList *list, const void *array, size_t n) {
-    assert(list->collection.sorted || list->collection.size == 0);
+    assert(cxCollectionSorted(list));
     list->collection.sorted = true;
     return list->cl->insert_sorted(list, array, n);
 }
 
 size_t cxListInsertUniqueArray(CxList *list, const void *array, size_t n) {
-    assert(list->collection.sorted || list->collection.size == 0);
-    list->collection.sorted = true;
-    return list->cl->insert_unique(list, array, n);
+    if (cxCollectionSorted(list)) {
+        list->collection.sorted = true;
+        return list->cl->insert_unique(list, array, n);
+    } else {
+        const char *source = array;
+        for (size_t i = 0 ; i < n; i++) {
+            // note: this also checks elements added in a previous iteration
+            const void *data = list->collection.store_pointer ?
+                    *((const void**)source) : source;
+            if (!cxListContains(list, data)) {
+                if (cxListAdd(list, data)) {
+                    return i; // LCOV_EXCL_LINE
+                }
+            }
+            source += list->collection.elem_size;
+        }
+        return n;
+    }
 }
 
 int cxListInsertAfter(CxIterator *iter, const void *elem) {

mercurial