595 list->collection.sorted = false; |
595 list->collection.sorted = false; |
596 return list->cl->insert_element(list, list->collection.size, NULL); |
596 return list->cl->insert_element(list, list->collection.size, NULL); |
597 } |
597 } |
598 |
598 |
599 int cxListInsertSorted(CxList *list, const void *elem) { |
599 int cxListInsertSorted(CxList *list, const void *elem) { |
600 assert(list->collection.sorted || list->collection.size == 0); |
600 assert(cxCollectionSorted(list)); |
601 list->collection.sorted = true; |
601 list->collection.sorted = true; |
602 const void *data = list->collection.store_pointer ? &elem : elem; |
602 const void *data = list->collection.store_pointer ? &elem : elem; |
603 return list->cl->insert_sorted(list, data, 1) == 0; |
603 return list->cl->insert_sorted(list, data, 1) == 0; |
604 } |
604 } |
605 |
605 |
606 int cxListInsertUnique(CxList *list, const void *elem) { |
606 int cxListInsertUnique(CxList *list, const void *elem) { |
607 assert(list->collection.sorted || list->collection.size == 0); |
607 if (cxCollectionSorted(list)) { |
608 list->collection.sorted = true; |
608 list->collection.sorted = true; |
609 const void *data = list->collection.store_pointer ? &elem : elem; |
609 const void *data = list->collection.store_pointer ? &elem : elem; |
610 return list->cl->insert_unique(list, data, 1) == 0; |
610 return list->cl->insert_unique(list, data, 1) == 0; |
|
611 } else { |
|
612 if (cxListContains(list, elem)) { |
|
613 return 0; |
|
614 } else { |
|
615 return cxListAdd(list, elem); |
|
616 } |
|
617 } |
611 } |
618 } |
612 |
619 |
613 size_t cxListInsertArray(CxList *list, size_t index, const void *array, size_t n) { |
620 size_t cxListInsertArray(CxList *list, size_t index, const void *array, size_t n) { |
614 list->collection.sorted = false; |
621 list->collection.sorted = false; |
615 return list->cl->insert_array(list, index, array, n); |
622 return list->cl->insert_array(list, index, array, n); |
616 } |
623 } |
617 |
624 |
618 size_t cxListInsertSortedArray(CxList *list, const void *array, size_t n) { |
625 size_t cxListInsertSortedArray(CxList *list, const void *array, size_t n) { |
619 assert(list->collection.sorted || list->collection.size == 0); |
626 assert(cxCollectionSorted(list)); |
620 list->collection.sorted = true; |
627 list->collection.sorted = true; |
621 return list->cl->insert_sorted(list, array, n); |
628 return list->cl->insert_sorted(list, array, n); |
622 } |
629 } |
623 |
630 |
624 size_t cxListInsertUniqueArray(CxList *list, const void *array, size_t n) { |
631 size_t cxListInsertUniqueArray(CxList *list, const void *array, size_t n) { |
625 assert(list->collection.sorted || list->collection.size == 0); |
632 if (cxCollectionSorted(list)) { |
626 list->collection.sorted = true; |
633 list->collection.sorted = true; |
627 return list->cl->insert_unique(list, array, n); |
634 return list->cl->insert_unique(list, array, n); |
|
635 } else { |
|
636 const char *source = array; |
|
637 for (size_t i = 0 ; i < n; i++) { |
|
638 // note: this also checks elements added in a previous iteration |
|
639 const void *data = list->collection.store_pointer ? |
|
640 *((const void**)source) : source; |
|
641 if (!cxListContains(list, data)) { |
|
642 if (cxListAdd(list, data)) { |
|
643 return i; // LCOV_EXCL_LINE |
|
644 } |
|
645 } |
|
646 source += list->collection.elem_size; |
|
647 } |
|
648 return n; |
|
649 } |
628 } |
650 } |
629 |
651 |
630 int cxListInsertAfter(CxIterator *iter, const void *elem) { |
652 int cxListInsertAfter(CxIterator *iter, const void *elem) { |
631 CxList* list = (CxList*)iter->src_handle.m; |
653 CxList* list = (CxList*)iter->src_handle.m; |
632 list->collection.sorted = false; |
654 list->collection.sorted = false; |