summaryrefslogtreecommitdiff
path: root/kern/rbtree.c
diff options
context:
space:
mode:
Diffstat (limited to 'kern/rbtree.c')
-rw-r--r--kern/rbtree.c90
1 files changed, 57 insertions, 33 deletions
diff --git a/kern/rbtree.c b/kern/rbtree.c
index 569d3fac..49cb097f 100644
--- a/kern/rbtree.c
+++ b/kern/rbtree.c
@@ -34,8 +34,9 @@ rbtree_node_index(const struct rbtree_node *node,
assert(parent != NULL);
assert((node == NULL) || (rbtree_node_parent(node) == parent));
- if (parent->children[RBTREE_LEFT] == node)
+ if (parent->children[RBTREE_LEFT] == node) {
return RBTREE_LEFT;
+ }
assert(parent->children[RBTREE_RIGHT] == node);
@@ -126,8 +127,9 @@ rbtree_node_find_deepest(struct rbtree_node *node)
if (node == NULL) {
node = parent->children[RBTREE_RIGHT];
- if (node == NULL)
+ if (node == NULL) {
return parent;
+ }
}
}
}
@@ -151,16 +153,18 @@ rbtree_rotate(struct rbtree *tree, struct rbtree_node *node, int direction)
node->children[right] = rnode->children[left];
- if (rnode->children[left] != NULL)
+ if (rnode->children[left] != NULL) {
rbtree_node_set_parent(rnode->children[left], node);
+ }
rnode->children[left] = node;
rbtree_node_set_parent(rnode, parent);
- if (unlikely(parent == NULL))
+ if (unlikely(parent == NULL)) {
tree->root = rnode;
- else
+ } else {
parent->children[rbtree_node_index(node, parent)] = rnode;
+ }
rbtree_node_set_parent(node, rnode);
}
@@ -179,10 +183,11 @@ rbtree_insert_rebalance(struct rbtree *tree, struct rbtree_node *parent,
node->children[RBTREE_LEFT] = NULL;
node->children[RBTREE_RIGHT] = NULL;
- if (unlikely(parent == NULL))
+ if (unlikely(parent == NULL)) {
tree->root = node;
- else
+ } else {
parent->children[index] = node;
+ }
for (;;) {
if (parent == NULL) {
@@ -190,8 +195,9 @@ rbtree_insert_rebalance(struct rbtree *tree, struct rbtree_node *parent,
break;
}
- if (rbtree_node_is_black(parent))
+ if (rbtree_node_is_black(parent)) {
break;
+ }
grand_parent = rbtree_node_parent(parent);
assert(grand_parent != NULL);
@@ -242,11 +248,11 @@ rbtree_remove(struct rbtree *tree, struct rbtree_node *node)
struct rbtree_node *child, *parent, *brother;
int color, left, right;
- if (node->children[RBTREE_LEFT] == NULL)
+ if (node->children[RBTREE_LEFT] == NULL) {
child = node->children[RBTREE_RIGHT];
- else if (node->children[RBTREE_RIGHT] == NULL)
+ } else if (node->children[RBTREE_RIGHT] == NULL) {
child = node->children[RBTREE_LEFT];
- else {
+ } else {
struct rbtree_node *successor;
/*
@@ -255,17 +261,19 @@ rbtree_remove(struct rbtree *tree, struct rbtree_node *node)
successor = node->children[RBTREE_RIGHT];
- while (successor->children[RBTREE_LEFT] != NULL)
+ while (successor->children[RBTREE_LEFT] != NULL) {
successor = successor->children[RBTREE_LEFT];
+ }
color = rbtree_node_color(successor);
child = successor->children[RBTREE_RIGHT];
parent = rbtree_node_parent(node);
- if (unlikely(parent == NULL))
+ if (unlikely(parent == NULL)) {
tree->root = successor;
- else
+ } else {
parent->children[rbtree_node_index(node, parent)] = successor;
+ }
parent = rbtree_node_parent(successor);
@@ -276,16 +284,17 @@ rbtree_remove(struct rbtree *tree, struct rbtree_node *node)
successor->children[RBTREE_LEFT] = node->children[RBTREE_LEFT];
rbtree_node_set_parent(successor->children[RBTREE_LEFT], successor);
- if (node == parent)
+ if (node == parent) {
parent = successor;
- else {
+ } else {
successor->children[RBTREE_RIGHT] = node->children[RBTREE_RIGHT];
rbtree_node_set_parent(successor->children[RBTREE_RIGHT],
successor);
parent->children[RBTREE_LEFT] = child;
- if (child != NULL)
+ if (child != NULL) {
rbtree_node_set_parent(child, parent);
+ }
}
goto update_color;
@@ -298,21 +307,24 @@ rbtree_remove(struct rbtree *tree, struct rbtree_node *node)
color = rbtree_node_color(node);
parent = rbtree_node_parent(node);
- if (child != NULL)
+ if (child != NULL) {
rbtree_node_set_parent(child, parent);
+ }
- if (unlikely(parent == NULL))
+ if (unlikely(parent == NULL)) {
tree->root = child;
- else
+ } else {
parent->children[rbtree_node_index(node, parent)] = child;
+ }
/*
* The node has been removed, update the colors. The child pointer can
* be null, in which case it is considered a black leaf.
*/
update_color:
- if (color == RBTREE_COLOR_RED)
+ if (color == RBTREE_COLOR_RED) {
return;
+ }
for (;;) {
if ((child != NULL) && rbtree_node_is_red(child)) {
@@ -320,8 +332,9 @@ update_color:
break;
}
- if (parent == NULL)
+ if (parent == NULL) {
break;
+ }
left = rbtree_node_index(child, parent);
right = 1 - left;
@@ -383,13 +396,15 @@ rbtree_nearest(struct rbtree_node *parent, int index, int direction)
{
assert(rbtree_check_index(direction));
- if (parent == NULL)
+ if (parent == NULL) {
return NULL;
+ }
assert(rbtree_check_index(index));
- if (index != direction)
+ if (index != direction) {
return parent;
+ }
return rbtree_walk(parent, direction);
}
@@ -403,8 +418,9 @@ rbtree_firstlast(const struct rbtree *tree, int direction)
prev = NULL;
- for (cur = tree->root; cur != NULL; cur = cur->children[direction])
+ for (cur = tree->root; cur != NULL; cur = cur->children[direction]) {
prev = cur;
+ }
return prev;
}
@@ -419,14 +435,16 @@ rbtree_walk(struct rbtree_node *node, int direction)
left = direction;
right = 1 - left;
- if (node == NULL)
+ if (node == NULL) {
return NULL;
+ }
if (node->children[left] != NULL) {
node = node->children[left];
- while (node->children[right] != NULL)
+ while (node->children[right] != NULL) {
node = node->children[right];
+ }
} else {
struct rbtree_node *parent;
int index;
@@ -434,14 +452,16 @@ rbtree_walk(struct rbtree_node *node, int direction)
for (;;) {
parent = rbtree_node_parent(node);
- if (parent == NULL)
+ if (parent == NULL) {
return NULL;
+ }
index = rbtree_node_index(node, parent);
node = parent;
- if (index == right)
+ if (index == right) {
break;
+ }
}
}
@@ -455,8 +475,9 @@ rbtree_postwalk_deepest(const struct rbtree *tree)
node = tree->root;
- if (node == NULL)
+ if (node == NULL) {
return NULL;
+ }
return rbtree_node_find_deepest(node);
}
@@ -467,23 +488,26 @@ rbtree_postwalk_unlink(struct rbtree_node *node)
struct rbtree_node *parent;
int index;
- if (node == NULL)
+ if (node == NULL) {
return NULL;
+ }
assert(node->children[RBTREE_LEFT] == NULL);
assert(node->children[RBTREE_RIGHT] == NULL);
parent = rbtree_node_parent(node);
- if (parent == NULL)
+ if (parent == NULL) {
return NULL;
+ }
index = rbtree_node_index(node, parent);
parent->children[index] = NULL;
node = parent->children[RBTREE_RIGHT];
- if (node == NULL)
+ if (node == NULL) {
return parent;
+ }
return rbtree_node_find_deepest(node);
}