37typedef struct list_entry
65#define LIST_FOR_EACH(elem, list, member) \
66 for ((elem) = CONTAINER_OF((list)->head.next, typeof(*elem), member); &(elem)->member != &((list)->head); \
67 (elem) = CONTAINER_OF((elem)->member.next, typeof(*elem), member))
81#define LIST_FOR_EACH_SAFE(elem, temp, list, member) \
82 for ((elem) = CONTAINER_OF((list)->head.next, typeof(*elem), member), \
83 (temp) = CONTAINER_OF((elem)->member.next, typeof(*elem), member); \
84 &(elem)->member != &((list)->head); \
85 (elem) = (temp), (temp) = CONTAINER_OF((elem)->member.next, typeof(*elem), member))
95#define LIST_FOR_EACH_REVERSE(elem, list, member) \
96 for ((elem) = CONTAINER_OF((list)->head.prev, typeof(*elem), member); &(elem)->member != &((list)->head); \
97 (elem) = CONTAINER_OF((elem)->member.prev, typeof(*elem), member))
110#define LIST_FOR_EACH_FROM(elem, start, list, member) \
111 for ((elem) = CONTAINER_OF(start, typeof(*elem), member); &(elem)->member != &((list)->head); \
112 (elem) = CONTAINER_OF((elem)->member.next, typeof(*elem), member))
123#define LIST_FOR_EACH_FROM_REVERSE(elem, start, list, member) \
124 for ((elem) = CONTAINER_OF(start, typeof(*elem), member); &(elem)->member != &((list)->head); \
125 (elem) = CONTAINER_OF((elem)->member.prev, typeof(*elem), member))
139#define LIST_FOR_EACH_TO(elem, end, list, member) \
140 for ((elem) = CONTAINER_OF((list)->head.next, typeof(*elem), member); \
141 &(elem)->member != &((list)->head) && &(elem)->member != (end); \
142 (elem) = CONTAINER_OF((elem)->member.next, typeof(*elem), member))
153#define LIST_FOR_EACH_TO_REVERSE(elem, end, list, member) \
154 for ((elem) = CONTAINER_OF((list)->head.prev, typeof(*elem), member); \
155 &(elem)->member != &((list)->head) && &(elem)->member != (end); \
156 (elem) = CONTAINER_OF((elem)->member.prev, typeof(*elem), member))
164#define LIST_ENTRY_CREATE(name) \
167 .prev = &(name), .next = &(name), .list = NULL \
176#define LIST_CREATE(name) (list_t){.head = {.prev = &(name).head, .next = &(name).head, .list = &(name)}, .length = 0}
219 return entry->
list == list;
234 bool emptyByLength = (list->
length == 0);
236 assert(emptyByHead == emptyByLength);
#define assert(expression)
static list_entry_t * list_first(list_t *list)
Gets the first entry in the list without removing it.
static uint64_t list_length(list_t *list)
Gets the length of the list.
static list_entry_t * list_last(list_t *list)
Gets the last entry in the list without removing it.
static void list_prepend(list_t *list, list_entry_t *head, list_entry_t *entry)
Prepends an entry to the list.
static void list_remove(list_t *list, list_entry_t *entry)
Removes a list entry from its current list.
static void list_push(list_t *list, list_entry_t *entry)
Pushes an entry to the end of the list.
static void list_append(list_t *list, list_entry_t *prev, list_entry_t *entry)
Appends an entry to the list.
static bool list_is_empty(list_t *list)
Checks if a list is empty.
static void list_entry_init(list_entry_t *entry)
Initializes a list entry.
static void list_add(list_t *list, list_entry_t *prev, list_entry_t *next, list_entry_t *entry)
Adds a new element between two existing list entries.
static bool list_contains_entry(list_t *list, list_entry_t *entry)
Check if an entry belongs to a specific list.
static void list_init(list_t *list)
Initializes a list.
static list_entry_t * list_pop(list_t *list)
Pops the first entry from the list.
#define NULL
Pointer error value.
A entry in a doubly linked list.
list_t * list
The list this entry belongs to.
struct list_entry * next
The next entry in the list.
struct list_entry * prev
The previous entry in the list.
uint64_t length
The number of elements in the list (excluding the head).