src/linked_list.c

changeset 488
9138acaa494b
parent 487
4bd19279778c
child 489
af6be1e123aa
     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  

mercurial