isl_arg_parse: print current option values as defaults
[platform/upstream/isl.git] / isl_map_subtract.c
index 5109377..1fd4086 100644 (file)
@@ -536,6 +536,58 @@ struct isl_set *isl_set_subtract(struct isl_set *set1, struct isl_set *set2)
                        (struct isl_map *)set1, (struct isl_map *)set2);
 }
 
+/* Remove the elements of "dom" from the domain of "map".
+ */
+static __isl_give isl_map *map_subtract_domain(__isl_take isl_map *map,
+       __isl_take isl_set *dom)
+{
+       isl_map *ext_dom;
+
+       if (!isl_map_compatible_domain(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_domain(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_domain(__isl_take isl_map *map,
+       __isl_take isl_set *dom)
+{
+       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.
  */
@@ -709,7 +761,7 @@ static int map_is_singleton_subset(__isl_keep isl_map *map1,
        return is_subset;
 }
 
-int isl_map_is_subset(struct isl_map *map1, struct isl_map *map2)
+static int map_is_subset(__isl_keep isl_map *map1, __isl_keep isl_map *map2)
 {
        int is_subset = 0;
 
@@ -740,6 +792,12 @@ int isl_map_is_subset(struct isl_map *map1, struct isl_map *map2)
        return is_subset;
 }
 
+int isl_map_is_subset(__isl_keep isl_map *map1, __isl_keep isl_map *map2)
+{
+       return isl_map_align_params_map_map_and_test(map1, map2,
+                                                       &map_is_subset);
+}
+
 int isl_set_is_subset(struct isl_set *set1, struct isl_set *set2)
 {
        return isl_map_is_subset(