__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);
__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,
__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
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.
*/