Sun, 07 Feb 2021 21:03:30 +0100
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) {