generalize isl_multi_aff_drop_dims
authorSven Verdoolaege <skimo@kotnet.org>
Sun, 19 Aug 2012 17:29:48 +0000 (19:29 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Tue, 18 Sep 2012 12:59:00 +0000 (14:59 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
isl_aff.c
isl_multi_templ.c

index 0b9bf88..209a32f 100644 (file)
--- a/isl_aff.c
+++ b/isl_aff.c
@@ -2687,37 +2687,6 @@ int isl_multi_aff_plain_is_equal(__isl_keep isl_multi_aff *maff1,
        return 1;
 }
 
-__isl_give isl_multi_aff *isl_multi_aff_drop_dims(__isl_take isl_multi_aff *maff,
-       enum isl_dim_type type, unsigned first, unsigned n)
-{
-       int i;
-
-       maff = isl_multi_aff_cow(maff);
-       if (!maff)
-               return NULL;
-
-       maff->space = isl_space_drop_dims(maff->space, type, first, n);
-       if (!maff->space)
-               return isl_multi_aff_free(maff);
-
-       if (type == isl_dim_out) {
-               for (i = 0; i < n; ++i)
-                       isl_aff_free(maff->p[first + i]);
-               for (i = first; i + n < maff->n; ++i)
-                       maff->p[i] = maff->p[i + n];
-               maff->n -= n;
-               return maff;
-       }
-
-       for (i = 0; i < maff->n; ++i) {
-               maff->p[i] = isl_aff_drop_dims(maff->p[i], type, first, n);
-               if (!maff->p[i])
-                       return isl_multi_aff_free(maff);
-       }
-
-       return maff;
-}
-
 /* Return the set of domain elements where "ma1" is lexicographically
  * smaller than or equal to "ma2".
  */
index 6bf940c..8638aab 100644 (file)
@@ -516,3 +516,43 @@ __isl_give MULTI(BASE) *FN(MULTI(BASE),zero)(__isl_take isl_space *space)
 
        return multi;
 }
+
+__isl_give MULTI(BASE) *FN(MULTI(BASE),drop_dims)(
+       __isl_take MULTI(BASE) *multi,
+       enum isl_dim_type type, unsigned first, unsigned n)
+{
+       int i;
+       unsigned dim;
+
+       multi = FN(MULTI(BASE),cow)(multi);
+       if (!multi)
+               return NULL;
+
+       dim = FN(MULTI(BASE),dim)(multi, type);
+       if (first + n > dim || first + n < first)
+               isl_die(FN(MULTI(BASE),get_ctx)(multi), isl_error_invalid,
+                       "index out of bounds",
+                       return FN(MULTI(BASE),cow)(multi));
+
+       multi->space = isl_space_drop_dims(multi->space, type, first, n);
+       if (!multi->space)
+               return FN(MULTI(BASE),cow)(multi);
+
+       if (type == isl_dim_out) {
+               for (i = 0; i < n; ++i)
+                       FN(EL,free)(multi->p[first + i]);
+               for (i = first; i + n < multi->n; ++i)
+                       multi->p[i] = multi->p[i + n];
+               multi->n -= n;
+
+               return multi;
+       }
+
+       for (i = 0; i < multi->n; ++i) {
+               multi->p[i] = FN(EL,drop_dims)(multi->p[i], type, first, n);
+               if (!multi->p[i])
+                       return FN(MULTI(BASE),cow)(multi);
+       }
+
+       return multi;
+}