17 #ifndef __LIBUBOX_VLIST_H
18 #define __LIBUBOX_VLIST_H
44 #define VLIST_TREE_INIT(_name, _comp, _update, _keep_old, _no_delete) \
46 .avl = AVL_TREE_INIT(_name.avl, _comp, false, NULL), \
49 .keep_old = _keep_old, \
50 .no_delete = _no_delete, \
53 #define VLIST_TREE(_name, ...) \
54 struct vlist_tree _name = \
55 VLIST_TREE_INIT(_name, __VA_ARGS__)
59 #define vlist_find(tree, name, element, node_member) \
60 avl_find_element(&(tree)->avl, name, element, node_member.avl)
72 #define vlist_for_each_element(tree, element, node_member) \
73 avl_for_each_element(&(tree)->avl, element, node_member.avl)
75 #define vlist_for_each_element_safe(tree, element, node_member, ptr) \
76 avl_for_each_element_safe(&(tree)->avl, element, node_member.avl, ptr)
78 #define vlist_for_each_element_reverse(tree, element, node_member) \
79 avl_for_each_element_reverse(&(tree)->avl, element, node_member.avl)
81 #define vlist_for_first_to_element(tree, last, element, node_member) \
82 avl_for_element_range(avl_first_element(&(tree)->avl, element, node_member.avl), last, element, node_member.avl)
84 #define vlist_for_first_to_element_reverse(tree, last, element, node_member) \
85 avl_for_element_range_reverse(avl_first_element(&(tree)->avl, element, node_member.avl), last, element, node_member.avl)
87 #define vlist_for_element_to_last(tree, first, element, node_member) \
88 avl_for_element_range(first, avl_last_element(&(tree)->avl, element, node_member.avl), element, node_member.avl)
90 #define vlist_for_element_to_last_reverse(tree, first, element, node_member) \
91 avl_for_element_range_reverse(first, avl_last_element(&(tree)->avl, element, node_member.avl), element, node_member.avl)
int(* avl_tree_comp)(const void *k1, const void *k2, void *ptr)
void vlist_flush_all(struct vlist_tree *tree)
void vlist_flush(struct vlist_tree *tree)
static void vlist_update(struct vlist_tree *tree)
void vlist_init(struct vlist_tree *tree, avl_tree_comp cmp, vlist_update_cb update)
void vlist_add(struct vlist_tree *tree, struct vlist_node *node, const void *key)
void vlist_delete(struct vlist_tree *tree, struct vlist_node *node)
void(* vlist_update_cb)(struct vlist_tree *tree, struct vlist_node *node_new, struct vlist_node *node_old)