add isl_map_subtract_range
authorSven Verdoolaege <skimo@kotnet.org>
Thu, 10 Nov 2011 13:57:41 +0000 (14:57 +0100)
committerSven Verdoolaege <skimo@kotnet.org>
Sun, 13 Nov 2011 14:44:49 +0000 (15:44 +0100)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl/map.h
isl_map_private.h
isl_map_subtract.c

index 9fccccf..ca66e19 100644 (file)
@@ -2290,6 +2290,9 @@ the same (number of) parameters.
        __isl_give isl_map *isl_map_subtract_domain(
                __isl_take isl_map *map,
                __isl_take isl_set *dom);
+       __isl_give isl_map *isl_map_subtract_range(
+               __isl_take isl_map *map,
+               __isl_take isl_set *dom);
        __isl_give isl_union_set *isl_union_set_subtract(
                __isl_take isl_union_set *uset1,
                __isl_take isl_union_set *uset2);
index 2e11ae4..7f18dc6 100644 (file)
@@ -360,6 +360,8 @@ __isl_give isl_map *isl_map_subtract(
                __isl_take isl_map *map2);
 __isl_give isl_map *isl_map_subtract_domain(__isl_take isl_map *map,
        __isl_take isl_set *dom);
+__isl_give isl_map *isl_map_subtract_range(__isl_take isl_map *map,
+       __isl_take isl_set *dom);
 struct isl_map *isl_map_fix_input_si(struct isl_map *map,
                unsigned input, int value);
 __isl_give isl_map *isl_map_fix_si(__isl_take isl_map *map,
index 6bfac80..f3c6cd2 100644 (file)
@@ -336,4 +336,6 @@ __isl_give isl_set *isl_set_substitute(__isl_take isl_set *set,
 __isl_give isl_set *isl_set_gist_params_basic_set(__isl_take isl_set *set,
        __isl_take isl_basic_set *context);
 
+int isl_map_compatible_range(__isl_keep isl_map *map, __isl_keep isl_set *set);
+
 #endif
index 8b4c881..1fd4086 100644 (file)
@@ -562,6 +562,32 @@ __isl_give isl_map *isl_map_subtract_domain(__isl_take isl_map *map,
        return isl_map_align_params_map_map_and(map, dom, &map_subtract_domain);
 }
 
+/* Remove the elements of "dom" from the range of "map".
+ */
+static __isl_give isl_map *map_subtract_range(__isl_take isl_map *map,
+       __isl_take isl_set *dom)
+{
+       isl_map *ext_dom;
+
+       if (!isl_map_compatible_range(map, dom))
+               isl_die(isl_set_get_ctx(dom), isl_error_invalid,
+                       "incompatible spaces", goto error);
+       
+       ext_dom = isl_map_universe(isl_map_get_space(map));
+       ext_dom = isl_map_intersect_range(ext_dom, dom);
+       return isl_map_subtract(map, ext_dom);
+error:
+       isl_map_free(map);
+       isl_set_free(dom);
+       return NULL;
+}
+
+__isl_give isl_map *isl_map_subtract_range(__isl_take isl_map *map,
+       __isl_take isl_set *dom)
+{
+       return isl_map_align_params_map_map_and(map, dom, &map_subtract_range);
+}
+
 /* A diff collector that aborts as soon as its add function is called,
  * setting empty to 0.
  */