36 |
36 |
37 static int cx_pl_cmpfunc( |
37 static int cx_pl_cmpfunc( |
38 const void *l, |
38 const void *l, |
39 const void *r |
39 const void *r |
40 ) { |
40 ) { |
|
41 // l and r are guaranteed to be non-NULL pointing to the list's memory |
41 void *const *lptr = l; |
42 void *const *lptr = l; |
42 void *const *rptr = r; |
43 void *const *rptr = r; |
43 const void *left = lptr == NULL ? NULL : *lptr; |
44 const void *left = *lptr; |
44 const void *right = rptr == NULL ? NULL : *rptr; |
45 const void *right = *rptr; |
|
46 if (left == NULL) { |
|
47 // NULL is smaller than any value except NULL |
|
48 return right == NULL ? 0 : -1; |
|
49 } else if (right == NULL) { |
|
50 // any value is larger than NULL |
|
51 return 1; |
|
52 } |
45 return cx_pl_cmpfunc_impl(left, right); |
53 return cx_pl_cmpfunc_impl(left, right); |
46 } |
54 } |
47 |
55 |
48 static void cx_pl_hack_cmpfunc(const struct cx_list_s *list) { |
56 static void cx_pl_hack_cmpfunc(const struct cx_list_s *list) { |
49 // cast away const - this is the hacky thing |
57 // cast away const - this is the hacky thing |
295 const char *src = data; |
303 const char *src = data; |
296 size_t i = 0; |
304 size_t i = 0; |
297 for (; i < n; i++) { |
305 for (; i < n; i++) { |
298 if (NULL == invoke_list_func( |
306 if (NULL == invoke_list_func( |
299 insert_element, list, index + i, |
307 insert_element, list, index + i, |
300 src + (i * elem_size))) return i; |
308 src + i * elem_size) |
|
309 ) { |
|
310 return i; // LCOV_EXCL_LINE |
|
311 } |
301 } |
312 } |
302 return i; |
313 return i; |
303 } |
314 } |
304 |
315 |
305 static size_t cx_list_default_insert_sorted_impl( |
316 static size_t cx_list_default_insert_sorted_impl( |
355 ins++; |
368 ins++; |
356 } |
369 } |
357 |
370 |
358 // insert the elements at location si |
371 // insert the elements at location si |
359 if (ins == 1) { |
372 if (ins == 1) { |
360 if (NULL == invoke_list_func( |
373 if (NULL == invoke_list_func(insert_element, list, di, src)) { |
361 insert_element, list, di, src)) return inserted; |
374 return inserted; // LCOV_EXCL_LINE |
|
375 } |
362 } else { |
376 } else { |
363 size_t r = invoke_list_func(insert_array, list, di, src, ins); |
377 size_t r = invoke_list_func(insert_array, list, di, src, ins); |
364 if (r < ins) return inserted + r; |
378 if (r < ins) { |
|
379 return inserted + r; // LCOV_EXCL_LINE |
|
380 } |
365 } |
381 } |
366 inserted += ins; |
382 inserted += ins; |
367 di += ins; |
383 di += ins; |
368 |
384 |
369 // everything inserted? |
385 // everything inserted? |
370 if (inserted == n) return inserted; |
386 if (inserted == n) { |
|
387 return inserted; |
|
388 } |
371 src = next; |
389 src = next; |
372 } |
390 } |
373 |
391 |
374 // insert remaining items |
392 // insert remaining items |
375 if (si < n) { |
393 if (si < n) { |
397 |
415 |
398 void cx_list_default_sort(struct cx_list_s *list) { |
416 void cx_list_default_sort(struct cx_list_s *list) { |
399 size_t elem_size = list->collection.elem_size; |
417 size_t elem_size = list->collection.elem_size; |
400 size_t list_size = list->collection.size; |
418 size_t list_size = list->collection.size; |
401 void *tmp = cxMallocDefault(elem_size * list_size); |
419 void *tmp = cxMallocDefault(elem_size * list_size); |
402 if (tmp == NULL) abort(); |
420 if (tmp == NULL) abort(); // LCOV_EXCL_LINE |
403 |
421 |
404 // copy elements from source array |
422 // copy elements from source array |
405 char *loc = tmp; |
423 char *loc = tmp; |
406 for (size_t i = 0; i < list_size; i++) { |
424 for (size_t i = 0; i < list_size; i++) { |
407 void *src = invoke_list_func(at, list, i); |
425 void *src = invoke_list_func(at, list, i); |
430 if (j >= list->collection.size) return 1; |
448 if (j >= list->collection.size) return 1; |
431 |
449 |
432 size_t elem_size = list->collection.elem_size; |
450 size_t elem_size = list->collection.elem_size; |
433 |
451 |
434 void *tmp = cxMallocDefault(elem_size); |
452 void *tmp = cxMallocDefault(elem_size); |
435 if (tmp == NULL) return 1; |
453 if (tmp == NULL) return 1; // LCOV_EXCL_LINE |
436 |
454 |
437 void *ip = invoke_list_func(at, list, i); |
455 void *ip = invoke_list_func(at, list, i); |
438 void *jp = invoke_list_func(at, list, j); |
456 void *jp = invoke_list_func(at, list, j); |
439 |
457 |
440 memcpy(tmp, ip, elem_size); |
458 memcpy(tmp, ip, elem_size); |