36#define LIST_HEAD_INIT(name) { &(name), &(name) }
38#define LIST_HEAD(name) \
39 struct llist_s name = LIST_HEAD_INIT(name)
44#define List_Entry(ptr, type, member) ContainerOf(ptr, type, member)
50#define List_First_Entry(ptr, type, member) List_Entry((ptr)->next, type, member)
56#define List_Last_Entry(ptr, type, member) List_Entry((ptr)->prev, type, member)
61#define List_First_Entry_Or_Null(ptr, type, member) ({ \
62 struct llist_s *head__ = (ptr); \
63 struct llist_s *pos__ = head__->next; \
64 pos__ != head__ ? List_Entry(pos__, type, member) : NULL; \
70#define List_Next_Entry(pos, type, member) \
71 List_Entry((pos)->member.next, type, member)
76#define List_Prev_Entry(pos, type, member) \
77 List_Entry((pos)->member.prev, type, member)
82#define List_For_Each(pos, head) \
83 for (pos = (head)->next; pos != (head); pos = pos->next)
88#define List_For_Each_Continue(pos, head) \
89 for (pos = pos->next; pos != (head); pos = pos->next)
94#define List_For_Each_Prev(pos, head) \
95 for (pos = (head)->prev; pos != (head); pos = pos->prev)
100#define List_For_Each_Safe(pos, n, head) \
101 for (pos = (head)->next, n = pos->next; pos != (head); \
102 pos = n, n = pos->next)
107#define List_For_Each_Prev_Safe(pos, n, head) \
108 for (pos = (head)->prev, n = pos->prev; \
110 pos = n, n = pos->prev)
115#define List_Entry_Is_Head(pos, head, member) \
116 (&pos->member == (head))
121#define List_For_Each_Entry(pos, head, type, member) \
122 for (pos = List_First_Entry(head, type, member); \
123 !List_Entry_Is_Head(pos, head, member); \
124 pos = List_Next_Entry(pos, type, member))
129#define List_For_Each_Prev_Entry(pos, head, type, member) \
130 for (pos = List_Last_Entry(head, type, member); \
131 !List_Entry_Is_Head(pos, head, member); \
132 pos = List_Prev_Entry(pos, type, member))
137#define List_Prepare_Entry(pos, head, type, member) \
138 ((pos) ? : List_Entry(head, type, member))
143#define List_For_Each_Entry_Continue(pos, head, type, member) \
144 for (pos = List_Next_Entry(pos, type, member); \
145 !List_Entry_Is_Head(pos, head, member); \
146 pos = List_Next_Entry(pos, type, member))
151#define List_For_Each_Prev_Entry_Continue(pos, head, type, member) \
152 for (pos = List_Prev_Entry(pos, type, member); \
153 !List_Entry_Is_Head(pos, head, member); \
154 pos = List_Prev_Entry(pos, type, member))
159#define List_For_Each_Entry_From(pos, head, type, member) \
160 for (; !List_Entry_Is_Head(pos, head, member); \
161 pos = List_Next_Entry(pos, type, member))
166#define List_For_Each_Prev_Entry_From(pos, head, type, member) \
167 for (; !List_Entry_Is_Head(pos, head, member); \
168 pos = List_Prev_Entry(pos, type, member))
173#define List_For_Each_Entry_Safe(pos, n, head, type, member) \
174 for (pos = List_First_Entry(head, type, member), \
175 n = List_Next_Entry(pos, type, member); \
176 !List_Entry_Is_Head(pos, head, member); \
177 pos = n, n = List_Next_Entry(n, type, member))
182#define List_For_Each_Entry_Safe_Continue(pos, n, head, type, member) \
183 for (pos = List_Next_Entry(pos, type, member), \
184 n = List_Next_Entry(pos, type, member); \
185 !List_Entry_Is_Head(pos, head, member); \
186 pos = n, n = List_Next_Entry(n, type, member))
191#define List_For_Each_Entry_Safe_From(pos, n, head, type, member) \
192 for (n = List_Next_Entry(pos, type, member); \
193 !List_Entry_Is_Head(pos, head, member); \
194 pos = n, n = List_Next_Entry(n, type, member))
199#define List_For_Each_Prev_Entry_Safe(pos, n, head, type, member) \
200 for (pos = List_Last_Entry(head, type, member), \
201 n = List_Prev_Entry(pos, type, member); \
202 !List_Entry_Is_Head(pos, head, member); \
203 pos = n, n = List_Prev_Entry(n, type, member))
208#define List_Safe_Reset_Next(pos, n, type, member) \
209 n = List_Next_Entry(pos, type, member)
213 return list->
next == list;
295 _new->
next->prev = _new;
297 _new->
prev->next = _new;
417 return list->
prev == start;
422 return list->
next == start;
static void List_Splice_Tail(const llist_t *list, llist_t *head)
static void __List_Delete(llist_t *prev, llist_t *next)
static qbool List_Is_First(llist_t *list, llist_t *start)
static void List_Swap(llist_t *node1, llist_t *node2)
static void List_Add(llist_t *node, llist_t *head)
static void List_Replace_Init(llist_t *old, llist_t *_new)
static void __List_Delete_Node(llist_t *node)
static void List_Move_Tail(llist_t *list, llist_t *head)
static void List_Create(llist_t *list)
static void List_Move(llist_t *list, llist_t *head)
static void __List_Add(llist_t *node, llist_t *prev, llist_t *next)
static void List_Replace(llist_t *old, llist_t *_new)
static void List_Delete_Init(llist_t *node)
static void List_Add_Tail(llist_t *node, llist_t *head)
static void List_Bulk_Move_Tail(llist_t *head, llist_t *first, llist_t *last)
static void List_Delete(llist_t *node)
static void __List_Splice(const llist_t *list, llist_t *prev, llist_t *next)
static void List_Rotate_Left(llist_t *head)
static void List_Rotate_To_Front(llist_t *list, llist_t *head)
static void List_Splice(const llist_t *list, llist_t *head)
static qbool List_Is_Last(llist_t *list, llist_t *start)
static qbool List_Is_Empty(const llist_t *list)