etienne buxin wrote:
> hi,
> 
> i'd like to use a structure similar to glib's Nary tree, but with the difference 
>that many parent
> nodes can share one or several children nodes.
> any clue?


This is going to be rather difficult.

Unless you enforce a policy that only sibling-nodes can share child 
nodes, you are going to have a lot of trouble.  Even then, any trivial 
operation on a child node (e.g., remove from tree) will require 
searching over the full set of parent-siblings and checking the child 
pointers against the full set of siblings for the child-node.

Don't do it.

If a fellow developer at work suggested such a data-storage approach, I 
would require a tone of convincing that this was a reasonable thing to do.

If you do, I strongly suggest that you do not base it off of the current 
glib n-ary tree implimentation.  At a minimum, I would enforce a policy 
that a node has a numbered depth N, that all children are depth N+1 and 
parents are N-1.  This may seem obvious, but in a multi-parent scenario 
it would be easy to violate if moving a set of nodes within the tree.

A suggested structure:

struct eb_manymany {
   uint                 node_level;
   uint                 num_parents;
   uint                 num_par_max;
   struct eb_manymany   **par_ptr_array;
   uint                 num_children;
   uint                 num_child_max;
   struct eb_manymany   **chd_ptr_array;
   gpointer             data;
}

That lets you reference count the parents and children, so that, for 
example, when removing a node you can go to all the parents and remove 
that child from their list of children.

The _max allows dynamix allocation of the pointer arrays, if you 
previously allocated space for 12 children and need a 13th, you can 
reallocate that array up to size 24 or somthing, with 13 places occupied.

If the above doesn't make sense after a few readings, you're not ready 
to tackle this.  I have done a two-level parent-child that was 
many-to-many, where entities were by definitions either parents or 
children, and by the time I had the appropriate API and error checking 
all in place it was very cumersome.

For example, what policy do you generically implement if a the last 
parent of a node is freed?  In my application, that meant that the child 
was now a discard and could be freed, but that may or may not be 
appropriate for a generic storage library.  Specify a calllback for the 
child node in that situation, defaulting to freeing?  Complexity!

If you do get it working as infinite level many-to-many, please post the 
code. :)

Eric

_______________________________________________
gtk-list mailing list
[EMAIL PROTECTED]
http://mail.gnome.org/mailman/listinfo/gtk-list

Reply via email to