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