X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=isl_fold.c;h=f04b4d485c983e144d60e16bcee26f88e3871fa3;hb=b944c27a4e9ea06d27bb879e9f222f8c915d1218;hp=a0bdab3c48d685e7ead4e4ff5930e6bc8e5418c8;hpb=4d85255426ac9386bd4ece4189a533700e2eb9b4;p=platform%2Fupstream%2Fisl.git diff --git a/isl_fold.c b/isl_fold.c index a0bdab3..f04b4d4 100644 --- a/isl_fold.c +++ b/isl_fold.c @@ -24,7 +24,7 @@ static __isl_give isl_qpolynomial_fold *qpolynomial_fold_alloc( goto error; isl_assert(dim->ctx, n >= 0, goto error); - fold = isl_alloc(dim->ctx, struct isl_qpolynomial_fold, + fold = isl_calloc(dim->ctx, struct isl_qpolynomial_fold, sizeof(struct isl_qpolynomial_fold) + (n - 1) * sizeof(struct isl_qpolynomial *)); if (!fold) @@ -397,6 +397,7 @@ __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_dup( if (!dup) return NULL; + dup->n = fold->n; for (i = 0; i < fold->n; ++i) { dup->qp[i] = isl_qpolynomial_copy(fold->qp[i]); if (!dup->qp[i]) @@ -718,3 +719,134 @@ int isl_pw_qpolynomial_fold_covers(__isl_keep isl_pw_qpolynomial_fold *pwf1, return 1; } + +__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_morph( + __isl_take isl_qpolynomial_fold *fold, __isl_take isl_morph *morph) +{ + int i; + isl_ctx *ctx; + + if (!fold || !morph) + goto error; + + ctx = fold->dim->ctx; + isl_assert(ctx, isl_dim_equal(fold->dim, morph->dom->dim), goto error); + + fold = isl_qpolynomial_fold_cow(fold); + if (!fold) + goto error; + + isl_dim_free(fold->dim); + fold->dim = isl_dim_copy(morph->ran->dim); + if (!fold->dim) + goto error; + + for (i = 0; i < fold->n; ++i) { + fold->qp[i] = isl_qpolynomial_morph(fold->qp[i], + isl_morph_copy(morph)); + if (!fold->qp[i]) + goto error; + } + + isl_morph_free(morph); + + return fold; +error: + isl_qpolynomial_fold_free(fold); + isl_morph_free(morph); + return NULL; +} + +enum isl_fold isl_qpolynomial_fold_get_type(__isl_keep isl_qpolynomial_fold *fold) +{ + if (!fold) + return isl_fold_list; + return fold->type; +} + +__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_lift( + __isl_take isl_qpolynomial_fold *fold, __isl_take isl_dim *dim) +{ + int i; + isl_ctx *ctx; + + if (!fold || !dim) + goto error; + + if (isl_dim_equal(fold->dim, dim)) { + isl_dim_free(dim); + return fold; + } + + fold = isl_qpolynomial_fold_cow(fold); + if (!fold) + goto error; + + isl_dim_free(fold->dim); + fold->dim = isl_dim_copy(dim); + if (!fold->dim) + goto error; + + for (i = 0; i < fold->n; ++i) { + fold->qp[i] = isl_qpolynomial_lift(fold->qp[i], + isl_dim_copy(dim)); + if (!fold->qp[i]) + goto error; + } + + isl_dim_free(dim); + + return fold; +error: + isl_qpolynomial_fold_free(fold); + isl_dim_free(dim); + return NULL; +} + +int isl_qpolynomial_fold_foreach_qpolynomial( + __isl_keep isl_qpolynomial_fold *fold, + int (*fn)(__isl_take isl_qpolynomial *qp, void *user), void *user) +{ + int i; + + if (!fold) + return -1; + + for (i = 0; i < fold->n; ++i) + if (fn(isl_qpolynomial_copy(fold->qp[i]), user) < 0) + return -1; + + return 0; +} + +__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_move_dims( + __isl_take isl_qpolynomial_fold *fold, + enum isl_dim_type dst_type, unsigned dst_pos, + enum isl_dim_type src_type, unsigned src_pos, unsigned n) +{ + int i; + + if (n == 0) + return fold; + + fold = isl_qpolynomial_fold_cow(fold); + if (!fold) + return NULL; + + fold->dim = isl_dim_move(fold->dim, dst_type, dst_pos, + src_type, src_pos, n); + if (!fold->dim) + goto error; + + for (i = 0; i < fold->n; ++i) { + fold->qp[i] = isl_qpolynomial_move_dims(fold->qp[i], + dst_type, dst_pos, src_type, src_pos, n); + if (!fold->qp[i]) + goto error; + } + + return fold; +error: + isl_qpolynomial_fold_free(fold); + return NULL; +}