From 72ce0b10bc8d7d416309e632989e20e16669bcdb Mon Sep 17 00:00:00 2001 From: Maria Matejka Date: Wed, 23 Oct 2019 10:16:16 +0200 Subject: [PATCH] Typed linked lists --- lib/lists.h | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/lib/lists.h b/lib/lists.h index 935c6258..ff0a36b0 100644 --- a/lib/lists.h +++ b/lib/lists.h @@ -44,7 +44,6 @@ typedef union list { /* In fact two overlayed nodes */ }; } list; - #define NODE (node *) #define HEAD(list) ((void *)((list).head)) #define TAIL(list) ((void *)((list).tail)) @@ -85,4 +84,72 @@ void insert_node(node *, node *); uint list_length(list *); #endif +/* Typed lists */ +#define TLIST_NODE(_type) struct { _type *next, *prev; } _tln +#define TLIST(_type) union { \ + struct { \ + union { \ + struct { _type *next, *prev; }; \ + _type node[0]; \ + } head_node; \ + void *head_padding; \ + }; \ + struct { \ + void *tail_padding; \ + union { \ + struct { _type *next, *prev; }; \ + _type node[0]; \ + } tail_node; \ + }; \ + struct { \ + _type *head, *null, *tail; \ + }; \ +} + +#define TNODE(n) (n)->node +#define THEAD(list) list.head +#define TTAIL(list) list.tail +#define TNODE_IN_LIST(n) (((n)->_tln.next) && ((n)->_tln.prev)) + +#define WALK_TLIST(n_, list) for (n_ = (list).head; n_->_tln.next; n_ = n_->_tln.next) +#define WALK_TLIST_DELSAFE(n_, list) for (typeof(n_) next_ = n_ = THEAD(list); next_ = n_->_tln.next; n_ = next_) + +#define INIT_TLIST(list) do { \ + typeof(list) l_ = list; \ + l_->head = l_->tail_node.node; \ + l_->tail = l_->head_node.node; \ + l_->null = NULL; \ +} while (0) + +#define TADD_HEAD(list_, node_) do { \ + typeof(node_) n_ = node_; \ + typeof(list_) l_ = list_; \ + n_->_tln.next = l_->head; \ + n_->_tln.prev = l_->head_node.node; \ + l_->head->_tln.prev = n_; \ + l_->head = n_; \ +} while (0) + +#define TADD_TAIL(list_, node_) do { \ + typeof(node_) n_ = node_; \ + typeof(list_) l_ = list_; \ + n_->_tln.next = l_->tail_node.node; \ + n_->_tln.prev = l_->tail; \ + l_->tail->_tln.next = n_; \ + l_->tail = n_; \ +} while (0) + +#define TREM_NODE(node) do { \ + typeof(node) n_ = node; \ + n_->_tln.prev->_tln.next = n_->_tln.next; \ + n_->_tln.next->_tln.prev = n_->_tln.prev; \ + n_->_tln.prev = n_->_tln.next = NULL; \ +} while (0) + +#define TFIX_NODE(node) do { \ + typeof(node) n_ = node; \ + n_->_tln.next->_tln.prev = n_; \ + n_->_tln.prev->_tln.next = n_; \ + } while (0) + #endif