| 201 CxList const *list, |
201 CxList const *list, |
| 202 void *elem |
202 void *elem |
| 203 ) { |
203 ) { |
| 204 switch (list->content_destructor_type) { |
204 switch (list->content_destructor_type) { |
| 205 case CX_DESTRUCTOR_SIMPLE: { |
205 case CX_DESTRUCTOR_SIMPLE: { |
| 206 list->simple_destructor(elem); |
206 cx_list_invoke_simple_destructor(list, elem); |
| 207 break; |
207 break; |
| 208 } |
208 } |
| 209 case CX_DESTRUCTOR_ADVANCED: { |
209 case CX_DESTRUCTOR_ADVANCED: { |
| 210 list->advanced_destructor.func(list->advanced_destructor.data, elem); |
210 cx_list_invoke_advanced_destructor(list, elem); |
| 211 break; |
211 break; |
| 212 } |
212 } |
| 213 case CX_DESTRUCTOR_NONE: |
213 case CX_DESTRUCTOR_NONE: |
| 214 break; // nothing |
214 break; // nothing |
| 215 } |
215 } |
| |
216 } |
| |
217 |
| |
218 void cx_list_invoke_simple_destructor( |
| |
219 CxList const *list, |
| |
220 void *elem |
| |
221 ) { |
| |
222 if (cxListIsStoringPointers(list)) { |
| |
223 elem = *((void **) elem); |
| |
224 } |
| |
225 list->simple_destructor(elem); |
| |
226 } |
| |
227 |
| |
228 void cx_list_invoke_advanced_destructor( |
| |
229 CxList const *list, |
| |
230 void *elem |
| |
231 ) { |
| |
232 if (cxListIsStoringPointers(list)) { |
| |
233 elem = *((void **) elem); |
| |
234 } |
| |
235 list->advanced_destructor.func(list->advanced_destructor.data, elem); |
| 216 } |
236 } |
| 217 |
237 |
| 218 void cxListDestroy(CxList *list) { |
238 void cxListDestroy(CxList *list) { |
| 219 switch (list->content_destructor_type) { |
239 switch (list->content_destructor_type) { |
| 220 case CX_DESTRUCTOR_SIMPLE: { |
240 case CX_DESTRUCTOR_SIMPLE: { |
| 221 CxIterator iter = cxListIterator(list); |
241 CxIterator iter = cxListIterator(list); |
| 222 cx_foreach(void*, elem, iter) { |
242 cx_foreach(void*, elem, iter) { |
| |
243 // already correctly resolved pointer - immediately invoke dtor |
| 223 list->simple_destructor(elem); |
244 list->simple_destructor(elem); |
| 224 } |
245 } |
| 225 break; |
246 break; |
| 226 } |
247 } |
| 227 case CX_DESTRUCTOR_ADVANCED: { |
248 case CX_DESTRUCTOR_ADVANCED: { |
| 228 CxIterator iter = cxListIterator(list); |
249 CxIterator iter = cxListIterator(list); |
| 229 cx_foreach(void*, elem, iter) { |
250 cx_foreach(void*, elem, iter) { |
| |
251 // already correctly resolved pointer - immediately invoke dtor |
| 230 list->advanced_destructor.func(list->advanced_destructor.data, elem); |
252 list->advanced_destructor.func(list->advanced_destructor.data, elem); |
| 231 } |
253 } |
| 232 break; |
254 break; |
| 233 } |
255 } |
| 234 case CX_DESTRUCTOR_NONE: |
256 case CX_DESTRUCTOR_NONE: |