83
83
static void right_rotate(TREE_ELEMENT **parent, TREE_ELEMENT *leaf);
84
84
static void rb_insert(TREE *tree,TREE_ELEMENT ***parent,
85
85
TREE_ELEMENT *leaf);
86
static void rb_delete_fixup(TREE *tree,TREE_ELEMENT ***parent);
89
88
void init_tree(TREE *tree, size_t default_alloc_size, uint32_t memory_limit,
266
int tree_delete(TREE *tree, void *key, uint32_t key_size, void *custom_arg)
269
TREE_ELEMENT *element,***parent, ***org_parent, *nod;
270
if (!tree->with_delete)
271
return 1; /* not allowed */
273
parent= tree->parents;
274
*parent= &tree->root; element= tree->root;
279
if (element == &tree->null_element)
280
return 1; /* Was not in tree */
281
if ((cmp = (*tree->compare)(custom_arg, ELEMENT_KEY(tree,element),
286
*++parent= &element->right; element= element->right;
290
*++parent = &element->left; element= element->left;
293
if (element->left == &tree->null_element)
295
(**parent)= element->right;
296
remove_colour= element->colour;
298
else if (element->right == &tree->null_element)
300
(**parent)= element->left;
301
remove_colour= element->colour;
306
*++parent= &element->right; nod= element->right;
307
while (nod->left != &tree->null_element)
309
*++parent= &nod->left; nod= nod->left;
311
(**parent)= nod->right; /* unlink nod from tree */
312
remove_colour= nod->colour;
313
org_parent[0][0]= nod; /* put y in place of element */
314
org_parent[1]= &nod->right;
315
nod->left= element->left;
316
nod->right= element->right;
317
nod->colour= element->colour;
319
if (remove_colour == BLACK)
320
rb_delete_fixup(tree,parent);
322
(*tree->free)(ELEMENT_KEY(tree,element), free_free, tree->custom_arg);
323
tree->allocated-= sizeof(TREE_ELEMENT) + tree->size_of_element + key_size;
324
free((unsigned char*) element);
325
tree->elements_in_tree--;
330
265
void *tree_search_key(TREE *tree, const void *key,
331
266
TREE_ELEMENT **parents, TREE_ELEMENT ***last_pos,
332
267
enum ha_rkey_function flag, void *custom_arg)
403
338
return *last_pos ? ELEMENT_KEY(tree, **last_pos) : NULL;
407
Search first (the most left) or last (the most right) tree element
409
void *tree_search_edge(TREE *tree, TREE_ELEMENT **parents,
410
TREE_ELEMENT ***last_pos, int child_offs)
412
TREE_ELEMENT *element= tree->root;
414
*parents= &tree->null_element;
415
while (element != &tree->null_element)
418
element= ELEMENT_CHILD(element, child_offs);
421
return **last_pos != &tree->null_element ?
422
ELEMENT_KEY(tree, **last_pos) : NULL;
425
341
void *tree_search_next(TREE *tree, TREE_ELEMENT ***last_pos, int l_offs,
631
547
tree->root->colour=BLACK;
634
static void rb_delete_fixup(TREE *tree, TREE_ELEMENT ***parent)
636
TREE_ELEMENT *x,*w,*par;
639
while (x != tree->root && x->colour == BLACK)
641
if (x == (par=parent[-1][0])->left)
644
if (w->colour == RED)
648
left_rotate(parent[-1],par);
650
*++parent= &par->left;
653
if (w->left->colour == BLACK && w->right->colour == BLACK)
661
if (w->right->colour == BLACK)
663
w->left->colour= BLACK;
665
right_rotate(&par->right,w);
668
w->colour= par->colour;
670
w->right->colour= BLACK;
671
left_rotate(parent[-1],par);
679
if (w->colour == RED)
683
right_rotate(parent[-1],par);
684
parent[0]= &w->right;
685
*++parent= &par->right;
688
if (w->right->colour == BLACK && w->left->colour == BLACK)
696
if (w->left->colour == BLACK)
698
w->right->colour= BLACK;
700
left_rotate(&par->left,w);
703
w->colour= par->colour;
705
w->left->colour= BLACK;
706
right_rotate(parent[-1],par);
715
550
} /* namespace drizzled */