src/list.c

changeset 1428
0ac4aa1737fd
parent 1426
3a89b31f0724
child 1429
6e0c3a8a914a
equal deleted inserted replaced
1427:943bfd9e7978 1428:0ac4aa1737fd
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;

mercurial