248 #define DLIST_STATIC_INIT(name) {{&(name).head, &(name).head}}
249 #define SLIST_STATIC_INIT(name) {{NULL}}
267 #define dlist_check(head) ((void) (head))
268 #define slist_check(head) ((void) (head))
461 return (
char *) head->
head.
next - off;
478 return (
char *) head->
head.
prev - off;
496 #define dlist_container(type, membername, ptr) \
497 (AssertVariableIsOfTypeMacro(ptr, dlist_node *), \
498 AssertVariableIsOfTypeMacro(((type *) NULL)->membername, dlist_node), \
499 ((type *) ((char *) (ptr) - offsetof(type, membername))))
506 #define dlist_head_element(type, membername, lhead) \
507 (AssertVariableIsOfTypeMacro(((type *) NULL)->membername, dlist_node), \
508 (type *) dlist_head_element_off(lhead, offsetof(type, membername)))
515 #define dlist_tail_element(type, membername, lhead) \
516 (AssertVariableIsOfTypeMacro(((type *) NULL)->membername, dlist_node), \
517 ((type *) dlist_tail_element_off(lhead, offsetof(type, membername))))
526 #define dlist_foreach(iter, lhead) \
527 for (AssertVariableIsOfTypeMacro(iter, dlist_iter), \
528 AssertVariableIsOfTypeMacro(lhead, dlist_head *), \
529 (iter).end = &(lhead)->head, \
530 (iter).cur = (iter).end->next ? (iter).end->next : (iter).end; \
531 (iter).cur != (iter).end; \
532 (iter).cur = (iter).cur->next)
543 #define dlist_foreach_modify(iter, lhead) \
544 for (AssertVariableIsOfTypeMacro(iter, dlist_mutable_iter), \
545 AssertVariableIsOfTypeMacro(lhead, dlist_head *), \
546 (iter).end = &(lhead)->head, \
547 (iter).cur = (iter).end->next ? (iter).end->next : (iter).end, \
548 (iter).next = (iter).cur->next; \
549 (iter).cur != (iter).end; \
550 (iter).cur = (iter).next, (iter).next = (iter).cur->next)
557 #define dlist_reverse_foreach(iter, lhead) \
558 for (AssertVariableIsOfTypeMacro(iter, dlist_iter), \
559 AssertVariableIsOfTypeMacro(lhead, dlist_head *), \
560 (iter).end = &(lhead)->head, \
561 (iter).cur = (iter).end->prev ? (iter).end->prev : (iter).end; \
562 (iter).cur != (iter).end; \
563 (iter).cur = (iter).cur->prev)
634 return node->
next != NULL;
652 return (
char *) head->
head.
next - off;
693 #define slist_container(type, membername, ptr) \
694 (AssertVariableIsOfTypeMacro(ptr, slist_node *), \
695 AssertVariableIsOfTypeMacro(((type *) NULL)->membername, slist_node), \
696 ((type *) ((char *) (ptr) - offsetof(type, membername))))
703 #define slist_head_element(type, membername, lhead) \
704 (AssertVariableIsOfTypeMacro(((type *) NULL)->membername, slist_node), \
705 (type *) slist_head_element_off(lhead, offsetof(type, membername)))
719 #define slist_foreach(iter, lhead) \
720 for (AssertVariableIsOfTypeMacro(iter, slist_iter), \
721 AssertVariableIsOfTypeMacro(lhead, slist_head *), \
722 (iter).cur = (lhead)->head.next; \
723 (iter).cur != NULL; \
724 (iter).cur = (iter).cur->next)
735 #define slist_foreach_modify(iter, lhead) \
736 for (AssertVariableIsOfTypeMacro(iter, slist_mutable_iter), \
737 AssertVariableIsOfTypeMacro(lhead, slist_head *), \
738 (iter).prev = &(lhead)->head, \
739 (iter).cur = (iter).prev->next, \
740 (iter).next = (iter).cur ? (iter).cur->next : NULL; \
741 (iter).cur != NULL; \
742 (iter).prev = (iter).cur, \
743 (iter).cur = (iter).next, \
744 (iter).next = (iter).next ? (iter).next->next : NULL)
static dlist_node * dlist_prev_node(dlist_head *head, dlist_node *node)
struct slist_iter slist_iter
static void slist_delete_current(slist_mutable_iter *iter)
static bool slist_is_empty(slist_head *head)
struct dlist_iter dlist_iter
static void dlist_insert_after(dlist_node *after, dlist_node *node)
static void * slist_head_element_off(slist_head *head, size_t off)
static void dlist_init(dlist_head *head)
static void * dlist_tail_element_off(dlist_head *head, size_t off)
static void dlist_insert_before(dlist_node *before, dlist_node *node)
static bool slist_has_next(slist_head *head, slist_node *node)
#define dlist_check(head)
static bool dlist_is_empty(dlist_head *head)
static void dlist_delete(dlist_node *node)
static void slist_init(slist_head *head)
static dlist_node * dlist_next_node(dlist_head *head, dlist_node *node)
struct dlist_head dlist_head
static void * dlist_head_element_off(dlist_head *head, size_t off)
static dlist_node * dlist_pop_head_node(dlist_head *head)
static bool dlist_has_next(dlist_head *head, dlist_node *node)
static void dlist_push_head(dlist_head *head, dlist_node *node)
static void slist_insert_after(slist_node *after, slist_node *node)
void slist_delete(slist_head *head, slist_node *node)
static void slist_push_head(slist_head *head, slist_node *node)
struct slist_head slist_head
#define slist_check(head)
static void dlist_push_tail(dlist_head *head, dlist_node *node)
static slist_node * slist_next_node(slist_head *head, slist_node *node)
struct dlist_mutable_iter dlist_mutable_iter
static bool dlist_has_prev(dlist_head *head, dlist_node *node)
static void dlist_move_head(dlist_head *head, dlist_node *node)
struct slist_mutable_iter slist_mutable_iter
static dlist_node * dlist_head_node(dlist_head *head)
static void dlist_move_tail(dlist_head *head, dlist_node *node)
static slist_node * slist_head_node(slist_head *head)
static slist_node * slist_pop_head_node(slist_head *head)
static dlist_node * dlist_tail_node(dlist_head *head)
Assert(fmt[strlen(fmt) - 1] !='\n')
static int before(chr x, chr y)