add isl_qpolynomial_from_term
authorSven Verdoolaege <skimo@kotnet.org>
Mon, 3 May 2010 20:52:51 +0000 (22:52 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Thu, 13 May 2010 16:53:54 +0000 (18:53 +0200)
include/isl_polynomial.h
isl_polynomial.c

index a75524d..b2e93d8 100644 (file)
@@ -89,6 +89,7 @@ __isl_give isl_qpolynomial *isl_qpolynomial_eval(
 
 __isl_give isl_qpolynomial *isl_qpolynomial_from_constraint(
        __isl_take isl_constraint *c, enum isl_dim_type type, unsigned pos);
+__isl_give isl_qpolynomial *isl_qpolynomial_from_term(__isl_take isl_term *term);
 
 __isl_give isl_printer *isl_printer_print_qpolynomial(
        __isl_take isl_printer *p, __isl_keep isl_qpolynomial *qp);
index 0625cce..5cbf162 100644 (file)
@@ -2694,6 +2694,41 @@ int isl_qpolynomial_foreach_term(__isl_keep isl_qpolynomial *qp,
        return term ? 0 : -1;
 }
 
+__isl_give isl_qpolynomial *isl_qpolynomial_from_term(__isl_take isl_term *term)
+{
+       struct isl_upoly *up;
+       isl_qpolynomial *qp;
+       int i, n;
+
+       if (!term)
+               return NULL;
+
+       n = isl_dim_total(term->dim) + term->div->n_row;
+
+       up = isl_upoly_rat_cst(term->dim->ctx, term->n, term->d);
+       for (i = 0; i < n; ++i) {
+               if (!term->pow[i])
+                       continue;
+               up = isl_upoly_mul(up,
+                       isl_upoly_pow(term->dim->ctx, i, term->pow[i]));
+       }
+
+       qp = isl_qpolynomial_alloc(isl_dim_copy(term->dim), term->div->n_row, up);
+       if (!qp)
+               goto error;
+       isl_mat_free(qp->div);
+       qp->div = isl_mat_copy(term->div);
+       if (!qp->div)
+               goto error;
+
+       isl_term_free(term);
+       return qp;
+error:
+       isl_qpolynomial_free(qp);
+       isl_term_free(term);
+       return NULL;
+}
+
 int isl_pw_qpolynomial_foreach_piece(__isl_keep isl_pw_qpolynomial *pwqp,
        int (*fn)(__isl_take isl_set *set, __isl_take isl_qpolynomial *qp,
                    void *user), void *user)