typedef struct ALFListHeader { struct ALFListHeader *prev; struct ALFListHeader *next; } ALFListHeader; #define ALF_LIST_CONTAINER(ContainerType, containermember, listp) \ ((ContainerType *)((char *)(listp) - offsetof(ContainerType, containermember))) #define ALF_FOR_LIST(ContainerType, containermember, listp, iteratorvar) \ for (ALFListHeader *alf_list_##iteratorvar##_curr = (listp)->next, \ *alf_list_##iteratorvar##_next = alf_list_##iteratorvar##_curr->next; \ alf_list_##iteratorvar##_curr != (listp); \ alf_list_##iteratorvar##_curr = alf_list_##iteratorvar##_next, \ alf_list_##iteratorvar##_next = alf_list_##iteratorvar##_curr->next) \ for (ContainerType *iteratorvar = (ContainerType *)((char *)alf_list_##iteratorvar##_curr - offsetof(ContainerType, containermember)); \ iteratorvar; iteratorvar = NULL) \ static inline BOOL ALF_ListIsEmpty(ALFListHeader *list) { return list->next == list; } static inline void ALF_ListInsert(ALFListHeader *list, ALFListHeader *newel) { newel->prev = list; newel->next = list->next; newel->next->prev = newel; list->next = newel; } static inline void ALF_ListRemove(ALFListHeader *member) { member->prev->next = member->next; member->next->prev = member->prev; member->next = NULL; member->prev = NULL; } static inline void ALF_ListInit(ALFListHeader *list) { list->next = list->prev = list; }