static void _gtk_rbtree_insert_fixup (GtkRBTree *tree,
GtkRBNode *node);
static void _gtk_rbtree_remove_node_fixup (GtkRBTree *tree,
- GtkRBNode *node);
+ GtkRBNode *node,
+ GtkRBNode *parent);
static inline void _fixup_validation (GtkRBTree *tree,
GtkRBNode *node);
static inline void _fixup_total_count (GtkRBTree *tree,
static void
_gtk_rbtree_remove_node_fixup (GtkRBTree *tree,
- GtkRBNode *node)
+ GtkRBNode *node,
+ GtkRBNode *parent)
{
- GtkRBNode *parent = node->parent;
-
while (node != tree->root && GTK_RBNODE_GET_COLOR (node) == GTK_RBNODE_BLACK)
{
if (node == parent->left)
x = y->right;
/* remove y from the parent chain */
- x->parent = y->parent;
+ if (x != tree->nil)
+ x->parent = y->parent;
if (y->parent != tree->nil)
{
if (y == y->parent->left)
*/
gtk_rbnode_adjust (tree, y, -1, - y_total_count, - y_height);
+ if (GTK_RBNODE_GET_COLOR (y) == GTK_RBNODE_BLACK)
+ _gtk_rbtree_remove_node_fixup (tree, x, y->parent);
+
if (y != node)
{
gint node_height, node_total_count;
/* Move the node over */
if (GTK_RBNODE_GET_COLOR (node) != GTK_RBNODE_GET_COLOR (y))
- {
- node->flags ^= (GTK_RBNODE_BLACK | GTK_RBNODE_RED);
- y->flags ^= (GTK_RBNODE_BLACK | GTK_RBNODE_RED);
- }
+ y->flags ^= (GTK_RBNODE_BLACK | GTK_RBNODE_RED);
y->left = node->left;
if (y->left != tree->nil)
y_height - node_height);
}
- if (GTK_RBNODE_GET_COLOR (node) == GTK_RBNODE_BLACK)
- _gtk_rbtree_remove_node_fixup (tree, x);
_gtk_rbnode_free (node);
#ifdef G_ENABLE_DEBUG