20 #if !defined(DLIST_NAME) || !defined(DLIST_TYPE) || !defined(DLIST_LIST_TYPE)
21 #error Required defines missing!
30 #define DLIST_ITEM(ring) ((DLIST_TYPE *) (((char *) (ring)) - TDS_OFFSET(DLIST_TYPE, DLIST_NAME(item))))
34 #if ENABLE_EXTRA_CHECKS
36 dlist_ring_check(&list->ring);
42 list->ring.next = list->ring.prev = &list->ring;
43 DLIST_NAME(check)(list);
48 return list->ring.next == &list->ring ? NULL : DLIST_ITEM(list->ring.next);
53 return list->ring.prev == &list->ring ? NULL : DLIST_ITEM(list->ring.prev);
56 static inline DLIST_TYPE *DLIST_NAME(next)(
DLIST_LIST_TYPE *list, DLIST_TYPE *item)
58 return item->DLIST_NAME(item).next == &list->ring ? NULL : DLIST_ITEM(item->DLIST_NAME(item).next);
61 static inline DLIST_TYPE *DLIST_NAME(prev)(
DLIST_LIST_TYPE *list, DLIST_TYPE *item)
63 return item->DLIST_NAME(item).prev == &list->ring ? NULL : DLIST_ITEM(item->DLIST_NAME(item).prev);
66 static inline void DLIST_NAME(prepend)(
DLIST_LIST_TYPE *list, DLIST_TYPE *item)
68 DLIST_NAME(check)(list);
69 assert(item->DLIST_NAME(item).next == NULL && item->DLIST_NAME(item).prev == NULL);
70 list->ring.next->prev = &item->DLIST_NAME(item);
71 item->DLIST_NAME(item).next = list->ring.next;
72 item->DLIST_NAME(item).prev = &list->ring;
73 list->ring.next = &item->DLIST_NAME(item);
74 assert(item->DLIST_NAME(item).next != NULL && item->DLIST_NAME(item).prev != NULL);
75 DLIST_NAME(check)(list);
78 static inline void DLIST_NAME(append)(
DLIST_LIST_TYPE *list, DLIST_TYPE *item)
80 DLIST_NAME(check)(list);
81 assert(item->DLIST_NAME(item).next == NULL && item->DLIST_NAME(item).prev == NULL);
82 list->ring.prev->next = &item->DLIST_NAME(item);
83 item->DLIST_NAME(item).prev = list->ring.prev;
84 item->DLIST_NAME(item).next = &list->ring;
85 list->ring.prev = &item->DLIST_NAME(item);
86 assert(item->DLIST_NAME(item).next != NULL && item->DLIST_NAME(item).prev != NULL);
87 DLIST_NAME(check)(list);
90 static inline void DLIST_NAME(
remove)(
DLIST_LIST_TYPE *list, DLIST_TYPE *item)
92 dlist_ring *prev = item->DLIST_NAME(item).prev, *next = item->DLIST_NAME(item).next;
93 DLIST_NAME(check)(list);
98 item->DLIST_NAME(item).prev = NULL;
99 item->DLIST_NAME(item).next = NULL;
100 DLIST_NAME(check)(list);
103 static inline bool DLIST_NAME(in_list)(
DLIST_LIST_TYPE *list, DLIST_TYPE *item)
105 DLIST_NAME(check)(list);
106 return item->DLIST_NAME(item).prev != NULL || item->DLIST_NAME(item).next != NULL;
112 #undef DLIST_LIST_TYPE
Definition: dlist.tmpl.h:24