use named fields to access node memory

Sun, 07 Feb 2021 21:03:30 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 07 Feb 2021 21:03:30 +0100
changeset 402
a34b93911956
parent 401
e6a8f7fb0c45
child 403
8fa43b732980

use named fields to access node memory

src/cx/linked_list.h file | annotate | diff | comparison | revisions
src/linked_list.c file | annotate | diff | comparison | revisions
     1.1 --- a/src/cx/linked_list.h	Sun Feb 07 20:37:20 2021 +0100
     1.2 +++ b/src/cx/linked_list.h	Sun Feb 07 21:03:30 2021 +0100
     1.3 @@ -34,7 +34,7 @@
     1.4  
     1.5  void *cx_linked_list_last(void **begin, void **end, ptrdiff_t loc_next);
     1.6  
     1.7 -int cx_linked_list_add(void **begin, void **end, ptrdiff_t loc_next, ptrdiff_t loc_prev, void *newnode);
     1.8 +int cx_linked_list_add(void **begin, void **end, ptrdiff_t loc_prev, ptrdiff_t loc_next, void *newnode);
     1.9  
    1.10  CxList cxLinkedListCreate(CxAllocator allocator, CxListComparator comparator, size_t itemsize);
    1.11  
     2.1 --- a/src/linked_list.c	Sun Feb 07 20:37:20 2021 +0100
     2.2 +++ b/src/linked_list.c	Sun Feb 07 21:03:30 2021 +0100
     2.3 @@ -51,7 +51,7 @@
     2.4      }
     2.5  }
     2.6  
     2.7 -int cx_linked_list_add(void **begin, void **end, ptrdiff_t loc_next, ptrdiff_t loc_prev, void *newnode) {
     2.8 +int cx_linked_list_add(void **begin, void **end, ptrdiff_t loc_prev, ptrdiff_t loc_next, void *newnode) {
     2.9      // TODO: how do we report error messages?
    2.10      if (loc_next < 0 || (begin == NULL && end == NULL)) {
    2.11          return 1;
    2.12 @@ -79,6 +79,12 @@
    2.13  
    2.14  /* HIGH LEVEL LINKED LIST IMPLEMENTATION */
    2.15  
    2.16 +struct cx_linked_list_node {
    2.17 +    void *prev;
    2.18 +    void *next;
    2.19 +    int payload;
    2.20 +};
    2.21 +
    2.22  typedef struct {
    2.23      void *begin;
    2.24      void *end;
    2.25 @@ -88,24 +94,19 @@
    2.26      cx_linked_list *listdata = list->listdata;
    2.27      CxAllocator allocator = list->allocator;
    2.28  
    2.29 -    /*
    2.30 -     * Memory layout:
    2.31 -     * next : sizeof(void*)
    2.32 -     * prev : sizeof(void*)
    2.33 -     * data : itemsize
    2.34 -     */
    2.35 -    void *node = cxMalloc(allocator,2*sizeof(void*)+list->itemsize);
    2.36 +    struct cx_linked_list_node *node = cxMalloc(allocator,
    2.37 +            sizeof(struct cx_linked_list_node) - sizeof(int) + list->itemsize);
    2.38      if (node == NULL)
    2.39          return 1;
    2.40  
    2.41 -    memset(node, 0, sizeof(void*));
    2.42 -    memcpy(node+2, elem, list->itemsize);
    2.43 +    node->next = NULL;
    2.44 +    memcpy(&node->payload, elem, list->itemsize);
    2.45  
    2.46      int ret = cx_linked_list_add(
    2.47              &listdata->begin,
    2.48              &listdata->end,
    2.49 -            0,
    2.50 -            sizeof(void*),
    2.51 +            offsetof(struct cx_linked_list_node, prev),
    2.52 +            offsetof(struct cx_linked_list_node, next),
    2.53              node
    2.54      );
    2.55      if (ret == 0) {

mercurial