* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
/* A Red-Black Tree implementation used specifically by GtkTreeView.
GTK_RBNODE_IS_PARENT = 1 << 2,
GTK_RBNODE_IS_SELECTED = 1 << 3,
GTK_RBNODE_IS_PRELIT = 1 << 4,
- GTK_RBNODE_IS_SEMI_COLLAPSED = 1 << 5,
- GTK_RBNODE_IS_SEMI_EXPANDED = 1 << 6,
GTK_RBNODE_INVALID = 1 << 7,
GTK_RBNODE_COLUMN_INVALID = 1 << 8,
GTK_RBNODE_DESCENDANTS_INVALID = 1 << 9,
GTK_RBNODE_NON_COLORS = GTK_RBNODE_IS_PARENT |
GTK_RBNODE_IS_SELECTED |
GTK_RBNODE_IS_PRELIT |
- GTK_RBNODE_IS_SEMI_COLLAPSED |
- GTK_RBNODE_IS_SEMI_EXPANDED |
GTK_RBNODE_INVALID |
GTK_RBNODE_COLUMN_INVALID |
GTK_RBNODE_DESCENDANTS_INVALID
struct _GtkRBTree
{
GtkRBNode *root;
- GtkRBNode *nil;
GtkRBTree *parent_tree;
GtkRBNode *parent_node;
};
{
guint flags : 14;
- /* We keep track of whether the aggregate count of children plus 1
- * for the node itself comes to an even number. The parity flag is
- * the total count of children mod 2, where the total count of
- * children gets computed in the same way that the total offset gets
- * computed. i.e. not the same as the "count" field below which
- * doesn't include children. We could replace parity with a
- * full-size int field here, and then take % 2 to get the parity flag,
- * but that would use extra memory.
- */
-
- guint parity : 1;
-
GtkRBNode *left;
GtkRBNode *right;
GtkRBNode *parent;
* i.e. node->left->count + node->right->count + 1
*/
gint count;
+ /* count the number of total nodes beneath us, including nodes
+ * of children trees.
+ * i.e. node->left->count + node->right->count + node->children->root->count + 1
+ */
+ guint total_count;
/* this is the total of sizes of
* node->left, node->right, our own height, and the height
#define GTK_RBNODE_FLAG_SET(node, flag) (node?(((node->flags&flag)==flag)?TRUE:FALSE):FALSE)
-void _gtk_rbtree_push_allocator (GAllocator *allocator);
-void _gtk_rbtree_pop_allocator (void);
GtkRBTree *_gtk_rbtree_new (void);
void _gtk_rbtree_free (GtkRBTree *tree);
void _gtk_rbtree_remove (GtkRBTree *tree);
gboolean valid);
void _gtk_rbtree_remove_node (GtkRBTree *tree,
GtkRBNode *node);
+gboolean _gtk_rbtree_is_nil (GtkRBNode *node);
void _gtk_rbtree_reorder (GtkRBTree *tree,
gint *new_order,
gint length);
+gboolean _gtk_rbtree_contains (GtkRBTree *tree,
+ GtkRBTree *potential_child);
GtkRBNode *_gtk_rbtree_find_count (GtkRBTree *tree,
gint count);
void _gtk_rbtree_node_set_height (GtkRBTree *tree,
gboolean mark_valid);
gint _gtk_rbtree_node_find_offset (GtkRBTree *tree,
GtkRBNode *node);
-gint _gtk_rbtree_node_find_parity (GtkRBTree *tree,
+guint _gtk_rbtree_node_get_index (GtkRBTree *tree,
GtkRBNode *node);
+gboolean _gtk_rbtree_find_index (GtkRBTree *tree,
+ guint index,
+ GtkRBTree **new_tree,
+ GtkRBNode **new_node);
gint _gtk_rbtree_find_offset (GtkRBTree *tree,
gint offset,
GtkRBTree **new_tree,
GTraverseType order,
GtkRBTreeTraverseFunc func,
gpointer data);
+GtkRBNode *_gtk_rbtree_first (GtkRBTree *tree);
GtkRBNode *_gtk_rbtree_next (GtkRBTree *tree,
GtkRBNode *node);
GtkRBNode *_gtk_rbtree_prev (GtkRBTree *tree,
gint _gtk_rbtree_get_depth (GtkRBTree *tree);
-/* This func checks the integrity of the tree */
-#ifdef G_ENABLE_DEBUG
-void _gtk_rbtree_test (const gchar *where,
- GtkRBTree *tree);
-void _gtk_rbtree_debug_spew (GtkRBTree *tree);
-#endif
-
G_END_DECLS