41#define ASSERT(a) assert(a)
50#define list_d2l(a, obj) ((list_node_t *)(((char *)obj) + (a)->list_offset))
52#define list_object(a, node) ((void *)(((char *)node) - (a)->list_offset))
53#define list_empty(a) ((a)->list_head.list_next == &(a)->list_head)
55#define list_insert_after_node(list, node, object) { \
56 list_node_t *lnew = list_d2l(list, object); \
57 lnew->list_prev = (node); \
58 lnew->list_next = (node)->list_next; \
59 (node)->list_next->list_prev = lnew; \
60 (node)->list_next = lnew; \
61 (list)->list_count++; \
64#define list_insert_before_node(list, node, object) { \
65 list_node_t *lnew = list_d2l(list, object); \
66 lnew->list_next = (node); \
67 lnew->list_prev = (node)->list_prev; \
68 (node)->list_prev->list_next = lnew; \
69 (node)->list_prev = lnew; \
70 (list)->list_count++; \
73#define list_remove_node(node) \
74 (node)->list_prev->list_next = (node)->list_next; \
75 (node)->list_next->list_prev = (node)->list_prev; \
76 (node)->list_next = (node)->list_prev = NULL
119 list->list_size = size;
120 list->list_offset = offset;
121 list->list_count = 0;
122 list->list_head.list_next =
list->list_head.list_prev =
145 node->list_next = node->list_prev = NULL;
161 if (
object == NULL) {
165 list_insert_after_node(
list, lold, nobject);
183 if (
object == NULL) {
187 list_insert_before_node(
list, lold, nobject);
202 list_insert_after_node(
list, lold,
object);
216 list_insert_before_node(
list, lold,
object);
230 ASSERT(lold->list_next != NULL);
231 list_remove_node(lold);
254 if (head == &
list->list_head)
256 list_remove_node(head);
258 return (list_object(
list, head));
280 if (tail == &
list->list_head)
282 list_remove_node(tail);
284 return (list_object(
list, tail));
294 if (list_empty(
list))
296 return (list_object(
list,
list->list_head.list_next));
306 if (list_empty(
list))
308 return (list_object(
list,
list->list_head.list_prev));
349 if (node->list_next != &
list->list_head)
350 return (list_object(
list, node->list_next));
393 if (node->list_prev != &
list->list_head)
394 return (list_object(
list, node->list_prev));
420 for (
unsigned j = 0; j < i; j++)
441 ASSERT(dst->list_size == src->list_size);
442 ASSERT(dst->list_offset == src->list_offset);
447 dstnode->list_prev->list_next = srcnode->list_next;
448 srcnode->list_next->list_prev = dstnode->list_prev;
449 dstnode->list_prev = srcnode->list_prev;
450 srcnode->list_prev->list_next = dstnode;
451 dst->list_count += src->list_count;
454 srcnode->list_next = srcnode->list_prev = srcnode;
494 lnew->list_next = lold->list_next;
495 lnew->list_prev = lold->list_prev;
496 lold->list_prev->list_next = lnew;
497 lold->list_next->list_prev = lnew;
498 lold->list_next = lold->list_prev = NULL;
512 link->list_next = NULL;
513 link->list_prev = NULL;
527 return (link->list_next != NULL);
536 return (list_empty(
list));
545 return (
list->list_count);
void list_link_replace(list_node_t *, list_node_t *)
int list_link_active(const list_node_t *)
void * list_tail(const list_t *)
void * list_get_i(const list_t *, size_t)
void list_destroy(list_t *)
void * list_head(const list_t *)
int list_is_empty(const list_t *)
void list_create(list_t *, size_t, size_t)
void list_move_tail(list_t *, list_t *)
void list_insert_after(list_t *, void *, void *)
void list_insert_before(list_t *, void *, void *)
void * list_remove_tail(list_t *)
void * list_prev(const list_t *, const void *)
void list_insert_head(list_t *, void *)
void * list_next(const list_t *, const void *)
void list_link_init(list_node_t *)
size_t list_count(const list_t *)
void list_remove(list_t *, void *)
void * list_remove_head(list_t *)
void list_insert_tail(list_t *, void *)