void _gtk_rbtree_node_mark_valid (GtkRBTree *tree, GtkRBNode *node) { if ((!GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_INVALID)) && (!GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_COLUMN_INVALID))) return; GTK_RBNODE_UNSET_FLAG (node, GTK_RBNODE_INVALID); GTK_RBNODE_UNSET_FLAG (node, GTK_RBNODE_COLUMN_INVALID); do { if ((GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_INVALID)) || (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_COLUMN_INVALID)) || (node->children && GTK_RBNODE_FLAG_SET (node->children->root, GTK_RBNODE_DESCENDANTS_INVALID)) || (GTK_RBNODE_FLAG_SET (node->left, GTK_RBNODE_DESCENDANTS_INVALID)) || (GTK_RBNODE_FLAG_SET (node->right, GTK_RBNODE_DESCENDANTS_INVALID))) return; GTK_RBNODE_UNSET_FLAG (node, GTK_RBNODE_DESCENDANTS_INVALID); node = node->parent; if (_gtk_rbtree_is_nil (node)) { node = tree->parent_node; tree = tree->parent_tree; } } while (node); }
void _gtk_rbtree_remove (GtkRBTree *tree) { #ifdef G_ENABLE_DEBUG GtkRBTree *tmp_tree; if (gtk_get_debug_flags () & GTK_DEBUG_TREE) _gtk_rbtree_test (G_STRLOC, tree); #endif /* ugly hack to make _fixup_validation work in the first iteration of the * loop below */ GTK_RBNODE_UNSET_FLAG (tree->root, GTK_RBNODE_DESCENDANTS_INVALID); gtk_rbnode_adjust (tree->parent_tree, tree->parent_node, 0, - (int) tree->root->total_count, - tree->root->offset); #ifdef G_ENABLE_DEBUG tmp_tree = tree->parent_tree; #endif _gtk_rbtree_free (tree); #ifdef G_ENABLE_DEBUG if (gtk_get_debug_flags () & GTK_DEBUG_TREE) _gtk_rbtree_test (G_STRLOC, tmp_tree); #endif }
static void reorder_prepare (GtkRBTree *tree, GtkRBNode *node, gpointer data) { node->offset -= node->left->offset + node->right->offset; GTK_RBNODE_UNSET_FLAG (node, GTK_RBNODE_DESCENDANTS_INVALID); }
/* Draconian version */ void _gtk_rbtree_node_mark_valid (GtkRBTree *tree, GtkRBNode *node) { GTK_RBNODE_UNSET_FLAG (node, GTK_RBNODE_INVALID); GTK_RBNODE_UNSET_FLAG (node, GTK_RBNODE_COLUMN_INVALID); do { _fixup_validation (tree, node); node = node->parent; if (_gtk_rbtree_is_nil (node)) { node = tree->parent_node; tree = tree->parent_tree; } } while (node); }
static inline void _fixup_validation (GtkRBTree *tree, GtkRBNode *node) { if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_INVALID) || GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_COLUMN_INVALID) || GTK_RBNODE_FLAG_SET (node->left, GTK_RBNODE_DESCENDANTS_INVALID) || GTK_RBNODE_FLAG_SET (node->right, GTK_RBNODE_DESCENDANTS_INVALID) || (node->children != NULL && GTK_RBNODE_FLAG_SET (node->children->root, GTK_RBNODE_DESCENDANTS_INVALID))) { GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_DESCENDANTS_INVALID); } else { GTK_RBNODE_UNSET_FLAG (node, GTK_RBNODE_DESCENDANTS_INVALID); } }
void _gtk_rbtree_remove (GtkRBTree *tree) { GtkRBTree *tmp_tree; GtkRBNode *tmp_node; gint height = tree->root->offset; #ifdef G_ENABLE_DEBUG if (gtk_debug_flags & GTK_DEBUG_TREE) _gtk_rbtree_test (G_STRLOC, tree); #endif tmp_tree = tree->parent_tree; tmp_node = tree->parent_node; /* ugly hack to make _fixup_validation work in the first iteration of the * loop below */ GTK_RBNODE_UNSET_FLAG (tree->root, GTK_RBNODE_DESCENDANTS_INVALID); while (tmp_tree && tmp_node && tmp_node != tmp_tree->nil) { _fixup_validation (tmp_tree, tmp_node); tmp_node->offset -= height; /* If the removed tree was odd, flip all parents */ if (tree->root->parity) tmp_node->parity = !tmp_node->parity; tmp_node = tmp_node->parent; if (tmp_node == tmp_tree->nil) { tmp_node = tmp_tree->parent_node; tmp_tree = tmp_tree->parent_tree; } } tmp_tree = tree->parent_tree; tmp_node = tree->parent_node; _gtk_rbtree_free (tree); #ifdef G_ENABLE_DEBUG if (gtk_debug_flags & GTK_DEBUG_TREE) _gtk_rbtree_test (G_STRLOC, tmp_tree); #endif }
static void gtk_rbtree_reorder_fixup (GtkRBTree *tree, GtkRBNode *node) { if (node == tree->nil) return; node->parity = 1; if (node->left != tree->nil) { gtk_rbtree_reorder_fixup (tree, node->left); node->offset += node->left->offset; node->parity += node->left->parity; } if (node->right != tree->nil) { gtk_rbtree_reorder_fixup (tree, node->right); node->offset += node->right->offset; node->parity += node->right->parity; } if (node->children) { node->offset += node->children->root->offset; node->parity += node->children->root->parity; } if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_INVALID) || (node->right != tree->nil && GTK_RBNODE_FLAG_SET (node->right, GTK_RBNODE_DESCENDANTS_INVALID)) || (node->left != tree->nil && GTK_RBNODE_FLAG_SET (node->left, GTK_RBNODE_DESCENDANTS_INVALID)) || (node->children && GTK_RBNODE_FLAG_SET (node->children->root, GTK_RBNODE_DESCENDANTS_INVALID))) GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_DESCENDANTS_INVALID); else GTK_RBNODE_UNSET_FLAG (node, GTK_RBNODE_DESCENDANTS_INVALID); }