add isl_pw_qpolynomial_add_dims
authorSven Verdoolaege <skimo@kotnet.org>
Sun, 21 Mar 2010 15:36:46 +0000 (16:36 +0100)
committerSven Verdoolaege <skimo@kotnet.org>
Tue, 23 Mar 2010 14:33:46 +0000 (15:33 +0100)
include/isl_polynomial.h
isl_polynomial.c

index 88e2257..39c932a 100644 (file)
@@ -107,6 +107,9 @@ __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_mul(
        __isl_take isl_pw_qpolynomial *pwqp1,
        __isl_take isl_pw_qpolynomial *pwqp2);
 
+__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add_dims(
+       __isl_take isl_pw_qpolynomial *pwqp,
+       enum isl_dim_type type, unsigned n);
 __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_move(
        __isl_take isl_pw_qpolynomial *pwqp,
        enum isl_dim_type dst_type, unsigned dst_pos,
index b80ac87..d393836 100644 (file)
@@ -1959,6 +1959,82 @@ error:
        return NULL;
 }
 
+__isl_give isl_qpolynomial *isl_qpolynomial_add_dims(
+       __isl_take isl_qpolynomial *qp, enum isl_dim_type type, unsigned n)
+{
+       unsigned total;
+       unsigned g_pos;
+       int *exp;
+
+       if (n == 0)
+               return qp;
+
+       qp = isl_qpolynomial_cow(qp);
+       if (!qp)
+               return NULL;
+
+       g_pos = pos(qp->dim, type) + isl_dim_size(qp->dim, type);
+
+       qp->div = isl_mat_insert_cols(qp->div, 2 + g_pos, n);
+       if (!qp->div)
+               goto error;
+
+       total = qp->div->n_col - 2;
+       if (total > g_pos) {
+               int i;
+               exp = isl_alloc_array(qp->div->ctx, int, total - g_pos);
+               if (!exp)
+                       goto error;
+               for (i = 0; i < total - g_pos; ++i)
+                       exp[i] = i + n;
+               qp->upoly = expand(qp->upoly, exp, g_pos);
+               free(exp);
+               if (!qp->upoly)
+                       goto error;
+       }
+
+       qp->dim = isl_dim_add(qp->dim, type, n);
+       if (!qp->dim)
+               goto error;
+
+       return qp;
+error:
+       isl_qpolynomial_free(qp);
+       return NULL;
+}
+
+__isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_add_dims(
+       __isl_take isl_pw_qpolynomial *pwqp,
+       enum isl_dim_type type, unsigned n)
+{
+       int i;
+
+       if (n == 0)
+               return pwqp;
+
+       pwqp = isl_pw_qpolynomial_cow(pwqp);
+       if (!pwqp)
+               return NULL;
+
+       pwqp->dim = isl_dim_add(pwqp->dim, type, n);
+       if (!pwqp->dim)
+               goto error;
+
+       for (i = 0; i < pwqp->n; ++i) {
+               pwqp->p[i].set = isl_set_add(pwqp->p[i].set, type, n);
+               if (!pwqp->p[i].set)
+                       goto error;
+               pwqp->p[i].qp = isl_qpolynomial_add_dims(pwqp->p[i].qp, type, n);
+               if (!pwqp->p[i].qp)
+                       goto error;
+       }
+
+       return pwqp;
+error:
+       isl_pw_qpolynomial_free(pwqp);
+       return NULL;
+}
+
 static int *reordering_move(isl_ctx *ctx,
        unsigned len, unsigned dst, unsigned src, unsigned n)
 {