| 61 |
61 |
| 62 #define cx_list_compare_wrapper(l, r, c) cx_list_compare_wrapper(l, r, (void*)c) |
62 #define cx_list_compare_wrapper(l, r, c) cx_list_compare_wrapper(l, r, (void*)c) |
| 63 |
63 |
| 64 // <editor-fold desc="empty list implementation"> |
64 // <editor-fold desc="empty list implementation"> |
| 65 |
65 |
| 66 static void cx_emptyl_noop(cx_attr_unused CxList *list) { |
66 static void cx_emptyl_noop(CX_UNUSED CxList *list) { |
| 67 // this is a noop, but MUST be implemented |
67 // this is a noop, but MUST be implemented |
| 68 } |
68 } |
| 69 |
69 |
| 70 static void *cx_emptyl_at( |
70 static void *cx_emptyl_at( |
| 71 cx_attr_unused const struct cx_list_s *list, |
71 CX_UNUSED const struct cx_list_s *list, |
| 72 cx_attr_unused size_t index |
72 CX_UNUSED size_t index |
| 73 ) { |
73 ) { |
| 74 return NULL; |
74 return NULL; |
| 75 } |
75 } |
| 76 |
76 |
| 77 static size_t cx_emptyl_find_remove( |
77 static size_t cx_emptyl_find_remove( |
| 78 cx_attr_unused struct cx_list_s *list, |
78 CX_UNUSED struct cx_list_s *list, |
| 79 cx_attr_unused const void *elem, |
79 CX_UNUSED const void *elem, |
| 80 cx_attr_unused bool remove |
80 CX_UNUSED bool remove |
| 81 ) { |
81 ) { |
| 82 return 0; |
82 return 0; |
| 83 } |
83 } |
| 84 |
84 |
| 85 static bool cx_emptyl_iter_valid(cx_attr_unused const void *iter) { |
85 static bool cx_emptyl_iter_valid(CX_UNUSED const void *iter) { |
| 86 return false; |
86 return false; |
| 87 } |
87 } |
| 88 |
88 |
| 89 static CxIterator cx_emptyl_iterator( |
89 static CxIterator cx_emptyl_iterator( |
| 90 const struct cx_list_s *list, |
90 const struct cx_list_s *list, |
| 91 size_t index, |
91 size_t index, |
| 92 cx_attr_unused bool backwards |
92 CX_UNUSED bool backwards |
| 93 ) { |
93 ) { |
| 94 CxIterator iter = {0}; |
94 CxIterator iter = {0}; |
| 95 iter.src_handle = (void*) list; |
95 iter.src_handle = (void*) list; |
| 96 iter.index = index; |
96 iter.index = index; |
| 97 iter.base.valid = cx_emptyl_iter_valid; |
97 iter.base.valid = cx_emptyl_iter_valid; |
| 145 size_t n |
145 size_t n |
| 146 ) { |
146 ) { |
| 147 const char *src = data; |
147 const char *src = data; |
| 148 size_t i = 0; |
148 size_t i = 0; |
| 149 for (; i < n; i++) { |
149 for (; i < n; i++) { |
| 150 if (NULL == list->cl->insert_element(list, index + i, src) |
150 if (NULL == list->cl->insert_element(list, index + i, src)) { |
| 151 ) { |
|
| 152 return i; // LCOV_EXCL_LINE |
151 return i; // LCOV_EXCL_LINE |
| 153 } |
152 } |
| 154 if (src != NULL) { |
153 if (src != NULL) { |
| 155 src += list->collection.elem_size; |
154 src += list->collection.elem_size; |
| 156 } |
155 } |
| 337 cxFreeDefault(tmp); |
336 cxFreeDefault(tmp); |
| 338 |
337 |
| 339 return 0; |
338 return 0; |
| 340 } |
339 } |
| 341 |
340 |
| |
341 static int cx_list_cmpfunc2_safe_memcmp(const void *a, const void *b, void *c) { |
| |
342 // it is not safe to store a pointer to the size in the list |
| |
343 // because the entire list structure might get reallocated |
| |
344 size_t elem_size = (size_t)(uintptr_t)c; |
| |
345 return memcmp(a, b, elem_size); |
| |
346 } |
| |
347 |
| 342 void cx_list_init( |
348 void cx_list_init( |
| 343 struct cx_list_s *list, |
349 struct cx_list_s *list, |
| 344 struct cx_list_class_s *cl, |
350 struct cx_list_class_s *cl, |
| 345 const struct cx_allocator_s *allocator, |
351 const struct cx_allocator_s *allocator, |
| 346 size_t elem_size |
352 size_t elem_size |
| 350 list->collection.size = 0; |
356 list->collection.size = 0; |
| 351 list->collection.sorted = false; // should be set by the implementation |
357 list->collection.sorted = false; // should be set by the implementation |
| 352 if (elem_size > 0) { |
358 if (elem_size > 0) { |
| 353 list->collection.elem_size = elem_size; |
359 list->collection.elem_size = elem_size; |
| 354 list->collection.simple_cmp = NULL; |
360 list->collection.simple_cmp = NULL; |
| 355 list->collection.advanced_cmp = cx_ccmp_memcmp; |
361 list->collection.advanced_cmp = cx_list_cmpfunc2_safe_memcmp; |
| 356 list->collection.cmp_data = &list->collection.elem_size; |
362 list->collection.cmp_data = (void*)(uintptr_t)list->collection.elem_size; |
| 357 list->collection.store_pointer = false; |
363 list->collection.store_pointer = false; |
| 358 } else { |
364 } else { |
| 359 list->collection.elem_size = sizeof(void *); |
365 list->collection.elem_size = sizeof(void *); |
| 360 list->collection.simple_cmp = cx_cmp_ptr; |
366 list->collection.simple_cmp = cx_cmp_ptr; |
| 361 list->collection.advanced_cmp = NULL; |
367 list->collection.advanced_cmp = NULL; |