add isl_qpolynomial_fold_scale_val
[platform/upstream/isl.git] / isl_fold.c
index 1c3abe8..4b7cd76 100644 (file)
@@ -638,6 +638,7 @@ __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_gist_params(
 #define DEFAULT_IS_ZERO 1
 
 #define NO_NEG
+#define NO_PULLBACK
 
 #include <isl_pw_templ.c>
 
@@ -649,6 +650,8 @@ __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_gist_params(
 #define PARTS pw_qpolynomial_fold
 #define ALIGN_DOMAIN
 
+#define NO_SUB
+
 #include <isl_union_templ.c>
 
 __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_empty(enum isl_fold type,
@@ -1627,3 +1630,50 @@ __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale(
 {
        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;
+}