summaryrefslogtreecommitdiff
path: root/isl_union_map.c
diff options
context:
space:
mode:
authorSven Verdoolaege <skimo@kotnet.org>2010-08-02 16:56:35 +0200
committerSven Verdoolaege <skimo@kotnet.org>2010-08-05 17:14:38 +0200
commitefd6c5e038fc76c3460a77e4301b110d7541cb49 (patch)
tree125ccda126b4b516a136c18269c2f192e05ced31 /isl_union_map.c
parentcf89fe11363d8aee01b8c511986d62d4e87c9d57 (diff)
downloadisl-efd6c5e038fc76c3460a77e4301b110d7541cb49.tar.gz
isl-efd6c5e038fc76c3460a77e4301b110d7541cb49.tar.bz2
isl-efd6c5e038fc76c3460a77e4301b110d7541cb49.zip
support nested isl_dims
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
Diffstat (limited to 'isl_union_map.c')
-rw-r--r--isl_union_map.c65
1 files changed, 51 insertions, 14 deletions
diff --git a/isl_union_map.c b/isl_union_map.c
index 152dd811..999cd773 100644
--- a/isl_union_map.c
+++ b/isl_union_map.c
@@ -790,7 +790,27 @@ __isl_give isl_union_set *isl_union_map_range(__isl_take isl_union_map *umap)
return un_op(umap, &range_entry, 1);
}
-static int deltas_entry(void **entry, void *user)
+static __isl_give isl_union_set *cond_un_op(__isl_take isl_union_map *umap,
+ int (*fn)(void **, void *))
+{
+ isl_union_set *res;
+
+ if (!umap)
+ return NULL;
+
+ res = isl_union_map_alloc(isl_dim_copy(umap->dim), umap->table.n);
+ if (isl_hash_table_foreach(umap->dim->ctx, &umap->table, fn, &res) < 0)
+ goto error;
+
+ isl_union_map_free(umap);
+ return res;
+error:
+ isl_union_map_free(umap);
+ isl_union_set_free(res);
+ return NULL;
+}
+
+static int deltas_entry(void **entry, void *user)
{
isl_map *map = *entry;
isl_union_set **res = user;
@@ -805,22 +825,39 @@ static int deltas_entry(void **entry, void *user)
__isl_give isl_union_set *isl_union_map_deltas(__isl_take isl_union_map *umap)
{
- isl_union_set *res;
+ return cond_un_op(umap, &deltas_entry);
+}
- if (!umap)
- return NULL;
+static int unwrap_entry(void **entry, void *user)
+{
+ isl_set *set = *entry;
+ isl_union_set **res = user;
- res = isl_union_map_alloc(isl_dim_copy(umap->dim), umap->table.n);
- if (isl_hash_table_foreach(umap->dim->ctx, &umap->table,
- &deltas_entry, &res) < 0)
- goto error;
+ if (!isl_set_is_wrapping(set))
+ return 0;
- isl_union_map_free(umap);
- return res;
-error:
- isl_union_map_free(umap);
- isl_union_set_free(res);
- return NULL;
+ *res = isl_union_map_add_map(*res, isl_set_unwrap(isl_set_copy(set)));
+
+ return 0;
+}
+
+__isl_give isl_union_map *isl_union_set_unwrap(__isl_take isl_union_set *uset)
+{
+ return cond_un_op(uset, &unwrap_entry);
+}
+
+static int wrap_entry(void **entry, void *user)
+{
+ isl_map **map = (isl_map **)entry;
+
+ *map = (isl_map *)isl_map_wrap(*map);
+
+ return *map ? 0 : -1;
+}
+
+__isl_give isl_union_set *isl_union_map_wrap(__isl_take isl_union_map *umap)
+{
+ return un_op(umap, &wrap_entry, 1);
}
struct isl_union_map_is_subset_data {