From: Sven Verdoolaege Date: Sun, 16 Oct 2011 08:54:22 +0000 (+0200) Subject: add isl_union_map_intersect_params X-Git-Tag: isl-0.08~11 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=dd06ff9252c30fb77fca1e335dcff884e9392aa2;p=platform%2Fupstream%2Fisl.git add isl_union_map_intersect_params Signed-off-by: Sven Verdoolaege --- diff --git a/doc/user.pod b/doc/user.pod index 8333832..bc26688 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -2192,6 +2192,12 @@ the same (number of) parameters. __isl_give isl_set *isl_set_intersect( __isl_take isl_set *set1, __isl_take isl_set *set2); + __isl_give isl_union_set *isl_union_set_intersect_params( + __isl_take isl_union_set *uset, + __isl_take isl_set *set); + __isl_give isl_union_map *isl_union_map_intersect_params( + __isl_take isl_union_map *umap, + __isl_take isl_set *set); __isl_give isl_union_set *isl_union_set_intersect( __isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2); diff --git a/include/isl/union_map.h b/include/isl/union_map.h index d17730c..15918f7 100644 --- a/include/isl/union_map.h +++ b/include/isl/union_map.h @@ -69,6 +69,9 @@ __isl_give isl_union_map *isl_union_map_subtract( __isl_export __isl_give isl_union_map *isl_union_map_intersect( __isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2); +__isl_export +__isl_give isl_union_map *isl_union_map_intersect_params( + __isl_take isl_union_map *umap, __isl_take isl_set *set); __isl_give isl_union_map *isl_union_map_product(__isl_take isl_union_map *umap1, __isl_take isl_union_map *umap2); __isl_give isl_union_map *isl_union_map_range_product( diff --git a/include/isl/union_set.h b/include/isl/union_set.h index 7fd7ffa..b1c3b27 100644 --- a/include/isl/union_set.h +++ b/include/isl/union_set.h @@ -51,6 +51,9 @@ __isl_give isl_union_set *isl_union_set_subtract( __isl_export __isl_give isl_union_set *isl_union_set_intersect( __isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2); +__isl_export +__isl_give isl_union_set *isl_union_set_intersect_params( + __isl_take isl_union_set *uset, __isl_take isl_set *set); __isl_give isl_union_set *isl_union_set_product(__isl_take isl_union_set *uset1, __isl_take isl_union_set *uset2); __isl_export diff --git a/isl_union_map.c b/isl_union_map.c index c044e5b..70f0159 100644 --- a/isl_union_map.c +++ b/isl_union_map.c @@ -574,6 +574,71 @@ __isl_give isl_union_set *isl_union_set_subtract( return isl_union_map_subtract(uset1, uset2); } +struct isl_union_map_gen_bin_set_data { + isl_set *set; + isl_union_map *res; +}; + +static int intersect_params_entry(void **entry, void *user) +{ + struct isl_union_map_gen_bin_set_data *data = user; + isl_map *map = *entry; + int empty; + + map = isl_map_copy(map); + map = isl_map_intersect_params(map, isl_set_copy(data->set)); + + empty = isl_map_is_empty(map); + if (empty < 0) { + isl_map_free(map); + return -1; + } + + data->res = isl_union_map_add_map(data->res, map); + + return 0; +} + +static __isl_give isl_union_map *gen_bin_set_op(__isl_take isl_union_map *umap, + __isl_take isl_set *set, int (*fn)(void **, void *)) +{ + struct isl_union_map_gen_bin_set_data data = { NULL, NULL }; + + umap = isl_union_map_align_params(umap, isl_set_get_space(set)); + set = isl_set_align_params(set, isl_union_map_get_space(umap)); + + if (!umap || !set) + goto error; + + data.set = set; + data.res = isl_union_map_alloc(isl_space_copy(umap->dim), + umap->table.n); + if (isl_hash_table_foreach(umap->dim->ctx, &umap->table, + fn, &data) < 0) + goto error; + + isl_union_map_free(umap); + isl_set_free(set); + return data.res; +error: + isl_union_map_free(umap); + isl_set_free(set); + isl_union_map_free(data.res); + return NULL; +} + +__isl_give isl_union_map *isl_union_map_intersect_params( + __isl_take isl_union_map *umap, __isl_take isl_set *set) +{ + return gen_bin_set_op(umap, set, &intersect_params_entry); +} + +__isl_give isl_union_set *isl_union_set_intersect_params( + __isl_take isl_union_set *uset, __isl_take isl_set *set) +{ + return isl_union_map_intersect_params(uset, set); +} + struct isl_union_map_match_bin_data { isl_union_map *umap2; isl_union_map *res;