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
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);
58 return item->DLIST_NAME(item).next == &list->ring ?
NULL :
DLIST_ITEM(item->DLIST_NAME(item).next);
63 return item->DLIST_NAME(item).prev == &list->ring ?
NULL :
DLIST_ITEM(item->DLIST_NAME(item).prev);
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);
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);
93 DLIST_NAME(
check)(list);
98 item->DLIST_NAME(item).prev =
NULL;
99 item->DLIST_NAME(item).next =
NULL;
100 DLIST_NAME(
check)(list);
105 DLIST_NAME(
check)(list);
106 return item->DLIST_NAME(item).prev !=
NULL || item->DLIST_NAME(item).next !=
NULL;
112 #undef DLIST_LIST_TYPE
static void DLIST_NAME() init(DLIST_LIST_TYPE *list)
static void DLIST_NAME() prepend(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
static void DLIST_NAME() append(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
static DLIST_TYPE *DLIST_NAME() first(DLIST_LIST_TYPE *list)
static DLIST_TYPE *DLIST_NAME() last(DLIST_LIST_TYPE *list)
static void DLIST_NAME() check(DLIST_LIST_TYPE *list)
static DLIST_TYPE *DLIST_NAME() prev(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
static DLIST_TYPE *DLIST_NAME() next(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
static bool DLIST_NAME() in_list(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
static void DLIST_NAME() remove(DLIST_LIST_TYPE *list, DLIST_TYPE *item)