ucx/list.c

branch
dav-2
changeset 894
e86049631677
parent 891
4d58cbcc9efa
equal deleted inserted replaced
893:38800d479cd4 894:e86049631677
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;

mercurial