1.1 --- a/src/linked_list.c Tue Dec 28 14:25:05 2021 +0100 1.2 +++ b/src/linked_list.c Tue Dec 28 17:24:18 2021 +0100 1.3 @@ -613,13 +613,36 @@ 1.4 true, list->cmpfunc); 1.5 } 1.6 1.7 +static int cx_ll_compare( 1.8 + cx_list_s *list, 1.9 + cx_list_s *other 1.10 +) { 1.11 + cx_linked_list *left = (cx_linked_list *) list; 1.12 + cx_linked_list *right = (cx_linked_list *) other; 1.13 + return cx_linked_list_compare(left->begin, right->begin, 1.14 + CX_LL_LOC_NEXT, CX_LL_LOC_DATA, 1.15 + false, list->cmpfunc); 1.16 +} 1.17 + 1.18 +static int cx_pll_compare( 1.19 + cx_list_s *list, 1.20 + cx_list_s *other 1.21 +) { 1.22 + cx_linked_list *left = (cx_linked_list *) list; 1.23 + cx_linked_list *right = (cx_linked_list *) other; 1.24 + return cx_linked_list_compare(left->begin, right->begin, 1.25 + CX_LL_LOC_NEXT, CX_LL_LOC_DATA, 1.26 + true, list->cmpfunc); 1.27 +} 1.28 + 1.29 static cx_list_class cx_linked_list_class = { 1.30 cx_ll_add, 1.31 cx_ll_insert, 1.32 cx_ll_remove, 1.33 cx_ll_at, 1.34 cx_ll_find, 1.35 - cx_ll_sort 1.36 + cx_ll_sort, 1.37 + cx_ll_compare 1.38 }; 1.39 1.40 static cx_list_class cx_pointer_linked_list_class = { 1.41 @@ -628,7 +651,8 @@ 1.42 cx_ll_remove, 1.43 cx_pll_at, 1.44 cx_pll_find, 1.45 - cx_pll_sort 1.46 + cx_pll_sort, 1.47 + cx_pll_compare 1.48 }; 1.49 1.50 CxList cxLinkedListCreate( 1.51 @@ -674,6 +698,24 @@ 1.52 return (CxList) list; 1.53 } 1.54 1.55 +CxList cxLinkedListFromArray( 1.56 + CxAllocator allocator, 1.57 + CxListComparator comparator, 1.58 + size_t item_size, 1.59 + size_t num_items, 1.60 + const void *array 1.61 +) { 1.62 + CxList list = cxLinkedListCreate(allocator, comparator, item_size); 1.63 + if (list == NULL) return NULL; 1.64 + for (size_t i = 0; i < num_items; i++) { 1.65 + if (0 != cxListAdd(list, ((const unsigned char *) array) + i * item_size)) { 1.66 + cxLinkedListDestroy(list); 1.67 + return NULL; 1.68 + } 1.69 + } 1.70 + return list; 1.71 +} 1.72 + 1.73 void cxLinkedListDestroy(CxList list) { 1.74 cx_linked_list *ll = (cx_linked_list *) list; 1.75