38#define NODE_COUNT(n) ((n) ? (n)->count : 0)
39#define L_COUNT(n) (NODE_COUNT((n)->left))
40#define R_COUNT(n) (NODE_COUNT((n)->right))
41#define CALC_COUNT(n) (L_COUNT(n) + R_COUNT(n) + 1)
45#define NODE_DEPTH(n) ((n) ? (n)->depth : 0)
46#define L_DEPTH(n) (NODE_DEPTH((n)->left))
47#define R_DEPTH(n) (NODE_DEPTH((n)->right))
48#define CALC_DEPTH(n) ((L_DEPTH(n)>R_DEPTH(n)?L_DEPTH(n):R_DEPTH(n)) + 1)
53static int lg(
unsigned int u) {
56 if(u & 0xffff0000) { u >>= 16; r += 16; }
57 if(u & 0x0000ff00) { u >>= 8; r += 8; }
58 if(u & 0x000000f0) { u >>= 4; r += 4; }
59 if(u & 0x0000000c) { u >>= 2; r += 2; }
60 if(u & 0x00000002) r++;
65static int avl_check_balance(
avl_node_t *avlnode) {
69 return d<-1?-1:d>1?1:0;
87#error No balancing possible.
101 avlnode = avltree->
top;
107 avlnode = avlnode->
left;
108 }
else if(index >
c) {
109 avlnode = avlnode->
right;
124 while((next = avlnode->
parent)) {
125 if(avlnode == next->
right)
145 return *avlnode = NULL, 0;
156 return *avlnode = node, -1;
161 return *avlnode = node, 1;
163 return *avlnode = node, 0;
194 avltree->
top = avltree->
head = avltree->
tail = NULL;
203 for(node = avltree->
head; node; node = next) {
206 freeitem(node->
item);
223static void avl_clear_node(
avl_node_t *newnode) {
235 avl_clear_node(newnode);
236 newnode->
item = item;
242 avl_clear_node(newnode);
244 avltree->
head = avltree->
tail = avltree->
top = newnode;
257 avl_clear_node(newnode);
259 newnode->
next = node;
266 avltree->
head = newnode;
267 node->
prev = newnode;
269 node->
left = newnode;
270 avl_rebalance(avltree, node);
283 avl_clear_node(newnode);
285 newnode->
prev = node;
292 avltree->
tail = newnode;
293 node->
next = newnode;
295 node->
right = newnode;
296 avl_rebalance(avltree, node);
362 left = avlnode->
left;
363 right = avlnode->
right;
365 *superparent = right;
374 subst = avlnode->
prev;
385 subst->
right = right;
388 *superparent = subst;
391 avl_rebalance(avltree, balnode);
397 item = avlnode->
item;
413 if(!avltree || !newnode)
416 node = newnode->
prev;
418 oldnode = node->
next;
419 node->
next = newnode;
421 avltree->
head = newnode;
424 node = newnode->
next;
426 oldnode = node->
prev;
427 node->
prev = newnode;
429 avltree->
tail = newnode;
434 if(node->left == oldnode)
435 node->
left = newnode;
437 node->
right = newnode;
439 oldnode = avltree->
top;
440 avltree->
top = newnode;
470 switch(avl_check_balance(avlnode)) {
472 child = avlnode->
left;
479 #error No balancing possible.
485 child->
right = avlnode;
487 *superparent = child;
498 gchild = child->
right;
505 gchild->
right = avlnode;
508 gchild->
left = child;
511 *superparent = gchild;
526 child = avlnode->
right;
533 #error No balancing possible.
539 child->
left = avlnode;
541 *superparent = child;
552 gchild = child->
left;
559 gchild->
left = avlnode;
562 gchild->
right = child;
565 *superparent = gchild;
avl_node_t * avl_insert_after(avl_tree_t *avltree, avl_node_t *node, avl_node_t *newnode)
avl_node_t * avl_insert_before(avl_tree_t *avltree, avl_node_t *node, avl_node_t *newnode)
void avl_free_tree(avl_tree_t *avltree)
int avl_search_closest(const avl_tree_t *avltree, const void *item, avl_node_t **avlnode)
void avl_unlink_node(avl_tree_t *avltree, avl_node_t *avlnode)
avl_node_t * avl_fixup_node(avl_tree_t *avltree, avl_node_t *newnode)
avl_node_t * avl_init_node(avl_node_t *newnode, void *item)
avl_node_t * avl_insert(avl_tree_t *avltree, void *item)
unsigned int avl_index(const avl_node_t *avlnode)
avl_node_t * avl_at(const avl_tree_t *avltree, unsigned int index)
avl_node_t * avl_search(const avl_tree_t *avltree, const void *item)
void * avl_delete(avl_tree_t *avltree, const void *item)
void * avl_delete_node(avl_tree_t *avltree, avl_node_t *avlnode)
avl_node_t * avl_insert_node(avl_tree_t *avltree, avl_node_t *newnode)
avl_node_t * avl_insert_top(avl_tree_t *avltree, avl_node_t *newnode)
unsigned int avl_count(const avl_tree_t *avltree)
avl_tree_t * avl_init_tree(avl_tree_t *rc, avl_compare_t cmp, avl_freeitem_t freeitem)
avl_tree_t * avl_alloc_tree(avl_compare_t cmp, avl_freeitem_t freeitem)
void avl_clear_tree(avl_tree_t *avltree)
void avl_free_nodes(avl_tree_t *avltree)
void(* avl_freeitem_t)(void *)
int(* avl_compare_t)(const void *, const void *)
constexpr double c
The velocity of light in m/s.
struct avl_node_t * parent
struct avl_node_t * right