35typedef struct list_entry
63#define LIST_FOR_EACH(elem, list, member) \
64 for ((elem) = CONTAINER_OF((list)->head.next, typeof(*elem), member); &(elem)->member != &((list)->head); \
65 (elem) = CONTAINER_OF((elem)->member.next, typeof(*elem), member))
79#define LIST_FOR_EACH_SAFE(elem, temp, list, member) \
80 for ((elem) = CONTAINER_OF((list)->head.next, typeof(*elem), member), \
81 (temp) = CONTAINER_OF((elem)->member.next, typeof(*elem), member); \
82 &(elem)->member != &((list)->head); \
83 (elem) = (temp), (temp) = CONTAINER_OF((elem)->member.next, typeof(*elem), member))
93#define LIST_FOR_EACH_REVERSE(elem, list, member) \
94 for ((elem) = CONTAINER_OF((list)->head.prev, typeof(*elem), member); &(elem)->member != &((list)->head); \
95 (elem) = CONTAINER_OF((elem)->member.prev, typeof(*elem), member))
108#define LIST_FOR_EACH_FROM(elem, start, list, member) \
109 for ((elem) = CONTAINER_OF(start, typeof(*elem), member); &(elem)->member != &((list)->head); \
110 (elem) = CONTAINER_OF((elem)->member.next, typeof(*elem), member))
121#define LIST_FOR_EACH_FROM_REVERSE(elem, start, list, member) \
122 for ((elem) = CONTAINER_OF(start, typeof(*elem), member); &(elem)->member != &((list)->head); \
123 (elem) = CONTAINER_OF((elem)->member.prev, typeof(*elem), member))
137#define LIST_FOR_EACH_TO(elem, end, list, member) \
138 for ((elem) = CONTAINER_OF((list)->head.next, typeof(*elem), member); \
139 &(elem)->member != &((list)->head) && &(elem)->member != (end); \
140 (elem) = CONTAINER_OF((elem)->member.next, typeof(*elem), member))
151#define LIST_FOR_EACH_TO_REVERSE(elem, end, list, member) \
152 for ((elem) = CONTAINER_OF((list)->head.prev, typeof(*elem), member); \
153 &(elem)->member != &((list)->head) && &(elem)->member != (end); \
154 (elem) = CONTAINER_OF((elem)->member.prev, typeof(*elem), member))
162#define LIST_ENTRY_CREATE(name) \
165 .prev = &(name), .next = &(name), .list = NULL \
174#define LIST_CREATE(name) (list_t){.head = {.prev = &(name).head, .next = &(name).head, .list = &(name)}, .length = 0}
217 return entry->
list == list;
232 bool emptyByLength = (list->
length == 0);
234 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 list_entry_t * list_pop_first(list_t *list)
Pops the first entry from the list.
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_push_back(list_t *list, list_entry_t *entry)
Pushes an entry to the end of the list.
static void list_prepend(list_t *list, list_entry_t *head, list_entry_t *entry)
Prepends an entry to the list.
static list_entry_t * list_pop_last(list_t *list)
Pops the last entry from the list.
static void list_remove(list_t *list, list_entry_t *entry)
Removes a list entry from its current 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 void list_push_front(list_t *list, list_entry_t *entry)
Pushes an entry to the front of the list.
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.
#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).