* glib/gnode.c (g_node_traverse): Implement G_LEVEL_ORDER correctly.
* tests/node-test.c: Add a testcase for G_LEVEL_ORDER implementation.
* glib/tmpl/trees-nary.sgml: Document G_LEVEL_ORDER better.
2001-11-26 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/gnode.c (g_node_traverse): Implement G_LEVEL_ORDER correctly.
+
+ * tests/node-test.c: Add a testcase for G_LEVEL_ORDER implementation.
* glib/gtree.h: Mark g_tree_traverse() as deprecated. (#65343)
2001-11-26 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/gnode.c (g_node_traverse): Implement G_LEVEL_ORDER correctly.
+
+ * tests/node-test.c: Add a testcase for G_LEVEL_ORDER implementation.
* glib/gtree.h: Mark g_tree_traverse() as deprecated. (#65343)
2001-11-26 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/gnode.c (g_node_traverse): Implement G_LEVEL_ORDER correctly.
+
+ * tests/node-test.c: Add a testcase for G_LEVEL_ORDER implementation.
* glib/gtree.h: Mark g_tree_traverse() as deprecated. (#65343)
2001-11-26 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/gnode.c (g_node_traverse): Implement G_LEVEL_ORDER correctly.
+
+ * tests/node-test.c: Add a testcase for G_LEVEL_ORDER implementation.
* glib/gtree.h: Mark g_tree_traverse() as deprecated. (#65343)
2001-11-26 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/gnode.c (g_node_traverse): Implement G_LEVEL_ORDER correctly.
+
+ * tests/node-test.c: Add a testcase for G_LEVEL_ORDER implementation.
* glib/gtree.h: Mark g_tree_traverse() as deprecated. (#65343)
2001-11-26 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/gnode.c (g_node_traverse): Implement G_LEVEL_ORDER correctly.
+
+ * tests/node-test.c: Add a testcase for G_LEVEL_ORDER implementation.
* glib/gtree.h: Mark g_tree_traverse() as deprecated. (#65343)
2001-11-26 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/gnode.c (g_node_traverse): Implement G_LEVEL_ORDER correctly.
+
+ * tests/node-test.c: Add a testcase for G_LEVEL_ORDER implementation.
* glib/gtree.h: Mark g_tree_traverse() as deprecated. (#65343)
2001-11-26 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/gnode.c (g_node_traverse): Implement G_LEVEL_ORDER correctly.
+
+ * tests/node-test.c: Add a testcase for G_LEVEL_ORDER implementation.
* glib/gtree.h: Mark g_tree_traverse() as deprecated. (#65343)
+2001-11-26 Matthias Clasen <matthiasc@poet.de>
+
+ * glib/tmpl/trees-nary.sgml: Document G_LEVEL_ORDER better.
+
2001-11-22 Matthias Clasen <matthiasc@poet.de>
Fixes for #61284:
<para>
Specifies which nodes are visited during several of the tree functions,
including g_node_traverse() and g_node_find().
-<itemizedlist>
-<listitem><para>
-%G_TRAVERSE_LEAFS specifies that only leaf nodes should be visited.
-</para></listitem>
-<listitem><para>
-%G_TRAVERSE_NON_LEAFS specifies that only non-leaf nodes should be visited.
-</para></listitem>
-<listitem><para>
-%G_TRAVERSE_ALL specifies that all nodes should be visited.
-</para></listitem>
-</itemizedlist>
-</para>
-
-@G_TRAVERSE_LEAFS:
-@G_TRAVERSE_NON_LEAFS:
-@G_TRAVERSE_ALL:
+</para>
+
+@G_TRAVERSE_LEAFS: only leaf nodes should be visited.
+@G_TRAVERSE_NON_LEAFS: only non-leaf nodes should be visited.
+@G_TRAVERSE_ALL: all nodes should be visited.
@G_TRAVERSE_MASK:
<!-- ##### USER_FUNCTION GNodeTraverseFunc ##### -->
}
static gboolean
-g_node_traverse_children (GNode *node,
- GTraverseFlags flags,
- GNodeTraverseFunc func,
- gpointer data)
+g_node_traverse_level (GNode *node,
+ GTraverseFlags flags,
+ guint level,
+ GNodeTraverseFunc func,
+ gpointer data,
+ gboolean *more_levels)
{
- GNode *child;
-
- child = node->children;
-
- while (child)
+ if (level == 0)
{
- register GNode *current;
-
- current = child;
- child = current->next;
-
- if (current->children)
+ if (node->children)
{
- if ((flags & G_TRAVERSE_NON_LEAFS) &&
- func (current, data))
- return TRUE;
+ *more_levels = TRUE;
+ return (flags & G_TRAVERSE_NON_LEAFS) && func (node, data);
+ }
+ else
+ {
+ return (flags & G_TRAVERSE_LEAFS) && func (node, data);
}
- else if ((flags & G_TRAVERSE_LEAFS) &&
- func (current, data))
- return TRUE;
}
-
- child = node->children;
-
- while (child)
+ else
{
- register GNode *current;
+ node = node->children;
- current = child;
- child = current->next;
-
- if (current->children &&
- g_node_traverse_children (current, flags, func, data))
- return TRUE;
+ while (node)
+ {
+ if (g_node_traverse_level (node, flags, level - 1, func, data, more_levels))
+ return TRUE;
+
+ node = node->next;
+ }
}
-
+
return FALSE;
}
static gboolean
-g_node_depth_traverse_children (GNode *node,
- GTraverseFlags flags,
- guint depth,
- GNodeTraverseFunc func,
- gpointer data)
+g_node_depth_traverse_level (GNode *node,
+ GTraverseFlags flags,
+ guint depth,
+ GNodeTraverseFunc func,
+ gpointer data)
{
- GNode *child;
-
- child = node->children;
-
- while (child)
- {
- register GNode *current;
-
- current = child;
- child = current->next;
-
- if (current->children)
- {
- if ((flags & G_TRAVERSE_NON_LEAFS) &&
- func (current, data))
- return TRUE;
- }
- else if ((flags & G_TRAVERSE_LEAFS) &&
- func (current, data))
- return TRUE;
- }
-
- depth--;
- if (!depth)
- return FALSE;
-
- child = node->children;
-
- while (child)
+ gint level;
+ gboolean more_levels;
+
+ level = 0;
+ while (level != depth)
{
- register GNode *current;
-
- current = child;
- child = current->next;
-
- if (current->children &&
- g_node_depth_traverse_children (current, flags, depth, func, data))
+ more_levels = FALSE;
+ if (g_node_traverse_level (node, flags, level, func, data, &more_levels))
return TRUE;
+ if (!more_levels)
+ break;
+ level++;
}
-
return FALSE;
}
g_node_depth_traverse_in_order (root, flags, depth, func, data);
break;
case G_LEVEL_ORDER:
- if (root->children)
- {
- if (!((flags & G_TRAVERSE_NON_LEAFS) &&
- func (root, data)))
- {
- if (depth < 0)
- g_node_traverse_children (root, flags, func, data);
- else
- {
- depth--;
- if (depth)
- g_node_depth_traverse_children (root, flags, depth, func, data);
- }
- }
- }
- else if (flags & G_TRAVERSE_LEAFS)
- func (root, data);
+ g_node_depth_traverse_level (root, flags, depth, func, data);
break;
}
}
GNode *root;
GNode *node;
GNode *node_B;
+ GNode *node_D;
GNode *node_F;
GNode *node_G;
GNode *node_J;
g_node_append_data (node_B, C2P ('E'));
g_node_prepend_data (node_B, C2P ('C'));
- g_node_insert (node_B, 1, g_node_new (C2P ('D')));
+ node_D = g_node_new (C2P ('D'));
+ g_node_insert (node_B, 1, node_D);
node_F = g_node_new (C2P ('F'));
g_node_append (root, node_F);
TEST (tstring, strcmp (tstring, "ABFEDCGKJIH") == 0);
g_free (tstring); tstring = NULL;
+ g_node_append (node_D, g_node_new (C2P ('L')));
+ g_node_append (node_D, g_node_new (C2P ('M')));
+
+ g_node_traverse (root, G_LEVEL_ORDER, G_TRAVERSE_ALL, -1, node_build_string, &tstring);
+ TEST (tstring, strcmp (tstring, "ABFEDCGLMKJIH") == 0);
+ g_free (tstring); tstring = NULL;
+
g_node_destroy (root);
/* allocation tests */