112 da[k++] = dir = cmp > 0;
144 if (
x->avl_balance == -1) {
169 if (
x->avl_balance == +1) {
206 return p ==
NULL || *p == item ?
NULL : *p;
217 if (p ==
NULL || *p == item)
270 if (
r->avl_link[0] ==
NULL) {
273 pa[k - 1]->avl_link[
da[k - 1]] =
r;
296 pa[
j - 1]->avl_link[
da[
j - 1]] = s;
315 if (
x->avl_balance == -1) {
331 pa[k - 1]->avl_link[
da[k - 1]] = w;
336 pa[k - 1]->avl_link[
da[k - 1]] =
x;
337 if (
x->avl_balance == 0) {
354 if (
x->avl_balance == +1) {
370 pa[k - 1]->avl_link[
da[k - 1]] = w;
375 pa[k - 1]->avl_link[
da[k - 1]] =
x;
376 if (
x->avl_balance == 0) {
400 trav->avl_generation =
trav->avl_table->avl_generation;
404 void *param =
trav->avl_table->avl_param;
408 trav->avl_height = 0;
409 for (i =
trav->avl_table->avl_root; i != node;) {
413 trav->avl_stack[
trav->avl_height++] = i;
423 trav->avl_table = tree;
425 trav->avl_height = 0;
438 trav->avl_table = tree;
439 trav->avl_height = 0;
444 while (
x->avl_link[0] !=
NULL) {
463 trav->avl_table = tree;
464 trav->avl_height = 0;
469 while (
x->avl_link[1] !=
NULL) {
489 trav->avl_table = tree;
490 trav->avl_height = 0;
503 trav->avl_stack[
trav->avl_height++] = p;
507 trav->avl_height = 0;
529 trav->avl_table = tree;
554 if (
trav->avl_generation ==
trav->avl_table->avl_generation) {
557 sizeof *
trav->avl_stack *
trav->avl_height);
573 if (
trav->avl_generation !=
trav->avl_table->avl_generation)
580 else if (
x->avl_link[1] !=
NULL) {
585 while (
x->avl_link[0] !=
NULL) {
595 if (
trav->avl_height == 0) {
602 }
while (y ==
x->avl_link[1]);
618 if (
trav->avl_generation !=
trav->avl_table->avl_generation)
625 else if (
x->avl_link[0] !=
NULL) {
630 while (
x->avl_link[1] !=
NULL) {
640 if (
trav->avl_height == 0) {
647 }
while (y ==
x->avl_link[0]);
670 old =
trav->avl_node->avl_data;
671 trav->avl_node->avl_data =
new;
679static void copy_error_recovery(
struct avl_node **
stack,
int height,
684 for (; height > 2; height -= 2)
715 new->avl_count =
org->avl_count;
716 if (new->avl_count == 0)
720 y = (
struct avl_node *)&new->avl_root;
722 while (
x->avl_link[0] !=
NULL) {
725 y->
avl_link[0] =
new->avl_alloc->libavl_malloc(
726 new->avl_alloc,
sizeof *y->
avl_link[0]);
728 if (y != (
struct avl_node *)&new->avl_root) {
757 if (
x->avl_link[1] !=
NULL) {
758 y->
avl_link[1] =
new->avl_alloc->libavl_malloc(
759 new->avl_alloc,
sizeof *y->
avl_link[1]);
struct libavl_allocator avl_allocator_default
void avl_free(struct libavl_allocator *allocator, void *block)
void * avl_malloc(struct libavl_allocator *allocator, size_t size)
void * avl_copy_func(void *avl_item, void *avl_param)
void avl_item_func(void *avl_item, void *avl_param)
int avl_comparison_func(const void *avl_a, const void *avl_b, void *avl_param)
int compare(const void *a, const void *b)
#define assert(condition)
struct avl_node * avl_link[2]
avl_comparison_func * avl_compare
struct libavl_allocator * avl_alloc
unsigned long avl_generation
struct avl_node * avl_root
unsigned long avl_generation
struct avl_table * avl_table
struct avl_node * avl_stack[92]
struct avl_node * avl_node
#define avl_assert_insert
#define avl_assert_delete