[glib: 1/4] GTree: debugging improvements




commit 260e80f1df51c52ced9c8c07ecf25f3b006b0be0
Author: Maciej S. Szmigiero <maciej szmigiero oracle com>
Date:   Tue Aug 4 21:23:54 2020 +0200

    GTree: debugging improvements
    
    * Add a debug assert checking whether we have really removed all nodes in
    g_tree_remove_all(),
    
    * Print a "LEFT" and "RIGHT" headers before printing a particular tree
    branch in g_tree_node_dump(),
    
    * Make the whole thing actually buildable again in the debug mode by
    conditionally providing g_tree_dump() declaration in glib/gtree.h.
    
    Signed-off-by: Maciej S. Szmigiero <maciej szmigiero oracle com>

 glib/gtree.c | 24 +++++++++++++++++++-----
 glib/gtree.h |  9 +++++++++
 2 files changed, 28 insertions(+), 5 deletions(-)
---
diff --git a/glib/gtree.c b/glib/gtree.c
index 41f2438f1..715863372 100644
--- a/glib/gtree.c
+++ b/glib/gtree.c
@@ -66,8 +66,6 @@
  * To destroy a #GTree, use g_tree_destroy().
  **/
 
-#undef G_TREE_DEBUG
-
 #define MAX_GTREE_HEIGHT 40
 
 typedef struct _GTreeNode  GTreeNode;
@@ -294,11 +292,22 @@ g_tree_remove_all (GTree *tree)
         tree->value_destroy_func (node->value);
       g_slice_free (GTreeNode, node);
 
+#ifdef G_TREE_DEBUG
+      g_assert (tree->nnodes > 0);
+      tree->nnodes--;
+#endif
+
       node = next;
     }
 
+#ifdef G_TREE_DEBUG
+  g_assert (tree->nnodes == 0);
+#endif
+
   tree->root = NULL;
+#ifndef G_TREE_DEBUG
   tree->nnodes = 0;
+#endif
 }
 
 /**
@@ -1388,17 +1397,22 @@ g_tree_node_dump (GTreeNode *node,
   g_print ("%*s%c\n", indent, "", *(char *)node->key);
 
   if (node->left_child)
-    g_tree_node_dump (node->left, indent + 2);
+    {
+      g_print ("%*sLEFT\n", indent, "");
+      g_tree_node_dump (node->left, indent + 2);
+    }
   else if (node->left)
     g_print ("%*s<%c\n", indent + 2, "", *(char *)node->left->key);
 
   if (node->right_child)
-    g_tree_node_dump (node->right, indent + 2);
+    {
+      g_print ("%*sRIGHT\n", indent, "");
+      g_tree_node_dump (node->right, indent + 2);
+    }
   else if (node->right)
     g_print ("%*s>%c\n", indent + 2, "", *(char *)node->right->key);
 }
 
-
 void
 g_tree_dump (GTree *tree)
 {
diff --git a/glib/gtree.h b/glib/gtree.h
index ceb148d6b..bb5c53465 100644
--- a/glib/gtree.h
+++ b/glib/gtree.h
@@ -33,6 +33,8 @@
 
 G_BEGIN_DECLS
 
+#undef G_TREE_DEBUG
+
 typedef struct _GTree  GTree;
 
 typedef gboolean (*GTraverseFunc) (gpointer  key,
@@ -99,6 +101,13 @@ gint     g_tree_height          (GTree            *tree);
 GLIB_AVAILABLE_IN_ALL
 gint     g_tree_nnodes          (GTree            *tree);
 
+#ifdef G_TREE_DEBUG
+/*< private >*/
+#ifndef __GTK_DOC_IGNORE__
+void g_tree_dump (GTree *tree);
+#endif  /* !__GTK_DOC_IGNORE__ */
+#endif  /* G_TREE_DEBUG */
+
 G_END_DECLS
 
 #endif /* __G_TREE_H__ */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]