src/linked_list.c

changeset 407
b447539ec255
parent 406
9cbea761fbf7
child 408
dfdd571550f8
equal deleted inserted replaced
406:9cbea761fbf7 407:b447539ec255
153 }; 153 };
154 154
155 CxList cxLinkedListCreate(CxAllocator allocator, CxListComparator comparator, size_t item_size) { 155 CxList cxLinkedListCreate(CxAllocator allocator, CxListComparator comparator, size_t item_size) {
156 CxLinkedListDesc desc; 156 CxLinkedListDesc desc;
157 desc.item_size = item_size; 157 desc.item_size = item_size;
158 desc.begin = desc.end = NULL; 158 desc.begin = NULL;
159 desc.loc_prev = offsetof(struct cx_linked_list_node, prev); 159 desc.loc_prev = offsetof(struct cx_linked_list_node, prev);
160 desc.loc_next = offsetof(struct cx_linked_list_node, next); 160 desc.loc_next = offsetof(struct cx_linked_list_node, next);
161 161
162 return cxLinkedListWrap(allocator, comparator, desc); 162 return cxLinkedListWrap(allocator, comparator, desc);
163 } 163 }
172 list->data.cmpfunc = comparator; 172 list->data.cmpfunc = comparator;
173 list->data.itemsize = desc.item_size; 173 list->data.itemsize = desc.item_size;
174 list->data.capacity = SIZE_MAX; 174 list->data.capacity = SIZE_MAX;
175 175
176 cx_linked_list *ll = (cx_linked_list *) list->data.listdata; 176 cx_linked_list *ll = (cx_linked_list *) list->data.listdata;
177 ll->begin = desc.begin ? *desc.begin : NULL; 177 ll->begin = desc.begin;
178 ll->end = desc.end ? *desc.end : NULL;
179 ll->loc_prev = desc.loc_prev; 178 ll->loc_prev = desc.loc_prev;
180 ll->loc_next = desc.loc_next; 179 ll->loc_next = desc.loc_next;
181 cxLinkedListRecalculateSize(list); 180 cxLinkedListRecalculateSize(list);
182 181
183 return list; 182 return list;
186 size_t cxLinkedListRecalculateSize(CxList list) { 185 size_t cxLinkedListRecalculateSize(CxList list) {
187 cx_linked_list *ll = (cx_linked_list *) list->data.listdata; 186 cx_linked_list *ll = (cx_linked_list *) list->data.listdata;
188 187
189 if (ll->begin == NULL) { 188 if (ll->begin == NULL) {
190 list->data.size = 0; 189 list->data.size = 0;
190 ll->end = NULL;
191 return 0; 191 return 0;
192 } else { 192 } else {
193 void *cur = ll->begin; 193 void *cur = ll->begin;
194 void *last;
194 size_t size; 195 size_t size;
195 do { 196 do {
197 last = cur;
196 size++; 198 size++;
197 } while ((cur = *CX_LL_PTR(cur, ll->loc_next)) != NULL); 199 } while ((cur = *CX_LL_PTR(cur, ll->loc_next)) != NULL);
200 ll->end = last;
198 list->data.size = size; 201 list->data.size = size;
199 return size; 202 return size;
200 } 203 }
201 } 204 }

mercurial