add isl_union_map_intersect_params
authorSven Verdoolaege <skimo@kotnet.org>
Sun, 16 Oct 2011 08:54:22 +0000 (10:54 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Sun, 16 Oct 2011 12:52:14 +0000 (14:52 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl/union_map.h
include/isl/union_set.h
isl_union_map.c

index 8333832..bc26688 100644 (file)
@@ -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);
index d17730c..15918f7 100644 (file)
@@ -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(
index 7fd7ffa..b1c3b27 100644 (file)
@@ -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
index c044e5b..70f0159 100644 (file)
@@ -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;