generalize isl_multi_aff_add
authorSven Verdoolaege <skimo@kotnet.org>
Wed, 13 Mar 2013 12:08:20 +0000 (13:08 +0100)
committerSven Verdoolaege <skimo@kotnet.org>
Thu, 14 Mar 2013 07:52:21 +0000 (08:52 +0100)
In the short term, this generalization will be useful to implement
an isl_multi_aff_sub.

Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
isl_aff.c
isl_multi_templ.c

index 3acb3f5..dadc332 100644 (file)
--- a/isl_aff.c
+++ b/isl_aff.c
@@ -2677,31 +2677,7 @@ __isl_give isl_pw_multi_aff *isl_pw_multi_aff_identity(
 __isl_give isl_multi_aff *isl_multi_aff_add(__isl_take isl_multi_aff *maff1,
        __isl_take isl_multi_aff *maff2)
 {
-       int i;
-       isl_ctx *ctx;
-
-       maff1 = isl_multi_aff_cow(maff1);
-       if (!maff1 || !maff2)
-               goto error;
-
-       ctx = isl_multi_aff_get_ctx(maff1);
-       if (!isl_space_is_equal(maff1->space, maff2->space))
-               isl_die(ctx, isl_error_invalid,
-                       "spaces don't match", goto error);
-
-       for (i = 0; i < maff1->n; ++i) {
-               maff1->p[i] = isl_aff_add(maff1->p[i],
-                                           isl_aff_copy(maff2->p[i]));
-               if (!maff1->p[i])
-                       goto error;
-       }
-
-       isl_multi_aff_free(maff2);
-       return maff1;
-error:
-       isl_multi_aff_free(maff1);
-       isl_multi_aff_free(maff2);
-       return NULL;
+       return isl_multi_aff_bin_op(maff1, maff2, &isl_aff_add);
 }
 
 /* Given two multi-affine expressions A -> B and C -> D,
index 7080493..0156411 100644 (file)
@@ -794,3 +794,43 @@ error:
        FN(MULTI(BASE),free)(multi2);
        return NULL;
 }
+
+/* This function is currently only used from isl_aff.c
+ */
+static __isl_give MULTI(BASE) *FN(MULTI(BASE),bin_op)(
+       __isl_take MULTI(BASE) *multi1, __isl_take MULTI(BASE) *multi2,
+       __isl_give EL *(*fn)(__isl_take EL *, __isl_take EL *))
+       __attribute__ ((unused));
+
+/* Pairwise perform "fn" to the elements of "multi1" and "multi2" and
+ * return the result.
+ */
+static __isl_give MULTI(BASE) *FN(MULTI(BASE),bin_op)(
+       __isl_take MULTI(BASE) *multi1, __isl_take MULTI(BASE) *multi2,
+       __isl_give EL *(*fn)(__isl_take EL *, __isl_take EL *))
+{
+       int i;
+       isl_ctx *ctx;
+
+       multi1 = FN(MULTI(BASE),cow)(multi1);
+       if (!multi1 || !multi2)
+               goto error;
+
+       ctx = FN(MULTI(BASE),get_ctx)(multi1);
+       if (!isl_space_is_equal(multi1->space, multi2->space))
+               isl_die(ctx, isl_error_invalid,
+                       "spaces don't match", goto error);
+
+       for (i = 0; i < multi1->n; ++i) {
+               multi1->p[i] = fn(multi1->p[i], FN(EL,copy)(multi2->p[i]));
+               if (!multi1->p[i])
+                       goto error;
+       }
+
+       FN(MULTI(BASE),free)(multi2);
+       return multi1;
+error:
+       FN(MULTI(BASE),free)(multi1);
+       FN(MULTI(BASE),free)(multi2);
+       return NULL;
+}