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