static void test_reorder (void) { guint n = g_test_perf () ? 1000000 : 100; GtkRBTree *tree; GtkRBNode *node; gint *reorder; guint i; double elapsed; reorder = fisher_yates_shuffle (n); tree = create_unsorted_tree (reorder, n); g_test_timer_start (); _gtk_rbtree_reorder (tree, reorder, n); elapsed = g_test_timer_elapsed (); if (g_test_perf ()) g_test_minimized_result (elapsed, "reordering rbtree with %u items: %gsec", n, elapsed); _gtk_rbtree_test (tree); for (node = _gtk_rbtree_first (tree), i = 0; node != NULL; node = _gtk_rbtree_next (tree, node), i++) { g_assert (GTK_RBNODE_GET_HEIGHT (node) == i); } g_assert (i == n); _gtk_rbtree_free (tree); }
static void test_remove_node (void) { GtkRBTree *tree; tree = create_rbtree (3, 16, g_test_thorough ()); while (tree->root->count > 1) { GtkRBTree *find_tree; GtkRBNode *find_node; guint i; i = g_test_rand_int_range (0, tree->root->total_count); if (!_gtk_rbtree_find_index (tree, i, &find_tree, &find_node)) { /* We search an available index, so we mustn't fail. */ g_assert_not_reached (); } _gtk_rbtree_test (find_tree); if (find_tree->root->count == 1) { _gtk_rbtree_remove (find_tree); } else _gtk_rbtree_remove_node (find_tree, find_node); _gtk_rbtree_test (tree); } _gtk_rbtree_free (tree); }
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 test_create (void) { GtkRBTree *tree; tree = create_rbtree (5, 5, TRUE); _gtk_rbtree_free (tree); }
static void _gtk_rbtree_free_helper (GtkRBTree *tree, GtkRBNode *node, gpointer data) { if (node->children) _gtk_rbtree_free (node->children); _gtk_rbnode_free (node); }
static void test_remove_root (void) { GtkRBTree *tree; GtkRBNode *node; tree = _gtk_rbtree_new (); node = _gtk_rbtree_insert_after (tree, NULL, 1, TRUE); _gtk_rbtree_insert_after (tree, node, 2, TRUE); _gtk_rbtree_insert_before (tree, node, 3, TRUE); _gtk_rbtree_remove_node (tree, node); _gtk_rbtree_free (tree); }
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 test_insert_before (void) { guint i; GtkRBTree *tree; GtkRBNode *node; tree = _gtk_rbtree_new (); node = NULL; for (i = 1; i <= 100; i++) { node = _gtk_rbtree_insert_before (tree, node, i, TRUE); _gtk_rbtree_test (tree); g_assert (tree->root->count == i); g_assert (tree->root->total_count == i); g_assert (tree->root->offset == i * (i + 1) / 2); } _gtk_rbtree_free (tree); }