diff options
Diffstat (limited to 'alf/alflist.h')
| -rw-r--r-- | alf/alflist.h | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/alf/alflist.h b/alf/alflist.h new file mode 100644 index 0000000..e0de033 --- /dev/null +++ b/alf/alflist.h @@ -0,0 +1,50 @@ + +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##_next->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; +} + + |
