summaryrefslogtreecommitdiffstats
path: root/libdimension/prtree.c
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@gmail.com>2010-06-05 23:46:29 -0600
committerTavian Barnes <tavianator@gmail.com>2010-06-05 23:55:21 -0600
commit6681e5e78772be7168b5ed2a5688d2e89ee4f5d5 (patch)
treeffd8c5fef0a6c5db47b0f635b6e1ae5719861f17 /libdimension/prtree.c
parent4a2dd35a34d456b9164e90b4fb1a06b1d009869f (diff)
downloaddimension-6681e5e78772be7168b5ed2a5688d2e89ee4f5d5.tar.xz
Add children to dmnsn_objects, which enables splitting unions.
Also, use PR-trees for unions internally.
Diffstat (limited to 'libdimension/prtree.c')
-rw-r--r--libdimension/prtree.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/libdimension/prtree.c b/libdimension/prtree.c
index b99c7e1..7fcc8ab 100644
--- a/libdimension/prtree.c
+++ b/libdimension/prtree.c
@@ -436,6 +436,30 @@ dmnsn_pseudo_prtree_leaves(const dmnsn_pseudo_prtree *pseudo)
return leaves;
}
+/* Add objects from an array to a list, splitting unions etc. */
+
+static void
+dmnsn_list_add_object(dmnsn_list *objects, const dmnsn_object *object)
+{
+ if (dmnsn_array_size(object->children) == 0) {
+ dmnsn_list_push(objects, &object);
+ } else {
+ DMNSN_ARRAY_FOREACH (const dmnsn_object **, child, object->children) {
+ dmnsn_list_add_object(objects, *child);
+ }
+ }
+}
+
+static dmnsn_list *
+dmnsn_object_list(const dmnsn_array *objects)
+{
+ dmnsn_list *list = dmnsn_new_list(sizeof(dmnsn_object *));
+ DMNSN_ARRAY_FOREACH (const dmnsn_object **, object, objects) {
+ dmnsn_list_add_object(list, *object);
+ }
+ return list;
+}
+
/* Split the unbounded objects into a new list */
static dmnsn_list *
dmnsn_split_unbounded(dmnsn_list *objects)
@@ -464,7 +488,7 @@ dmnsn_split_unbounded(dmnsn_list *objects)
dmnsn_prtree *
dmnsn_new_prtree(const dmnsn_array *objects)
{
- dmnsn_list *leaves = dmnsn_list_from_array(objects);
+ dmnsn_list *leaves = dmnsn_object_list(objects);
dmnsn_list *unbounded = dmnsn_split_unbounded(leaves);
dmnsn_pseudo_prtree *pseudo = dmnsn_new_pseudo_prtree(leaves, true, 0);