add isl_union_pw_multi_aff_from_union_set
authorSven Verdoolaege <skimo@kotnet.org>
Sat, 26 Jan 2013 17:40:18 +0000 (18:40 +0100)
committerSven Verdoolaege <skimo@kotnet.org>
Sun, 10 Feb 2013 20:03:11 +0000 (21:03 +0100)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl/aff.h
isl_aff.c

index 950f93c..999e2f4 100644 (file)
@@ -3704,12 +3704,21 @@ can be created using the following functions.
 A piecewise multiple quasi affine expression can also be initialized
 from an C<isl_set> or C<isl_map>, provided the C<isl_set> is a singleton
 and the C<isl_map> is single-valued.
+In case of a conversion from an C<isl_union_set> or an C<isl_union_map>
+to an C<isl_union_pw_multi_aff>, these properties need to hold in each space.
 
        __isl_give isl_pw_multi_aff *isl_pw_multi_aff_from_set(
                __isl_take isl_set *set);
        __isl_give isl_pw_multi_aff *isl_pw_multi_aff_from_map(
                __isl_take isl_map *map);
 
+       __isl_give isl_union_pw_multi_aff *
+       isl_union_pw_multi_aff_from_union_set(
+               __isl_take isl_union_set *uset);
+       __isl_give isl_union_pw_multi_aff *
+       isl_union_pw_multi_aff_from_union_map(
+               __isl_take isl_union_map *umap);
+
 Multiple quasi affine expressions can be copied and freed using
 
        #include <isl/aff.h>
index a8e16c8..87d27bd 100644 (file)
@@ -509,6 +509,11 @@ __isl_give isl_union_map *isl_union_map_from_union_pw_multi_aff(
 __isl_give isl_printer *isl_printer_print_union_pw_multi_aff(
        __isl_take isl_printer *p, __isl_keep isl_union_pw_multi_aff *upma);
 
+__isl_give isl_union_pw_multi_aff *isl_union_pw_multi_aff_from_union_set(
+       __isl_take isl_union_set *uset);
+__isl_give isl_union_pw_multi_aff *isl_union_pw_multi_aff_from_union_map(
+       __isl_take isl_union_map *umap);
+
 __isl_give isl_multi_pw_aff *isl_multi_pw_aff_zero(__isl_take isl_space *space);
 __isl_give isl_multi_pw_aff *isl_multi_pw_aff_identity(
        __isl_take isl_space *space);
index e9d7286..ae57b81 100644 (file)
--- a/isl_aff.c
+++ b/isl_aff.c
@@ -3761,6 +3761,51 @@ __isl_give isl_pw_multi_aff *isl_pw_multi_aff_from_set(__isl_take isl_set *set)
        return isl_pw_multi_aff_from_map(set);
 }
 
+/* Convert "map" into an isl_pw_multi_aff (if possible) and
+ * add it to *user.
+ */
+static int pw_multi_aff_from_map(__isl_take isl_map *map, void *user)
+{
+       isl_union_pw_multi_aff **upma = user;
+       isl_pw_multi_aff *pma;
+
+       pma = isl_pw_multi_aff_from_map(map);
+       *upma = isl_union_pw_multi_aff_add_pw_multi_aff(*upma, pma);
+
+       return *upma ? 0 : -1;
+}
+
+/* Try and create an isl_union_pw_multi_aff that is equivalent
+ * to the given isl_union_map.
+ * The isl_union_map is required to be single-valued in each space.
+ * Otherwise, an error is produced.
+ */
+__isl_give isl_union_pw_multi_aff *isl_union_pw_multi_aff_from_union_map(
+       __isl_take isl_union_map *umap)
+{
+       isl_space *space;
+       isl_union_pw_multi_aff *upma;
+
+       space = isl_union_map_get_space(umap);
+       upma = isl_union_pw_multi_aff_empty(space);
+       if (isl_union_map_foreach_map(umap, &pw_multi_aff_from_map, &upma) < 0)
+               upma = isl_union_pw_multi_aff_free(upma);
+       isl_union_map_free(umap);
+
+       return upma;
+}
+
+/* Try and create an isl_union_pw_multi_aff that is equivalent
+ * to the given isl_union_set.
+ * The isl_union_set is required to be a singleton in each space.
+ * Otherwise, an error is produced.
+ */
+__isl_give isl_union_pw_multi_aff *isl_union_pw_multi_aff_from_union_set(
+       __isl_take isl_union_set *uset)
+{
+       return isl_union_pw_multi_aff_from_union_map(uset);
+}
+
 /* Return the piecewise affine expression "set ? 1 : 0".
  */
 __isl_give isl_pw_aff *isl_set_indicator_function(__isl_take isl_set *set)