53
53
(*tree->compare)(custom_arg, key, ELEMENT_KEY(tree,element))
58
#include "drizzled/tree.h"
59
#include "drizzled/internal/my_sys.h"
60
#include "drizzled/internal/m_string.h"
61
#include "drizzled/memory/root.h"
58
#include <drizzled/tree.h>
59
#include <drizzled/internal/my_sys.h>
60
#include <drizzled/internal/m_string.h>
61
#include <drizzled/memory/root.h>
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,
229
228
if (tree->with_delete)
230
229
element= (TREE_ELEMENT *) malloc(alloc_size);
232
element= (TREE_ELEMENT *) tree->mem_root.alloc_root(alloc_size);
231
element= (TREE_ELEMENT *) tree->mem_root.alloc(alloc_size);
235
232
**parent= element;
236
233
element->left= element->right= &tree->null_element;
237
234
if (!tree->offset_to_key)
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
263
void *tree_search_key(TREE *tree, const void *key,
331
264
TREE_ELEMENT **parents, TREE_ELEMENT ***last_pos,
332
265
enum ha_rkey_function flag, void *custom_arg)
403
336
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
339
void *tree_search_next(TREE *tree, TREE_ELEMENT ***last_pos, int l_offs,
631
545
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
548
} /* namespace drizzled */