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 } |