0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-11-08 12:18:42 +00:00

Typed linked lists

This commit is contained in:
Maria Matejka 2019-10-23 10:16:16 +02:00
parent 66f00cdd80
commit 72ce0b10bc

View File

@ -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