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; |