static void g_tree_remove_all (GTree *tree) { GTreeNode *node; GTreeNode *next; g_return_if_fail (tree != NULL); node = g_tree_first_node (tree); while (node) { next = g_tree_node_next (node); if (tree->key_destroy_func) tree->key_destroy_func (node->key); if (tree->value_destroy_func) tree->value_destroy_func (node->value); g_slice_free (GTreeNode, node); node = next; } tree->root = NULL; tree->nnodes = 0; }
/** * g_tree_destroy: * @tree: a #GTree. * * Destroys the #GTree. If keys and/or values are dynamically allocated, you * should either free them first or create the #GTree using g_tree_new_full(). * In the latter case the destroy functions you supplied will be called on * all keys and values before destroying the #GTree. **/ void g_tree_destroy (GTree *tree) { GTreeNode *node; GTreeNode *next; g_return_if_fail (tree != NULL); node = g_tree_first_node (tree); while (node) { next = g_tree_node_next (node); if (tree->key_destroy_func) tree->key_destroy_func (node->key); if (tree->value_destroy_func) tree->value_destroy_func (node->value); g_slice_free (GTreeNode, node); node = next; } g_free (tree); }
/** * g_tree_foreach: * @tree: a #GTree * @func: the function to call for each node visited. * If this function returns %TRUE, the traversal is stopped. * @user_data: user data to pass to the function * * Calls the given function for each of the key/value pairs in the #GTree. * The function is passed the key and value of each pair, and the given * @data parameter. The tree is traversed in sorted order. * * The tree may not be modified while iterating over it (you can't * add/remove items). To remove all items matching a predicate, you need * to add each item to a list in your #GTraverseFunc as you walk over * the tree, then walk the list and remove each item. */ void g_tree_foreach (GTree *tree, GTraverseFunc func, gpointer user_data) { GTreeNode *node; g_return_if_fail (tree != NULL); if (!tree->root) return; node = g_tree_first_node (tree); while (node) { if ((*func) (node->key, node->value, user_data)) break; node = g_tree_node_next (node); } }