summaryrefslogtreecommitdiff
path: root/storage/xtradb/ut/ut0rbt.c
diff options
context:
space:
mode:
Diffstat (limited to 'storage/xtradb/ut/ut0rbt.c')
-rw-r--r--storage/xtradb/ut/ut0rbt.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/storage/xtradb/ut/ut0rbt.c b/storage/xtradb/ut/ut0rbt.c
index 3d7bc91e714..643312ab79d 100644
--- a/storage/xtradb/ut/ut0rbt.c
+++ b/storage/xtradb/ut/ut0rbt.c
@@ -48,7 +48,6 @@ red-black properties:
#endif
#define ROOT(t) (t->root->left)
-#define SIZEOF_NODE(t) ((sizeof(ib_rbt_node_t) + t->sizeof_value) - 1)
/****************************************************************//**
Print out the sub-tree recursively. */
@@ -829,6 +828,21 @@ rbt_add_node(
node = (ib_rbt_node_t*) ut_malloc(SIZEOF_NODE(tree));
memcpy(node->value, value, tree->sizeof_value);
+ return(rbt_add_preallocated_node(tree, parent, node));
+}
+
+/****************************************************************//**
+Add a new caller-provided node to tree at the specified position.
+The node must have its key fields initialized correctly.
+@return added node */
+UNIV_INTERN
+const ib_rbt_node_t*
+rbt_add_preallocated_node(
+/*======================*/
+ ib_rbt_t* tree, /*!< in: rb tree */
+ ib_rbt_bound_t* parent, /*!< in: parent */
+ ib_rbt_node_t* node) /*!< in: node */
+{
node->parent = node->left = node->right = tree->nil;
/* If tree is empty */
@@ -1137,7 +1151,17 @@ rbt_clear(
ib_rbt_t* tree) /*!< in: rb tree */
{
rbt_free_node(ROOT(tree), tree->nil);
+ rbt_reset(tree);
+}
+/****************************************************************//**
+Clear the tree without deleting and freeing its nodes. */
+UNIV_INTERN
+void
+rbt_reset(
+/*======*/
+ ib_rbt_t* tree) /*!< in: rb tree */
+{
tree->n_nodes = 0;
tree->root->left = tree->root->right = tree->nil;
}