add isl_union_pw_qpolynomial_extract_pw_qpolynomial
authorSven Verdoolaege <skimo@kotnet.org>
Wed, 29 Sep 2010 15:57:36 +0000 (17:57 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Sun, 10 Oct 2010 12:05:52 +0000 (14:05 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl_polynomial.h
isl_union_templ.c

index d4f5eeb..996762b 100644 (file)
@@ -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
 
index 412e2ba..4537c87 100644 (file)
@@ -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,
index 4fa60f3..c8ae4c1 100644 (file)
@@ -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)
 {