From e71a64bc86b9714133c9c98ec2d5c173d0b79936 Mon Sep 17 00:00:00 2001 From: Sven Neumann Date: Thu, 8 Mar 2001 17:51:39 +0000 Subject: [PATCH] added new function g_tree_lookup_extended(). 2001-03-08 Sven Neumann * gtree.[ch]: * docs/reference/glib/tmpl/trees-binary.sgml: added new function g_tree_lookup_extended(). --- ChangeLog | 6 +++ ChangeLog.pre-2-0 | 6 +++ ChangeLog.pre-2-10 | 6 +++ ChangeLog.pre-2-12 | 6 +++ ChangeLog.pre-2-2 | 6 +++ ChangeLog.pre-2-4 | 6 +++ ChangeLog.pre-2-6 | 6 +++ ChangeLog.pre-2-8 | 6 +++ docs/reference/glib/tmpl/trees-binary.sgml | 19 +++++++- glib/gtree.c | 30 +++++++++++++ glib/gtree.h | 52 ++++++++++++---------- gtree.c | 30 +++++++++++++ gtree.h | 52 ++++++++++++---------- 13 files changed, 182 insertions(+), 49 deletions(-) diff --git a/ChangeLog b/ChangeLog index f7367cb5e..2fef6668d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2001-03-08 Sven Neumann + + * 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 * ghook.[hc]: destruction cleanup. there's one diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index f7367cb5e..2fef6668d 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,9 @@ +2001-03-08 Sven Neumann + + * 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 * ghook.[hc]: destruction cleanup. there's one diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index f7367cb5e..2fef6668d 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,9 @@ +2001-03-08 Sven Neumann + + * 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 * ghook.[hc]: destruction cleanup. there's one diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index f7367cb5e..2fef6668d 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,9 @@ +2001-03-08 Sven Neumann + + * 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 * ghook.[hc]: destruction cleanup. there's one diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index f7367cb5e..2fef6668d 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,9 @@ +2001-03-08 Sven Neumann + + * 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 * ghook.[hc]: destruction cleanup. there's one diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index f7367cb5e..2fef6668d 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,9 @@ +2001-03-08 Sven Neumann + + * 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 * ghook.[hc]: destruction cleanup. there's one diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index f7367cb5e..2fef6668d 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,9 @@ +2001-03-08 Sven Neumann + + * 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 * ghook.[hc]: destruction cleanup. there's one diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index f7367cb5e..2fef6668d 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,9 @@ +2001-03-08 Sven Neumann + + * 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 * ghook.[hc]: destruction cleanup. there's one diff --git a/docs/reference/glib/tmpl/trees-binary.sgml b/docs/reference/glib/tmpl/trees-binary.sgml index 11ab99579..58fa33476 100644 --- a/docs/reference/glib/tmpl/trees-binary.sgml +++ b/docs/reference/glib/tmpl/trees-binary.sgml @@ -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(). -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(). 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. + + +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. + + +@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. + + Searches a #GTree using an alternative form of the comparison function. diff --git a/glib/gtree.c b/glib/gtree.c index 5e0c0f573..718523888 100644 --- a/glib/gtree.c +++ b/glib/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/glib/gtree.h b/glib/gtree.h index 78a52fb0f..ef7802834 100644 --- a/glib/gtree.h +++ b/glib/gtree.h @@ -31,34 +31,38 @@ 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 5e0c0f573..718523888 100644 --- 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 78a52fb0f..ef7802834 100644 --- a/gtree.h +++ b/gtree.h @@ -31,34 +31,38 @@ 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);