add isl_qpolynomial_fold_scale_val
authorSven Verdoolaege <skimo@kotnet.org>
Sun, 5 May 2013 17:00:23 +0000 (19:00 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Tue, 28 May 2013 16:27:12 +0000 (18:27 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl/polynomial.h
isl_fold.c

index a63f071..7ddf30f 100644 (file)
@@ -4992,6 +4992,9 @@ obviously equal, use
 
        __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale(
                __isl_take isl_qpolynomial_fold *fold, isl_int v);
 
        __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale(
                __isl_take isl_qpolynomial_fold *fold, isl_int v);
+       __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale_val(
+               __isl_take isl_qpolynomial_fold *fold,
+               __isl_take isl_val *v);
 
        __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_add(
                __isl_take isl_pw_qpolynomial_fold *pwf1,
 
        __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_add(
                __isl_take isl_pw_qpolynomial_fold *pwf1,
index 3439d44..555a2b4 100644 (file)
@@ -294,6 +294,8 @@ __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_mul_isl_int(
        __isl_take isl_qpolynomial_fold *fold, isl_int v);
 __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale(
        __isl_take isl_qpolynomial_fold *fold, isl_int v);
        __isl_take isl_qpolynomial_fold *fold, isl_int v);
 __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale(
        __isl_take isl_qpolynomial_fold *fold, isl_int v);
+__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale_val(
+       __isl_take isl_qpolynomial_fold *fold, __isl_take isl_val *v);
 
 __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_move_dims(
        __isl_take isl_qpolynomial_fold *fold,
 
 __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_move_dims(
        __isl_take isl_qpolynomial_fold *fold,
index 82cad6f..4b7cd76 100644 (file)
@@ -1630,3 +1630,50 @@ __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale(
 {
        return isl_qpolynomial_fold_mul_isl_int(fold, v);
 }
 {
        return isl_qpolynomial_fold_mul_isl_int(fold, v);
 }
+
+/* Multiply "fold" by "v".
+ */
+__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale_val(
+       __isl_take isl_qpolynomial_fold *fold, __isl_take isl_val *v)
+{
+       int i;
+
+       if (!fold || !v)
+               goto error;
+
+       if (isl_val_is_one(v)) {
+               isl_val_free(v);
+               return fold;
+       }
+       if (isl_val_is_zero(v)) {
+               isl_qpolynomial_fold *zero;
+               isl_space *space = isl_qpolynomial_fold_get_domain_space(fold);
+               zero = isl_qpolynomial_fold_empty(fold->type, space);
+               isl_qpolynomial_fold_free(fold);
+               isl_val_free(v);
+               return zero;
+       }
+       if (!isl_val_is_rat(v))
+               isl_die(isl_qpolynomial_fold_get_ctx(fold), isl_error_invalid,
+                       "expecting rational factor", goto error);
+
+       fold = isl_qpolynomial_fold_cow(fold);
+       if (!fold)
+               goto error;
+
+       if (isl_val_is_neg(v))
+               fold->type = isl_fold_type_negate(fold->type);
+       for (i = 0; i < fold->n; ++i) {
+               fold->qp[i] = isl_qpolynomial_scale_val(fold->qp[i],
+                                                       isl_val_copy(v));
+               if (!fold->qp[i])
+                       goto error;
+       }
+
+       isl_val_free(v);
+       return fold;
+error:
+       isl_val_free(v);
+       isl_qpolynomial_fold_free(fold);
+       return NULL;
+}