src/list.c

changeset 666
b5dd654deb3b
parent 664
af5bf4603a5d
child 677
b09aae58bba4
equal deleted inserted replaced
665:c4041b07165e 666:b5dd654deb3b
189 list->itemsize = sizeof(void *); 189 list->itemsize = sizeof(void *);
190 list->climpl = list->cl; 190 list->climpl = list->cl;
191 list->cl = &cx_pointer_list_class; 191 list->cl = &cx_pointer_list_class;
192 } 192 }
193 193
194 bool cxListIsStoringPointers(CxList *list) { 194 bool cxListIsStoringPointers(CxList const *list) {
195 return list->climpl != NULL; 195 return list->climpl != NULL;
196 } 196 }
197 197
198 // </editor-fold> 198 // </editor-fold>
199 199
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:

mercurial