Make g_tree_node_search() and g_tree_node_find() search for a key within a given...
authorDana Jansens <danakj@orodu.net>
Fri, 30 Oct 2009 22:49:59 +0000 (18:49 -0400)
committerDana Jansens <danakj@orodu.net>
Thu, 12 Nov 2009 21:54:05 +0000 (16:54 -0500)
glib/gtree.c

index fefc8e55889d7b29de6e752d2944c013ca2fa535..d466eb6ec86f483d9b8f8cf1b80f8677b756a469 100644 (file)
@@ -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;
        }
     }
 }