add isl_pw_qpolynomial_split_dims
[platform/upstream/isl.git] / isl_map.c
index f62c0be..7df4bcf 100644 (file)
--- a/isl_map.c
+++ b/isl_map.c
@@ -4837,6 +4837,50 @@ error:
        return NULL;
 }
 
+__isl_give isl_set *isl_set_split_dims(__isl_take isl_set *set,
+       enum isl_dim_type type, unsigned first, unsigned n)
+{
+       int i;
+       isl_basic_set *nonneg = NULL;
+       isl_basic_set *neg = NULL;
+
+       if (!set)
+               return NULL;
+       if (n == 0)
+               return set;
+
+       isl_assert(set->ctx, first + n <= isl_set_dim(set, type), goto error);
+
+       for (i = 0; i < n; ++i) {
+               int k;
+
+               neg = NULL;
+               nonneg = isl_basic_set_alloc_dim(isl_set_get_dim(set), 0, 0, 1);
+               k = isl_basic_set_alloc_inequality(nonneg);
+               if (k < 0)
+                       goto error;
+               isl_seq_clr(nonneg->ineq[k], 1 + isl_basic_set_total_dim(nonneg));
+               isl_int_set_si(nonneg->ineq[k][pos(set->dim, type) + first + i], 1);
+
+               neg = isl_basic_set_alloc_dim(isl_set_get_dim(set), 0, 0, 1);
+               k = isl_basic_set_alloc_inequality(neg);
+               if (k < 0)
+                       goto error;
+               isl_seq_clr(neg->ineq[k], 1 + isl_basic_set_total_dim(neg));
+               isl_int_set_si(neg->ineq[k][0], -1);
+               isl_int_set_si(neg->ineq[k][pos(set->dim, type) + first + i], -1);
+
+               set = isl_set_intersect(set, isl_basic_set_union(nonneg, neg));
+       }
+
+       return set;
+error:
+       isl_basic_set_free(nonneg);
+       isl_basic_set_free(neg);
+       isl_set_free(set);
+       return NULL;
+}
+
 int isl_set_is_equal(struct isl_set *set1, struct isl_set *set2)
 {
        return isl_map_is_equal((struct isl_map *)set1, (struct isl_map *)set2);