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)))
31 #if ENABLE_EXTRA_CHECKS
41 list->next = list->prev = DLIST_FAKE(list);
42 DLIST_FUNC(check)(list);
47 return list->next == DLIST_FAKE(list) ? NULL : list->next;
52 return list->prev == DLIST_FAKE(list) ? NULL : list->prev;
55 static inline DLIST_TYPE *DLIST_FUNC(next)(
DLIST_LIST_TYPE *list, DLIST_TYPE *item)
57 return item->next == DLIST_FAKE(list) ? NULL : item->next;
60 static inline DLIST_TYPE *DLIST_FUNC(prev)(
DLIST_LIST_TYPE *list, DLIST_TYPE *item)
62 return item->prev == DLIST_FAKE(list) ? NULL : item->prev;
65 static inline void DLIST_FUNC(prepend)(
DLIST_LIST_TYPE *list, DLIST_TYPE *item)
67 DLIST_FUNC(check)(list);
68 assert(item->next == NULL && item->prev == NULL);
69 list->next->prev = item;
70 item->next = list->next;
71 item->prev = DLIST_FAKE(list);
73 assert(item->next != NULL && item->prev != NULL);
74 DLIST_FUNC(check)(list);
77 static inline void DLIST_FUNC(append)(
DLIST_LIST_TYPE *list, DLIST_TYPE *item)
79 DLIST_FUNC(check)(list);
80 assert(item->next == NULL && item->prev == NULL);
81 list->prev->next = item;
82 item->prev = list->prev;
83 item->next = DLIST_FAKE(list);
85 assert(item->next != NULL && item->prev != NULL);
86 DLIST_FUNC(check)(list);
89 static inline void DLIST_FUNC(
remove)(
DLIST_LIST_TYPE *list, DLIST_TYPE *item)
91 DLIST_TYPE *prev = item->prev, *next = item->next;
92 DLIST_FUNC(check)(list);
99 DLIST_FUNC(check)(list);
102 static inline bool DLIST_FUNC(in_list)(
DLIST_LIST_TYPE *list, DLIST_TYPE *item)
104 DLIST_FUNC(check)(list);
105 return item->prev != NULL || item->next != NULL;
111 #undef DLIST_LIST_TYPE
Definition: dlist.tmpl.h:24