20 #if !defined(DLIST_FUNC) || !defined(DLIST_TYPE) || !defined(DLIST_LIST_TYPE)
21 #error Required defines missing!
26 DLIST_FIELDS(DLIST_TYPE);
29 #define DLIST_FAKE(list) ((DLIST_TYPE *) (((char *) (list)) - TDS_OFFSET(DLIST_TYPE, next)))
33 list->next = list->prev = DLIST_FAKE(list);
38 #if ENABLE_EXTRA_CHECKS
39 DLIST_TYPE *item = list->next;
40 DLIST_TYPE *end = DLIST_FAKE(list);
43 assert(item->prev->next == item);
44 assert(item->next->prev == item);
46 }
while (item != end);
52 return list->next == DLIST_FAKE(list) ? NULL : list->next;
57 return list->prev == DLIST_FAKE(list) ? NULL : list->prev;
60 static inline DLIST_TYPE *DLIST_FUNC(next)(
DLIST_LIST_TYPE *list, DLIST_TYPE *item)
62 return item->next == DLIST_FAKE(list) ? NULL : item->next;
65 static inline DLIST_TYPE *DLIST_FUNC(prev)(
DLIST_LIST_TYPE *list, DLIST_TYPE *item)
67 return item->prev == DLIST_FAKE(list) ? NULL : item->prev;
70 static inline void DLIST_FUNC(prepend)(
DLIST_LIST_TYPE *list, DLIST_TYPE *item)
72 DLIST_FUNC(check)(list);
73 assert(item->next == NULL && item->prev == NULL);
74 list->next->prev = item;
75 item->next = list->next;
76 item->prev = DLIST_FAKE(list);
78 assert(item->next != NULL && item->prev != NULL);
79 DLIST_FUNC(check)(list);
82 static inline void DLIST_FUNC(append)(
DLIST_LIST_TYPE *list, DLIST_TYPE *item)
84 DLIST_FUNC(check)(list);
85 assert(item->next == NULL && item->prev == NULL);
86 list->prev->next = item;
87 item->prev = list->prev;
88 item->next = DLIST_FAKE(list);
90 assert(item->next != NULL && item->prev != NULL);
91 DLIST_FUNC(check)(list);
94 static inline void DLIST_FUNC(
remove)(
DLIST_LIST_TYPE *list, DLIST_TYPE *item)
96 DLIST_TYPE *prev = item->prev, *next = item->next;
97 DLIST_FUNC(check)(list);
104 DLIST_FUNC(check)(list);
107 static inline bool DLIST_FUNC(in_list)(
DLIST_LIST_TYPE *list, DLIST_TYPE *item)
109 DLIST_FUNC(check)(list);
110 return item->prev != NULL || item->next != NULL;
116 #undef DLIST_LIST_TYPE
Definition: dlist.tmpl.h:24