From f2a5cedb4cc4a219bfae35f630307c1acccfe601 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Wed, 29 Sep 2010 17:57:36 +0200 Subject: [PATCH] add isl_union_pw_qpolynomial_extract_pw_qpolynomial Signed-off-by: Sven Verdoolaege --- doc/user.pod | 8 ++++++++ include/isl_polynomial.h | 4 ++++ isl_union_templ.c | 25 +++++++++++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/doc/user.pod b/doc/user.pod index d4f5eeb0..996762b2 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -1798,6 +1798,14 @@ piecewise quasipolynomial, use the following function int (*fn)(__isl_take isl_pw_qpolynomial *pwqp, void *user), void *user); +To extract the piecewise quasipolynomial from a union with a given dimension +specification, use + + __isl_give isl_pw_qpolynomial * + isl_union_pw_qpolynomial_extract_pw_qpolynomial( + __isl_keep isl_union_pw_qpolynomial *upwqp, + __isl_take isl_dim *dim); + To iterate over the cells in a piecewise quasipolynomial, use either of the following two functions diff --git a/include/isl_polynomial.h b/include/isl_polynomial.h index 412e2ba0..4537c87f 100644 --- a/include/isl_polynomial.h +++ b/include/isl_polynomial.h @@ -401,6 +401,8 @@ __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_align_params( int isl_union_pw_qpolynomial_foreach_pw_qpolynomial( __isl_keep isl_union_pw_qpolynomial *upwqp, int (*fn)(__isl_take isl_pw_qpolynomial *pwqp, void *user), void *user); +__isl_give isl_pw_qpolynomial *isl_union_pw_qpolynomial_extract_pw_qpolynomial( + __isl_keep isl_union_pw_qpolynomial *upwqp, __isl_take isl_dim *dim); __isl_give isl_printer *isl_printer_print_union_pw_qpolynomial( __isl_take isl_printer *p, __isl_keep isl_union_pw_qpolynomial *upwqp); @@ -458,6 +460,8 @@ int isl_union_pw_qpolynomial_fold_foreach_pw_qpolynomial_fold( __isl_keep isl_union_pw_qpolynomial_fold *upwf, int (*fn)(__isl_take isl_pw_qpolynomial_fold *pwf, void *user), void *user); +__isl_give isl_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_extract_pw_qpolynomial_fold( + __isl_keep isl_union_pw_qpolynomial_fold *upwf, __isl_take isl_dim *dim); __isl_give isl_printer *isl_printer_print_union_pw_qpolynomial_fold( __isl_take isl_printer *p, diff --git a/isl_union_templ.c b/isl_union_templ.c index 4fa60f36..c8ae4c14 100644 --- a/isl_union_templ.c +++ b/isl_union_templ.c @@ -120,6 +120,31 @@ static int has_dim(const void *entry, const void *val) return isl_dim_equal(part->dim, dim); } +__isl_give PART *FN(FN(UNION,extract),PARTS)(__isl_keep UNION *u, + __isl_take isl_dim *dim) +{ + uint32_t hash; + struct isl_hash_table_entry *entry; + + if (!u || !dim) + goto error; + + hash = isl_dim_get_hash(dim); + entry = isl_hash_table_find(u->dim->ctx, &u->table, hash, + &has_dim, dim, 0); + if (!entry) +#ifdef HAS_TYPE + return FN(PART,zero)(dim, u->type); +#else + return FN(PART,zero)(dim); +#endif + isl_dim_free(dim); + return FN(PART,copy)(entry->data); +error: + isl_dim_free(dim); + return NULL; +} + __isl_give UNION *FN(FN(UNION,add),PARTS)(__isl_take UNION *u, __isl_take PART *part) { -- 2.11.4.GIT