50 #define EXPORT(sym) sym
156 #define AVL_TREE_INIT(_name, _comp, _allow_dups, _cmp_ptr) \
158 .list_head = LIST_HEAD_INIT(_name.list_head), \
160 .allow_dups = _allow_dups, \
161 .cmp_ptr = _cmp_ptr \
164 #define AVL_TREE(_name, _comp, _allow_dups, _cmp_ptr) \
165 struct avl_tree _name = \
166 AVL_TREE_INIT(_name, _comp, _allow_dups, _cmp_ptr)
201 return tree->
count == 0;
227 return node == NULL ? NULL : (((
char *)
node) - offset);
240 #define avl_find_element(tree, key, element, node_element) \
241 ((__typeof__(*(element)) *)__avl_find_element(tree, key, offsetof(typeof(*(element)), node_element), AVL_FIND_EQUAL))
253 #define avl_find_le_element(tree, key, element, node_element) \
254 ((__typeof__(*(element)) *)__avl_find_element(tree, key, offsetof(typeof(*(element)), node_element), AVL_FIND_LESSEQUAL))
266 #define avl_find_ge_element(tree, key, element, node_element) \
267 ((__typeof__(*(element)) *)__avl_find_element(tree, key, offsetof(typeof(*(element)), node_element), AVL_FIND_GREATEREQUAL))
280 #define avl_first_element(tree, element, node_member) \
281 container_of((tree)->list_head.next, __typeof__(*(element)), node_member.list)
292 #define avl_last_element(tree, element, node_member) \
293 container_of((tree)->list_head.prev, __typeof__(*(element)), node_member.list)
305 #define avl_next_element(element, node_member) \
306 container_of((&(element)->node_member.list)->next, __typeof__(*(element)), node_member.list)
318 #define avl_prev_element(element, node_member) \
319 container_of((&(element)->node_member.list)->prev, __typeof__(*(element)), node_member.list)
333 #define avl_for_element_range(first, last, element, node_member) \
334 for (element = (first); \
335 element->node_member.list.prev != &(last)->node_member.list; \
336 element = avl_next_element(element, node_member))
350 #define avl_for_element_range_reverse(first, last, element, node_member) \
351 for (element = (last); \
352 element->node_member.list.next != &(first)->node_member.list; \
353 element = avl_prev_element(element, node_member))
366 #define avl_for_each_element(tree, element, node_member) \
367 avl_for_element_range(avl_first_element(tree, element, node_member), \
368 avl_last_element(tree, element, node_member), \
369 element, node_member)
382 #define avl_for_each_element_reverse(tree, element, node_member) \
383 avl_for_element_range_reverse(avl_first_element(tree, element, node_member), \
384 avl_last_element(tree, element, node_member), \
385 element, node_member)
400 #define avl_for_element_to_last(tree, first, element, node_member) \
401 avl_for_element_range(first, avl_last_element(tree, element, node_member), element, node_member)
417 #define avl_for_element_to_last_reverse(tree, first, element, node_member) \
418 avl_for_element_range_reverse(first, avl_last_element(tree, element, node_member), element, node_member)
433 #define avl_for_first_to_element(tree, last, element, node_member) \
434 avl_for_element_range(avl_first_element(tree, element, node_member), last, element, node_member)
450 #define avl_for_first_to_element_reverse(tree, last, element, node_member) \
451 avl_for_element_range_reverse(avl_first_element(tree, element, node_member), last, element, node_member)
466 #define avl_for_element_range_safe(first_element, last_element, element, node_member, ptr) \
467 for (element = (first_element), ptr = avl_next_element(first_element, node_member); \
468 element->node_member.list.prev != &(last_element)->node_member.list; \
469 element = ptr, ptr = avl_next_element(ptr, node_member))
484 #define avl_for_element_range_reverse_safe(first_element, last_element, element, node_member, ptr) \
485 for (element = (last_element), ptr = avl_prev_element(last_element, node_member); \
486 element->node_member.list.next != &(first_element)->node_member.list; \
487 element = ptr, ptr = avl_prev_element(ptr, node_member))
503 #define avl_for_each_element_safe(tree, element, node_member, ptr) \
504 avl_for_element_range_safe(avl_first_element(tree, element, node_member), \
505 avl_last_element(tree, element, node_member), \
506 element, node_member, ptr)
522 #define avl_for_each_element_reverse_safe(tree, element, node_member, ptr) \
523 avl_for_element_range_reverse_safe(avl_first_element(tree, element, node_member), \
524 avl_last_element(tree, element, node_member), \
525 element, node_member, ptr)
545 #define avl_remove_all_elements(tree, element, node_member, ptr) \
546 for (element = avl_first_element(tree, element, node_member), \
547 ptr = avl_next_element(element, node_member), \
548 INIT_LIST_HEAD(&(tree)->list_head), \
549 (tree)->root = NULL; \
551 element = ptr, ptr = avl_next_element(ptr, node_member), (tree)->count--)
int avl_insert(struct avl_tree *, struct avl_node *)
static bool avl_is_empty(struct avl_tree *tree)
static bool avl_is_first(struct avl_tree *tree, struct avl_node *node)
void avl_init(struct avl_tree *, avl_tree_comp, bool, void *)
static bool avl_is_last(struct avl_tree *tree, struct avl_node *node)
struct avl_node * avl_find_lessequal(const struct avl_tree *tree, const void *key)
int(* avl_tree_comp)(const void *k1, const void *k2, void *ptr)
struct avl_node * avl_find(const struct avl_tree *, const void *)
static void * __avl_find_element(const struct avl_tree *tree, const void *key, size_t offset, enum avl_find_mode mode)
struct avl_node * avl_find_greaterequal(const struct avl_tree *tree, const void *key)
void avl_delete(struct avl_tree *, struct avl_node *)
struct list_head list_head