New function to deep-copy a GNode and its children. (#93464, James M.
authorMatthias Clasen <maclas@gmx.de>
Sat, 21 Feb 2004 23:56:54 +0000 (23:56 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Sat, 21 Feb 2004 23:56:54 +0000 (23:56 +0000)
Sun Feb 22 00:47:04 2004  Matthias Clasen  <maclas@gmx.de>

* glib/gnode.c (g_node_copy_deep): New function to deep-copy a
GNode and its children.  (#93464, James M. Cape)

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
docs/reference/ChangeLog
docs/reference/glib/glib-sections.txt
docs/reference/glib/tmpl/trees-nary.sgml
glib/gnode.c
glib/gnode.h

index 15e4d0173877539378575121b95d8d371e890e7d..5dcb471841b41b20a2d081056f9cce1e003713fe 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sun Feb 22 00:47:04 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * glib/gnode.c (g_node_copy_deep): New function to deep-copy a 
+       GNode and its children.  (#93464, James M. Cape)
+
 Sat Feb 21 15:42:39 2004  Soeren Sandmann  <sandmann@daimi.au.dk>
 
        * glib/gqueue.c: Some documentation fixes.
index 15e4d0173877539378575121b95d8d371e890e7d..5dcb471841b41b20a2d081056f9cce1e003713fe 100644 (file)
@@ -1,3 +1,8 @@
+Sun Feb 22 00:47:04 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * glib/gnode.c (g_node_copy_deep): New function to deep-copy a 
+       GNode and its children.  (#93464, James M. Cape)
+
 Sat Feb 21 15:42:39 2004  Soeren Sandmann  <sandmann@daimi.au.dk>
 
        * glib/gqueue.c: Some documentation fixes.
index 15e4d0173877539378575121b95d8d371e890e7d..5dcb471841b41b20a2d081056f9cce1e003713fe 100644 (file)
@@ -1,3 +1,8 @@
+Sun Feb 22 00:47:04 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * glib/gnode.c (g_node_copy_deep): New function to deep-copy a 
+       GNode and its children.  (#93464, James M. Cape)
+
 Sat Feb 21 15:42:39 2004  Soeren Sandmann  <sandmann@daimi.au.dk>
 
        * glib/gqueue.c: Some documentation fixes.
index 15e4d0173877539378575121b95d8d371e890e7d..5dcb471841b41b20a2d081056f9cce1e003713fe 100644 (file)
@@ -1,3 +1,8 @@
+Sun Feb 22 00:47:04 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * glib/gnode.c (g_node_copy_deep): New function to deep-copy a 
+       GNode and its children.  (#93464, James M. Cape)
+
 Sat Feb 21 15:42:39 2004  Soeren Sandmann  <sandmann@daimi.au.dk>
 
        * glib/gqueue.c: Some documentation fixes.
index 15e4d0173877539378575121b95d8d371e890e7d..5dcb471841b41b20a2d081056f9cce1e003713fe 100644 (file)
@@ -1,3 +1,8 @@
+Sun Feb 22 00:47:04 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * glib/gnode.c (g_node_copy_deep): New function to deep-copy a 
+       GNode and its children.  (#93464, James M. Cape)
+
 Sat Feb 21 15:42:39 2004  Soeren Sandmann  <sandmann@daimi.au.dk>
 
        * glib/gqueue.c: Some documentation fixes.
index 15e4d0173877539378575121b95d8d371e890e7d..5dcb471841b41b20a2d081056f9cce1e003713fe 100644 (file)
@@ -1,3 +1,8 @@
+Sun Feb 22 00:47:04 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * glib/gnode.c (g_node_copy_deep): New function to deep-copy a 
+       GNode and its children.  (#93464, James M. Cape)
+
 Sat Feb 21 15:42:39 2004  Soeren Sandmann  <sandmann@daimi.au.dk>
 
        * glib/gqueue.c: Some documentation fixes.
index 8c77846e4bc8c280d9a0001980e41f31a80d069c..ede56c546703d0c2283feea10525dbcdd9e48657 100644 (file)
@@ -1,3 +1,11 @@
+Sun Feb 22 00:59:11 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * glib/tmpl/trees-nary.sgml: Document GCopyFunc.
+
+Sun Feb 22 00:54:17 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * glib/glib-sections.txt: Add GCopyFunc and g_node_copy_deep.
+
 2004-02-18  Sebastian Wilhelmi  <seppi@seppi.de>
 
        * glib/glib-sections.txt: Add the new g_rand_* functions
index c07a218560e5bf41598a00b112e5da8096bc7c44..157c92a601750472d698b36001736faee0be7455 100644 (file)
@@ -1699,6 +1699,8 @@ g_tree_destroy
 GNode
 g_node_new
 g_node_copy
+GCopyFunc
+g_node_copy_deep
 
 <SUBSECTION>
 g_node_insert
index 9cd1767a09231a2039edb393cf79d88d82af3fa2..d4326da75648c4bcc85f28efdcacb34f50b57a7c 100644 (file)
@@ -83,13 +83,35 @@ Used to create the first node in a tree.
 <!-- ##### FUNCTION g_node_copy ##### -->
 <para>
 Recursively copies a #GNode (but does not deep-copy the data inside the nodes,
-since there's no way for GLib to know how to do that).
+see g_node_copy_deep() if you need that).
 </para>
 
 @node: a #GNode.
 @Returns: a new #GNode containing the same data pointers.
 
 
+<!-- ##### USER_FUNCTION GCopyFunc ##### -->
+<para>
+A function of this signature is used to copy the node data when doing a deep-copy
+of a tree. 
+</para>
+
+@src: A pointer to the data which should be copied.
+@data: Additional data.
+@Returns: A pointer to the copy.
+@Since: 2.4
+
+<!-- ##### FUNCTION g_node_copy_deep ##### -->
+<para>
+
+</para>
+
+@node: 
+@copy_func: 
+@data: 
+@Returns: 
+
+
 <!-- ##### FUNCTION g_node_insert ##### -->
 <para>
 Inserts a #GNode beneath the parent at the given position.
index c31a1804e03fe18b8fccaaf1642fdb06d49890e9..b5bce67fcdc38ce93caa6baa8be8c132a2c65a55 100644 (file)
@@ -229,6 +229,45 @@ g_node_unlink (GNode *node)
   node->prev = NULL;
 }
 
+/**
+ * g_node_copy_deep:
+ * @node: a #GNode
+ * @copy_func: the function which is called to copy the data inside each node,
+ *   or %NULL to use the original data.
+ * @data: data to pass to @copy_func
+ * 
+ * Recursively copies a #GNode and its data.
+ * 
+ * Return value: a new #GNode containing copies of the data in @node.
+ *
+ * Since: 2.4
+ **/
+GNode*
+g_node_copy_deep (GNode     *node, 
+                 GCopyFunc  copy_func,
+                 gpointer   data)
+{
+  GNode *new_node = NULL;
+
+  if (copy_func == NULL)
+       return g_node_copy (node);
+
+  if (node)
+    {
+      GNode *child, *new_child;
+      
+      new_node = g_node_new (copy_func (node->data, data));
+      
+      for (child = g_node_last_child (node); child; child = child->prev) 
+       {
+         new_child = g_node_copy_deep (child, copy_func, data);
+         g_node_prepend (new_node, new_child);
+       }
+    }
+  
+  return new_node;
+}
+
 GNode*
 g_node_copy (GNode *node)
 {
index 6d79ab0a471a4f97f7f7bc084a9ca4c5ebae55b5..7cc4fb000758f2674fb0baa57ce5b88f4efe04d4 100644 (file)
@@ -55,6 +55,8 @@ typedef gboolean      (*GNodeTraverseFunc)    (GNode         *node,
                                                 gpointer       data);
 typedef void           (*GNodeForeachFunc)     (GNode         *node,
                                                 gpointer       data);
+typedef gpointer       (*GCopyFunc)            (gconstpointer  src,
+                                                 gpointer       data);
 
 /* N-way tree implementation
  */
@@ -77,6 +79,9 @@ void     g_node_pop_allocator   (void);
 GNode*  g_node_new             (gpointer          data);
 void    g_node_destroy         (GNode            *root);
 void    g_node_unlink          (GNode            *node);
+GNode*   g_node_copy_deep       (GNode            *node,
+                                GCopyFunc         copy_func,
+                                gpointer          data);
 GNode*   g_node_copy            (GNode            *node);
 GNode*  g_node_insert          (GNode            *parent,
                                 gint              position,