27 */ |
27 */ |
28 |
28 |
29 #include "cx/list.h" |
29 #include "cx/list.h" |
30 |
30 |
31 CxList *cxListDestroy(CxList *list) { |
31 CxList *cxListDestroy(CxList *list) { |
32 if (list->content_destructor == NULL) { |
32 if (list->content_destructor != NULL) { |
33 if (list->autofree_contents) { |
33 CxIterator iter = cxListBegin(list); |
34 CxIterator iter = cxListBegin(list); |
34 cx_foreach(void*, elem, iter) { |
35 cx_foreach(void*, elem, iter) { |
35 cxFree(list->allocator, list->content_destructor(elem)); |
36 cxFree(list->allocator, elem); |
|
37 } |
|
38 } |
|
39 } else { |
|
40 // avoid checking this condition every loop iteration |
|
41 if (list->autofree_contents) { |
|
42 CxIterator iter = cxListBegin(list); |
|
43 cx_foreach(void*, elem, iter) { |
|
44 cxFree(list->allocator, list->content_destructor(elem)); |
|
45 } |
|
46 } else { |
|
47 CxIterator iter = cxListBegin(list); |
|
48 cx_foreach(void*, elem, iter) { |
|
49 elem = list->content_destructor(elem); |
|
50 } |
|
51 } |
36 } |
52 } |
37 } |
53 list->cl->destructor(list); |
38 list->cl->destructor(list); |
54 cxFree(list->allocator, list); |
39 cxFree(list->allocator, list); |
55 return NULL; |
40 return NULL; |