My Project
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules
rbtree_insert.c
Go to the documentation of this file.
1 #include <3ds/util/rbtree.h>
2 #include "rbtree_internal.h"
3 
4 static rbtree_node_t*
5 do_insert(rbtree_t *tree,
7  int multi)
8 {
9  rbtree_node_t *original = node;
10  rbtree_node_t **tmp = &tree->root;
11  rbtree_node_t *parent = NULL;
12  rbtree_node_t *save = NULL;
13 
14  while(*tmp != NULL)
15  {
16  int cmp = (*(tree->comparator))(node, *tmp);
17  parent = *tmp;
18 
19  if(cmp < 0)
20  tmp = &((*tmp)->child[LEFT]);
21  else if(cmp > 0)
22  tmp = &((*tmp)->child[RIGHT]);
23  else
24  {
25  if(!multi)
26  save = *tmp;
27 
28  tmp = &((*tmp)->child[LEFT]);
29  }
30  }
31 
32  if(save != NULL)
33  {
34  return save;
35  }
36 
37  *tmp = node;
38 
39  node->child[LEFT] = node->child[RIGHT] = NULL;
40  set_parent(node, parent);
41 
42  set_red(node);
43 
44  while(is_red((parent = get_parent(node))))
45  {
46  rbtree_node_t *grandparent = get_parent(parent);
47  int left = (parent == grandparent->child[LEFT]);
48  rbtree_node_t *uncle = grandparent->child[left];
49 
50  if(is_red(uncle))
51  {
52  set_black(uncle);
53  set_black(parent);
54  set_red(grandparent);
55 
56  node = grandparent;
57  }
58  else
59  {
60  if(parent->child[left] == node)
61  {
62  rbtree_node_t *tmp;
63 
64  rbtree_rotate(tree, parent, left);
65 
66  tmp = parent;
67  parent = node;
68  node = tmp;
69  }
70 
71  set_black(parent);
72  set_red(grandparent);
73  rbtree_rotate(tree, grandparent, !left);
74  }
75  }
76 
77  set_black(tree->root);
78 
79  tree->size += 1;
80 
81  return original;
82 }
83 
86  rbtree_node_t *node)
87 {
88  return do_insert(tree, node, 0);
89 }
90 
91 void
93  rbtree_node_t *node)
94 {
95  do_insert(tree, node, 1);
96 }
void rbtree_insert_multi(rbtree_t *tree, rbtree_node_t *node)
Definition: rbtree_insert.c:92
rbtree_node_t * node
Definition: rbtree.h:45
#define RIGHT
size_t size
Definition: rbtree.h:25
void rbtree_rotate(rbtree_t *tree, rbtree_node_t *node, int left)
Definition: rbtree_rotate.c:5
rbtree_node_t * rbtree_insert(rbtree_t *tree, rbtree_node_t *node)
Definition: rbtree_insert.c:85
Definition: rbtree.h:21
#define LEFT
rbtree_node_t * root
Definition: rbtree.h:23
rbtree_node_comparator_t comparator
Definition: rbtree.h:24
rbtree_node_t * child[2]
Definition: rbtree.h:18