added new function g_tree_lookup_extended().
authorSven Neumann <sven@gimp.org>
Thu, 8 Mar 2001 17:51:39 +0000 (17:51 +0000)
committerSven Neumann <neo@src.gnome.org>
Thu, 8 Mar 2001 17:51:39 +0000 (17:51 +0000)
2001-03-08  Sven Neumann  <sven@gimp.org>

* gtree.[ch]:
* docs/reference/glib/tmpl/trees-binary.sgml: added new function
g_tree_lookup_extended().

13 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
docs/reference/glib/tmpl/trees-binary.sgml
glib/gtree.c
glib/gtree.h
gtree.c
gtree.h

index f7367cb..2fef666 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2001-03-08  Sven Neumann  <sven@gimp.org>
+
+       * gtree.[ch]: 
+       * docs/reference/glib/tmpl/trees-binary.sgml: added new function 
+       g_tree_lookup_extended().
+
 Thu Mar  8 16:23:34 2001  Tim Janik  <timj@gtk.org>
 
        * ghook.[hc]: destruction cleanup. there's one
index f7367cb..2fef666 100644 (file)
@@ -1,3 +1,9 @@
+2001-03-08  Sven Neumann  <sven@gimp.org>
+
+       * gtree.[ch]: 
+       * docs/reference/glib/tmpl/trees-binary.sgml: added new function 
+       g_tree_lookup_extended().
+
 Thu Mar  8 16:23:34 2001  Tim Janik  <timj@gtk.org>
 
        * ghook.[hc]: destruction cleanup. there's one
index f7367cb..2fef666 100644 (file)
@@ -1,3 +1,9 @@
+2001-03-08  Sven Neumann  <sven@gimp.org>
+
+       * gtree.[ch]: 
+       * docs/reference/glib/tmpl/trees-binary.sgml: added new function 
+       g_tree_lookup_extended().
+
 Thu Mar  8 16:23:34 2001  Tim Janik  <timj@gtk.org>
 
        * ghook.[hc]: destruction cleanup. there's one
index f7367cb..2fef666 100644 (file)
@@ -1,3 +1,9 @@
+2001-03-08  Sven Neumann  <sven@gimp.org>
+
+       * gtree.[ch]: 
+       * docs/reference/glib/tmpl/trees-binary.sgml: added new function 
+       g_tree_lookup_extended().
+
 Thu Mar  8 16:23:34 2001  Tim Janik  <timj@gtk.org>
 
        * ghook.[hc]: destruction cleanup. there's one
index f7367cb..2fef666 100644 (file)
@@ -1,3 +1,9 @@
+2001-03-08  Sven Neumann  <sven@gimp.org>
+
+       * gtree.[ch]: 
+       * docs/reference/glib/tmpl/trees-binary.sgml: added new function 
+       g_tree_lookup_extended().
+
 Thu Mar  8 16:23:34 2001  Tim Janik  <timj@gtk.org>
 
        * ghook.[hc]: destruction cleanup. there's one
index f7367cb..2fef666 100644 (file)
@@ -1,3 +1,9 @@
+2001-03-08  Sven Neumann  <sven@gimp.org>
+
+       * gtree.[ch]: 
+       * docs/reference/glib/tmpl/trees-binary.sgml: added new function 
+       g_tree_lookup_extended().
+
 Thu Mar  8 16:23:34 2001  Tim Janik  <timj@gtk.org>
 
        * ghook.[hc]: destruction cleanup. there's one
index f7367cb..2fef666 100644 (file)
@@ -1,3 +1,9 @@
+2001-03-08  Sven Neumann  <sven@gimp.org>
+
+       * gtree.[ch]: 
+       * docs/reference/glib/tmpl/trees-binary.sgml: added new function 
+       g_tree_lookup_extended().
+
 Thu Mar  8 16:23:34 2001  Tim Janik  <timj@gtk.org>
 
        * ghook.[hc]: destruction cleanup. there's one
index f7367cb..2fef666 100644 (file)
@@ -1,3 +1,9 @@
+2001-03-08  Sven Neumann  <sven@gimp.org>
+
+       * gtree.[ch]: 
+       * docs/reference/glib/tmpl/trees-binary.sgml: added new function 
+       g_tree_lookup_extended().
+
 Thu Mar  8 16:23:34 2001  Tim Janik  <timj@gtk.org>
 
        * ghook.[hc]: destruction cleanup. there's one
index 11ab995..58fa334 100644 (file)
@@ -17,7 +17,8 @@ To create a new #GTree use g_tree_new().
 To insert a key/value pair into a #GTree use g_tree_insert().
 </para>
 <para>
-To lookup the value corresponding to a given key, use g_tree_lookup().
+To lookup the value corresponding to a given key, use g_tree_lookup() and
+g_tree_lookup_extended().
 </para>
 <para>
 To find out the number of nodes in a #GTree, use g_tree_nnodes().
@@ -123,6 +124,22 @@ added, key lookup is very fast.
 @Returns: the value corresponding to the key.
 
 
+<!-- ##### FUNCTION g_tree_lookup_extended ##### -->
+<para>
+Gets the original key and the associated value and a gboolean which is 
+TRUE if the key was found. This is useful if you need to free the memory 
+allocated for the original key, for example before calling g_tree_remove().
+Since a #GTree is automatically balanced as key/value pairs are added, 
+key lookup is very fast.
+</para>
+
+@tree: a #GTree.
+@lookup_key: the key to look up.
+@orig_key: returns the original key.
+@value: returns the value associated with the key.
+@Returns: TRUE if the key was found in the #GTree.
+
+
 <!-- ##### FUNCTION g_tree_search ##### -->
 <para>
 Searches a #GTree using an alternative form of the comparison function.
index 5e0c0f5..7185238 100644 (file)
@@ -238,6 +238,36 @@ g_tree_lookup (GTree         *tree,
                              rtree->key_compare_data, key);
 }
 
+gboolean
+g_tree_lookup_extended (GTree         *tree,
+                        gconstpointer  lookup_key,
+                        gpointer      *orig_key,
+                        gpointer      *value)
+{
+  GRealTree *rtree;
+  GTreeNode *node;
+  
+  g_return_val_if_fail (tree != NULL, FALSE);
+  
+  rtree = (GRealTree*) tree;
+  
+  node = g_tree_node_lookup (rtree->root, 
+                             rtree->key_compare,
+                             rtree->key_compare_data, 
+                             lookup_key);
+
+  if (node)
+    {
+      if (orig_key)
+        *orig_key = node->key;
+      if (value)
+        *value = node->value;
+      return TRUE;
+    }
+  else
+    return FALSE;
+}
+
 void
 g_tree_traverse (GTree         *tree,
                 GTraverseFunc  traverse_func,
index 78a52fb..ef78028 100644 (file)
 
 G_BEGIN_DECLS
 
-typedef struct _GTree          GTree;
+typedef struct _GTree  GTree;
 
-typedef gint           (*GTraverseFunc)        (gpointer       key,
-                                                gpointer       value,
-                                                gpointer       data);
+typedef gint   (*GTraverseFunc)        (gpointer  key,
+                                 gpointer  value,
+                                 gpointer  data);
 
 /* Balanced binary trees
  */
-GTree*   g_tree_new           (GCompareFunc      key_compare_func);
-GTree*   g_tree_new_with_data (GCompareDataFunc  key_compare_func,
-                              gpointer          user_data);
-void     g_tree_destroy       (GTree            *tree);
-void     g_tree_insert        (GTree            *tree,
-                              gpointer          key,
-                              gpointer          value);
-void     g_tree_remove        (GTree            *tree,
-                              gconstpointer     key);
-gpointer g_tree_lookup        (GTree            *tree,
-                              gconstpointer     key);
-void     g_tree_traverse      (GTree            *tree,
-                              GTraverseFunc     traverse_func,
-                              GTraverseType     traverse_type,
-                              gpointer          data);
-gpointer g_tree_search        (GTree            *tree,
-                              GCompareFunc      search_func,
-                              gconstpointer     data);
-gint     g_tree_height        (GTree            *tree);
-gint     g_tree_nnodes        (GTree            *tree);
+GTree*   g_tree_new             (GCompareFunc      key_compare_func);
+GTree*   g_tree_new_with_data   (GCompareDataFunc  key_compare_func,
+                                 gpointer          user_data);
+void     g_tree_destroy         (GTree            *tree);
+void     g_tree_insert          (GTree            *tree,
+                                 gpointer          key,
+                                 gpointer          value);
+void     g_tree_remove          (GTree            *tree,
+                                 gconstpointer     key);
+gpointer g_tree_lookup          (GTree            *tree,
+                                 gconstpointer     key);
+gboolean g_tree_lookup_extended (GTree            *tree,
+                                 gconstpointer     lookup_key,
+                                 gpointer         *orig_key,
+                                 gpointer         *value);
+void     g_tree_traverse        (GTree            *tree,
+                                 GTraverseFunc     traverse_func,
+                                 GTraverseType     traverse_type,
+                                 gpointer          data);
+gpointer g_tree_search          (GTree            *tree,
+                                 GCompareFunc      search_func,
+                                 gconstpointer     data);
+gint     g_tree_height          (GTree            *tree);
+gint     g_tree_nnodes          (GTree            *tree);
 
 
 
diff --git a/gtree.c b/gtree.c
index 5e0c0f5..7185238 100644 (file)
--- a/gtree.c
+++ b/gtree.c
@@ -238,6 +238,36 @@ g_tree_lookup (GTree         *tree,
                              rtree->key_compare_data, key);
 }
 
+gboolean
+g_tree_lookup_extended (GTree         *tree,
+                        gconstpointer  lookup_key,
+                        gpointer      *orig_key,
+                        gpointer      *value)
+{
+  GRealTree *rtree;
+  GTreeNode *node;
+  
+  g_return_val_if_fail (tree != NULL, FALSE);
+  
+  rtree = (GRealTree*) tree;
+  
+  node = g_tree_node_lookup (rtree->root, 
+                             rtree->key_compare,
+                             rtree->key_compare_data, 
+                             lookup_key);
+
+  if (node)
+    {
+      if (orig_key)
+        *orig_key = node->key;
+      if (value)
+        *value = node->value;
+      return TRUE;
+    }
+  else
+    return FALSE;
+}
+
 void
 g_tree_traverse (GTree         *tree,
                 GTraverseFunc  traverse_func,
diff --git a/gtree.h b/gtree.h
index 78a52fb..ef78028 100644 (file)
--- a/gtree.h
+++ b/gtree.h
 
 G_BEGIN_DECLS
 
-typedef struct _GTree          GTree;
+typedef struct _GTree  GTree;
 
-typedef gint           (*GTraverseFunc)        (gpointer       key,
-                                                gpointer       value,
-                                                gpointer       data);
+typedef gint   (*GTraverseFunc)        (gpointer  key,
+                                 gpointer  value,
+                                 gpointer  data);
 
 /* Balanced binary trees
  */
-GTree*   g_tree_new           (GCompareFunc      key_compare_func);
-GTree*   g_tree_new_with_data (GCompareDataFunc  key_compare_func,
-                              gpointer          user_data);
-void     g_tree_destroy       (GTree            *tree);
-void     g_tree_insert        (GTree            *tree,
-                              gpointer          key,
-                              gpointer          value);
-void     g_tree_remove        (GTree            *tree,
-                              gconstpointer     key);
-gpointer g_tree_lookup        (GTree            *tree,
-                              gconstpointer     key);
-void     g_tree_traverse      (GTree            *tree,
-                              GTraverseFunc     traverse_func,
-                              GTraverseType     traverse_type,
-                              gpointer          data);
-gpointer g_tree_search        (GTree            *tree,
-                              GCompareFunc      search_func,
-                              gconstpointer     data);
-gint     g_tree_height        (GTree            *tree);
-gint     g_tree_nnodes        (GTree            *tree);
+GTree*   g_tree_new             (GCompareFunc      key_compare_func);
+GTree*   g_tree_new_with_data   (GCompareDataFunc  key_compare_func,
+                                 gpointer          user_data);
+void     g_tree_destroy         (GTree            *tree);
+void     g_tree_insert          (GTree            *tree,
+                                 gpointer          key,
+                                 gpointer          value);
+void     g_tree_remove          (GTree            *tree,
+                                 gconstpointer     key);
+gpointer g_tree_lookup          (GTree            *tree,
+                                 gconstpointer     key);
+gboolean g_tree_lookup_extended (GTree            *tree,
+                                 gconstpointer     lookup_key,
+                                 gpointer         *orig_key,
+                                 gpointer         *value);
+void     g_tree_traverse        (GTree            *tree,
+                                 GTraverseFunc     traverse_func,
+                                 GTraverseType     traverse_type,
+                                 gpointer          data);
+gpointer g_tree_search          (GTree            *tree,
+                                 GCompareFunc      search_func,
+                                 gconstpointer     data);
+gint     g_tree_height          (GTree            *tree);
+gint     g_tree_nnodes          (GTree            *tree);