add isl_set_lift
authorSven Verdoolaege <skimo@kotnet.org>
Sun, 7 Mar 2010 17:58:51 +0000 (18:58 +0100)
committerSven Verdoolaege <skimo@kotnet.org>
Tue, 9 Mar 2010 14:26:53 +0000 (15:26 +0100)
include/isl_set.h
isl_map.c

index 1f71275..5e60aa0 100644 (file)
@@ -312,6 +312,8 @@ __isl_give isl_set *isl_set_from_point(__isl_take isl_point *pnt);
 __isl_give isl_set *isl_set_box_from_points(__isl_take isl_point *pnt1,
        __isl_take isl_point *pnt2);
 
+__isl_give isl_set *isl_set_lift(__isl_take isl_set *set);
+
 int isl_set_size(__isl_keep isl_set *set);
 
 #if defined(__cplusplus)
index abee9b9..b481a05 100644 (file)
--- a/isl_map.c
+++ b/isl_map.c
@@ -6105,6 +6105,71 @@ int isl_set_foreach_basic_set(__isl_keep isl_set *set,
        return 0;
 }
 
+__isl_give isl_basic_set *isl_basic_set_lift(__isl_take isl_basic_set *bset)
+{
+       struct isl_dim *dim;
+
+       if (!bset)
+               return NULL;
+
+       if (bset->n_div == 0)
+               return bset;
+
+       bset = isl_basic_set_cow(bset);
+       if (!bset)
+               return NULL;
+
+       dim = isl_basic_set_get_dim(bset);
+       dim = isl_dim_add(dim, isl_dim_set, bset->n_div);
+       if (!dim)
+               goto error;
+       isl_dim_free(bset->dim);
+       bset->dim = dim;
+       bset->n_div = 0;
+
+       return bset;
+error:
+       isl_basic_set_free(bset);
+       return NULL;
+}
+
+__isl_give isl_set *isl_set_lift(__isl_take isl_set *set)
+{
+       int i;
+       struct isl_dim *dim;
+       unsigned n_div;
+
+       set = isl_set_align_divs(set);
+
+       if (!set)
+               return NULL;
+       if (set->n == 0 || set->p[0]->n_div == 0)
+               return set;
+
+       set = isl_set_cow(set);
+       if (!set)
+               return NULL;
+
+       n_div = set->p[0]->n_div;
+       dim = isl_set_get_dim(set);
+       dim = isl_dim_add(dim, isl_dim_set, n_div);
+       if (!dim)
+               goto error;
+       isl_dim_free(set->dim);
+       set->dim = dim;
+
+       for (i = 0; i < set->n; ++i) {
+               set->p[i] = isl_basic_set_lift(set->p[i]);
+               if (!set->p[i])
+                       goto error;
+       }
+
+       return set;
+error:
+       isl_set_free(set);
+       return NULL;
+}
+
 __isl_give isl_map *isl_set_lifting(__isl_take isl_set *set)
 {
        struct isl_dim *dim;