void _gtk_rbtree_mark_invalid (GtkRBTree *tree) { GtkRBNode *node; if (tree == NULL) return; node = _gtk_rbtree_first (tree); do { GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_INVALID); GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_DESCENDANTS_INVALID); if (node->children) _gtk_rbtree_mark_invalid (node->children); } while ((node = _gtk_rbtree_next (tree, node)) != NULL); }
void _gtk_rbtree_node_mark_invalid (GtkRBTree *tree, GtkRBNode *node) { if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_INVALID)) return; GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_INVALID); do { if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_DESCENDANTS_INVALID)) return; GTK_RBNODE_SET_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_mark_invalid (GtkRBTree *tree) { GtkRBNode *node; if (tree == NULL) return; node = tree->root; g_assert (node); while (node->left != tree->nil) node = node->left; do { GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_INVALID); GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_DESCENDANTS_INVALID); if (node->children) _gtk_rbtree_mark_invalid (node->children); } while ((node = _gtk_rbtree_next (tree, node)) != NULL); }
/* Draconian version. */ void _gtk_rbtree_node_mark_invalid (GtkRBTree *tree, GtkRBNode *node) { GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_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); } }
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); }