add private isl_{set,map}_make_disjoint
authorSven Verdoolaege <skimo@kotnet.org>
Thu, 14 Jan 2010 20:30:26 +0000 (21:30 +0100)
committerSven Verdoolaege <skimo@kotnet.org>
Sun, 31 Jan 2010 20:15:47 +0000 (21:15 +0100)
isl_map_private.h
isl_map_subtract.c

index a765e80..22ca0ef 100644 (file)
@@ -150,3 +150,6 @@ struct isl_mat;
 struct isl_basic_set *isl_basic_set_preimage(struct isl_basic_set *bset,
        struct isl_mat *mat);
 struct isl_set *isl_set_preimage(struct isl_set *set, struct isl_mat *mat);
+
+__isl_give isl_set *isl_set_make_disjoint(__isl_take isl_set *set);
+__isl_give isl_map *isl_map_make_disjoint(__isl_take isl_map *map);
index c2cf09c..9dcf7c9 100644 (file)
@@ -666,3 +666,44 @@ int isl_set_is_subset(struct isl_set *set1, struct isl_set *set2)
        return isl_map_is_subset(
                        (struct isl_map *)set1, (struct isl_map *)set2);
 }
+
+__isl_give isl_map *isl_map_make_disjoint(__isl_take isl_map *map)
+{
+       int i;
+       struct isl_subtract_diff_collector sdc;
+       sdc.dc.add = &basic_map_subtract_add;
+
+       if (!map)
+               return NULL;
+       if (ISL_F_ISSET(map, ISL_MAP_DISJOINT))
+               return map;
+       if (map->n <= 1)
+               return map;
+
+       map = isl_map_compute_divs(map);
+       map = isl_map_remove_empty_parts(map);
+
+       if (!map || map->n <= 1)
+               return map;
+
+       sdc.diff = isl_map_from_basic_map(isl_basic_map_copy(map->p[0]));
+
+       for (i = 1; i < map->n; ++i) {
+               struct isl_basic_map *bmap = isl_basic_map_copy(map->p[i]);
+               struct isl_map *copy = isl_map_copy(sdc.diff);
+               if (basic_map_collect_diff(bmap, copy, &sdc.dc) < 0) {
+                       isl_map_free(sdc.diff);
+                       sdc.diff = NULL;
+                       break;
+               }
+       }
+
+       isl_map_free(map);
+
+       return sdc.diff;
+}
+
+__isl_give isl_set *isl_set_make_disjoint(__isl_take isl_set *set)
+{
+       return (struct isl_set *)isl_map_make_disjoint((struct isl_map *)set);
+}