From: Dana Jansens Date: Fri, 30 Oct 2009 22:49:59 +0000 (-0400) Subject: Make g_tree_node_search() and g_tree_node_find() search for a key within a given... X-Git-Url: http://git.openbox.org/?a=commitdiff_plain;h=20cbfab03b198960e8a48e1738736d47abc21daf;p=dana%2Fcg-glib.git Make g_tree_node_search() and g_tree_node_find() search for a key within a given version of the GTree, rather than always in the latest version. --- diff --git a/glib/gtree.c b/glib/gtree.c index fefc8e55..d466eb6e 100644 --- a/glib/gtree.c +++ b/glib/gtree.c @@ -117,7 +117,8 @@ static gboolean g_tree_remove_internal (GTree *tree, gboolean steal); static GTreeNode *g_tree_find_node (GTree *tree, gconstpointer key, - GTreeSearchType search_type); + GTreeSearchType search_type, + guint version); static gint g_tree_node_pre_order (GTreeNode *node, GTraverseFunc traverse_func, gpointer data); @@ -130,7 +131,8 @@ static gint g_tree_node_post_order (GTreeNode *node, static gpointer g_tree_node_search (GTreeNode *node, GCompareFunc search_func, gconstpointer data, - GTreeSearchType search_type); + GTreeSearchType search_type, + guint version); static gint g_tree_node_height (GTreeNode *node); static GTreeNode* g_tree_node_rotate_left (GTree *tree, GTreeNode *node); @@ -1092,7 +1094,7 @@ g_tree_lookup_related (GTree *tree, g_return_val_if_fail (tree != NULL, NULL); - node = g_tree_find_node (tree, key, search_type); + node = g_tree_find_node (tree, key, search_type, tree->version); return node ? node->data->value : NULL; } @@ -1121,7 +1123,7 @@ g_tree_lookup_extended (GTree *tree, g_return_val_if_fail (tree != NULL, FALSE); - node = g_tree_find_node (tree, lookup_key, G_TREE_SEARCH_EXACT); + node = g_tree_find_node (tree, lookup_key, G_TREE_SEARCH_EXACT, tree->version); if (node) { @@ -1289,7 +1291,8 @@ g_tree_search_related (GTree *tree, g_return_val_if_fail (tree != NULL, NULL); return g_tree_node_search (tree->root(NOW), - search_func, user_data, search_type); + search_func, user_data, search_type, + tree->version); } static gint @@ -1341,12 +1344,15 @@ g_tree_nnodes (GTree *tree) static GTreeNode * g_tree_find_node (GTree *tree, gconstpointer key, - GTreeSearchType search_type) + GTreeSearchType search_type, + guint version) { GTreeNode *node, *remember; + GTreeRootVersion *rv; gint cmp; - node = tree->root(NOW); + rv = g_tree_root_find_version (tree, version); + node = rv->root; if (!node) return NULL; @@ -1358,21 +1364,23 @@ g_tree_find_node (GTree *tree, return node; else if (cmp < 0) { + GTreeNodeVersion *nodev = g_tree_node_find_version (node, version); if (search_type == G_TREE_SEARCH_SUCCESSOR) remember = node; - if (!node->left_child(NOW)) + if (!nodev->left_child) return remember; - node = node->left(NOW); + node = nodev->left; } else { + GTreeNodeVersion *nodev = g_tree_node_find_version (node, version); if (search_type == G_TREE_SEARCH_PREDECESSOR) remember = node; - if (!node->right_child(NOW)) + if (!nodev->right_child) return remember; - node = node->right(NOW); + node = nodev->right; } } } @@ -1450,7 +1458,8 @@ static gpointer g_tree_node_search (GTreeNode *node, GCompareFunc search_func, gconstpointer data, - GTreeSearchType search_type) + GTreeSearchType search_type, + guint version) { gint dir; GTreeNode *remember; @@ -1466,21 +1475,23 @@ g_tree_node_search (GTreeNode *node, return node->data->value; else if (dir < 0) { + GTreeNodeVersion *nodev = g_tree_node_find_version (node, version); if (search_type == G_TREE_SEARCH_SUCCESSOR) remember = node; - if (!node->left_child(NOW)) + if (!nodev->left_child) return remember; - node = node->left(NOW); + node = nodev->left; } else { + GTreeNodeVersion *nodev = g_tree_node_find_version (node, version); if (search_type == G_TREE_SEARCH_PREDECESSOR) remember = node; - if (!node->right_child(NOW)) + if (!nodev->right_child) return remember; - node = node->right(NOW); + node = nodev->right; } } }