Importing rbtree changes from nJScript.

This commit is contained in:
Igor Sysoev
2017-01-30 12:14:49 +03:00
parent ba0391577b
commit 952291c93c
6 changed files with 59 additions and 169 deletions

View File

@@ -26,23 +26,13 @@ nxt_inline void nxt_rbtree_parent_relink(nxt_rbtree_node_t *subst,
#define NXT_RBTREE_RED 1
#define nxt_rbtree_set_callback_type(tree, type) \
(tree)->sentinel.spare = type
#define nxt_rbtree_has_insertion_callback(tree) \
((tree)->sentinel.spare != 0)
#define nxt_rbtree_comparison_callback(tree) \
((nxt_rbtree_compare_t) (tree)->sentinel.right)
void
nxt_rbtree_init(nxt_rbtree_t *tree, nxt_rbtree_compare_t compare,
nxt_rbtree_insert_t insert)
nxt_rbtree_init(nxt_rbtree_t *tree, nxt_rbtree_compare_t compare)
{
void *callback;
nxt_bool_t insertion;
/*
* The sentinel is used as a leaf node sentinel and as a tree root
* sentinel: it is a parent of a root node and the root node is
@@ -56,13 +46,10 @@ nxt_rbtree_init(nxt_rbtree_t *tree, nxt_rbtree_compare_t compare,
tree->sentinel.left = &tree->sentinel;
/*
* The sentinel's right child is never used so either insertion
* or comparison callback can be safely stored here.
* The sentinel's right child is never used so
* comparison callback can be safely stored here.
*/
insertion = (insert != NULL);
nxt_rbtree_set_callback_type(tree, insertion);
callback = insertion ? (void *) insert : (void *) compare;
tree->sentinel.right = callback;
tree->sentinel.right = (void *) compare;
/* The root and leaf sentinel must be black. */
tree->sentinel.color = NXT_RBTREE_BLACK;
@@ -72,9 +59,7 @@ nxt_rbtree_init(nxt_rbtree_t *tree, nxt_rbtree_compare_t compare,
void
nxt_rbtree_insert(nxt_rbtree_t *tree, nxt_rbtree_part_t *part)
{
void *callback;
nxt_rbtree_node_t *node, *new_node, *sentinel, **child;
nxt_rbtree_insert_t insert;
nxt_rbtree_compare_t compare;
new_node = (nxt_rbtree_node_t *) part;
@@ -86,32 +71,21 @@ nxt_rbtree_insert(nxt_rbtree_t *tree, nxt_rbtree_part_t *part)
new_node->right = sentinel;
new_node->color = NXT_RBTREE_RED;
callback = tree->sentinel.right;
compare = (nxt_rbtree_compare_t) tree->sentinel.right;
child = &nxt_rbtree_root(tree);
if (nxt_rbtree_has_insertion_callback(tree)) {
insert = (nxt_rbtree_insert_t) callback;
while (*child != sentinel) {
node = *child;
insert(node, new_node, sentinel);
nxt_prefetch(node->left);
nxt_prefetch(node->right);
} else {
compare = (nxt_rbtree_compare_t) callback;
child = &nxt_rbtree_root(tree);
while (*child != sentinel) {
node = *child;
nxt_prefetch(node->left);
nxt_prefetch(node->right);
child = (compare(new_node, node) < 0) ? &node->left : &node->right;
}
*child = new_node;
new_node->parent = node;
child = (compare(new_node, node) < 0) ? &node->left : &node->right;
}
*child = new_node;
new_node->parent = node;
nxt_rbtree_insert_fixup(new_node);
node = nxt_rbtree_root(tree);
@@ -158,8 +132,12 @@ nxt_rbtree_insert_fixup(nxt_rbtree_node_t *node)
grandparent = parent->parent;
grandparent->color = NXT_RBTREE_RED;
nxt_rbtree_right_rotate(grandparent);
continue;
/*
* nxt_rbtree_right_rotate() does not change node->parent
* color which is now black, so testing color is not required
* to return from function.
*/
return;
}
} else {
@@ -179,7 +157,8 @@ nxt_rbtree_insert_fixup(nxt_rbtree_node_t *node)
grandparent->color = NXT_RBTREE_RED;
nxt_rbtree_left_rotate(grandparent);
continue;
/* See the comment in the symmetric branch above. */
return;
}
}
@@ -195,7 +174,7 @@ nxt_rbtree_insert_fixup(nxt_rbtree_node_t *node)
nxt_rbtree_node_t *
nxt_rbtree_find(nxt_rbtree_t *tree, nxt_rbtree_part_t *part)
{
nxt_int_t n;
intptr_t n;
nxt_rbtree_node_t *node, *next, *sentinel;
nxt_rbtree_compare_t compare;
@@ -229,7 +208,7 @@ nxt_rbtree_find(nxt_rbtree_t *tree, nxt_rbtree_part_t *part)
nxt_rbtree_node_t *
nxt_rbtree_find_less_or_equal(nxt_rbtree_t *tree, nxt_rbtree_part_t *part)
{
nxt_int_t n;
intptr_t n;
nxt_rbtree_node_t *node, *retval, *next, *sentinel;
nxt_rbtree_compare_t compare;
@@ -266,7 +245,7 @@ nxt_rbtree_find_less_or_equal(nxt_rbtree_t *tree, nxt_rbtree_part_t *part)
nxt_rbtree_node_t *
nxt_rbtree_find_greater_or_equal(nxt_rbtree_t *tree, nxt_rbtree_part_t *part)
{
nxt_int_t n;
intptr_t n;
nxt_rbtree_node_t *node, *retval, *next, *sentinel;
nxt_rbtree_compare_t compare;
@@ -303,7 +282,7 @@ nxt_rbtree_find_greater_or_equal(nxt_rbtree_t *tree, nxt_rbtree_part_t *part)
void
nxt_rbtree_delete(nxt_rbtree_t *tree, nxt_rbtree_part_t *part)
{
nxt_uint_t color;
uint8_t color;
nxt_rbtree_node_t *node, *sentinel, *subst, *child;
node = (nxt_rbtree_node_t *) part;