src/list.c

changeset 1433
81c301a59b7c
parent 1429
6e0c3a8a914a
equal deleted inserted replaced
1432:fb82e7a92258 1433:81c301a59b7c
298 struct cx_list_s *list, 298 struct cx_list_s *list,
299 size_t index, 299 size_t index,
300 const void *data, 300 const void *data,
301 size_t n 301 size_t n
302 ) { 302 ) {
303 size_t elem_size = list->collection.elem_size;
304 const char *src = data; 303 const char *src = data;
305 size_t i = 0; 304 size_t i = 0;
306 for (; i < n; i++) { 305 for (; i < n; i++) {
307 if (NULL == invoke_list_func( 306 if (NULL == invoke_list_func(
308 insert_element, list, index + i, 307 insert_element, list, index + i, src)
309 src + i * elem_size)
310 ) { 308 ) {
311 return i; // LCOV_EXCL_LINE 309 return i; // LCOV_EXCL_LINE
310 }
311 if (src != NULL) {
312 src += list->collection.elem_size;
312 } 313 }
313 } 314 }
314 return i; 315 return i;
315 } 316 }
316 317
594 void *cxListEmplace(CxList *list) { 595 void *cxListEmplace(CxList *list) {
595 list->collection.sorted = false; 596 list->collection.sorted = false;
596 return list->cl->insert_element(list, list->collection.size, NULL); 597 return list->cl->insert_element(list, list->collection.size, NULL);
597 } 598 }
598 599
600 static bool cx_list_emplace_iterator_valid(const void *it) {
601 const CxIterator *iter = it;
602 return iter->index < iter->elem_count;
603 }
604
605 CxIterator cxListEmplaceArrayAt(CxList *list, size_t index, size_t n) {
606 list->collection.sorted = false;
607 size_t c = list->cl->insert_array(list, index, NULL, n);
608 CxIterator iter = list->cl->iterator(list, index, false);
609 // tweak the fields of this iterator
610 iter.elem_count = c;
611 iter.index = 0;
612 // replace the valid function to abort iteration when c is reached
613 iter.base.valid = cx_list_emplace_iterator_valid;
614 // if we are storing pointers, we want to return the pure pointers.
615 // therefore, we must unwrap the "current" method
616 if (list->collection.store_pointer) {
617 iter.base.current = iter.base.current_impl;
618 }
619 return iter;
620 }
621
622 CxIterator cxListEmplaceArray(CxList *list, size_t n) {
623 return cxListEmplaceArrayAt(list, list->collection.size, n);
624 }
625
599 int cxListInsertSorted(CxList *list, const void *elem) { 626 int cxListInsertSorted(CxList *list, const void *elem) {
600 assert(cxCollectionSorted(list)); 627 assert(cxCollectionSorted(list));
601 list->collection.sorted = true; 628 list->collection.sorted = true;
602 const void *data = list->collection.store_pointer ? &elem : elem; 629 const void *data = list->collection.store_pointer ? &elem : elem;
603 return list->cl->insert_sorted(list, data, 1) == 0; 630 return list->cl->insert_sorted(list, data, 1) == 0;

mercurial