isl_vertices_foreach_cell: store individual vertex ids inside cell
[platform/upstream/isl.git] / isl_point.c
index 23dbb50..1833572 100644 (file)
@@ -4,6 +4,7 @@
 #include <isl_sample.h>
 #include <isl_scan.h>
 #include <isl_seq.h>
+#include <isl_dim_private.h>
 
 __isl_give isl_point *isl_point_alloc(__isl_take isl_dim *dim,
        __isl_take isl_vec *vec)
@@ -13,10 +14,6 @@ __isl_give isl_point *isl_point_alloc(__isl_take isl_dim *dim,
        if (!dim || !vec)
                goto error;
 
-       pnt = isl_alloc_type(dim->ctx, struct isl_point);
-       if (!pnt)
-               goto error;
-
        if (vec->size > 1 + isl_dim_total(dim)) {
                vec = isl_vec_cow(vec);
                if (!vec)
@@ -24,6 +21,10 @@ __isl_give isl_point *isl_point_alloc(__isl_take isl_dim *dim,
                vec->size = 1 + isl_dim_total(dim);
        }
 
+       pnt = isl_alloc_type(dim->ctx, struct isl_point);
+       if (!pnt)
+               goto error;
+
        pnt->ref = 1;
        pnt->dim = dim;
        pnt->vec = vec;
@@ -248,6 +249,90 @@ error:
        return -1;
 }
 
+/* Return 1 if "bmap" contains the point "point".
+ * "bmap" is assumed to have known divs.
+ * The point is first extended with the divs and then passed
+ * to basic_map_contains.
+ */
+int isl_basic_map_contains_point(__isl_keep isl_basic_map *bmap,
+       __isl_keep isl_point *point)
+{
+       int i;
+       struct isl_vec *vec;
+       unsigned dim;
+       int contains;
+
+       if (!bmap || !point)
+               return -1;
+       isl_assert(bmap->ctx, isl_dim_equal(bmap->dim, point->dim), return -1);
+       if (bmap->n_div == 0)
+               return isl_basic_map_contains(bmap, point->vec);
+
+       dim = isl_basic_map_total_dim(bmap) - bmap->n_div;
+       vec = isl_vec_alloc(bmap->ctx, 1 + dim + bmap->n_div);
+       if (!vec)
+               return -1;
+
+       isl_seq_cpy(vec->el, point->vec->el, point->vec->size);
+       for (i = 0; i < bmap->n_div; ++i) {
+               isl_seq_inner_product(bmap->div[i] + 1, vec->el,
+                                       1 + dim + i, &vec->el[1+dim+i]);
+               isl_int_fdiv_q(vec->el[1+dim+i], vec->el[1+dim+i],
+                               bmap->div[i][0]);
+       }
+
+       contains = isl_basic_map_contains(bmap, vec);
+
+       isl_vec_free(vec);
+       return contains;
+}
+
+int isl_map_contains_point(__isl_keep isl_map *map, __isl_keep isl_point *point)
+{
+       int i;
+       int found = 0;
+
+       if (!map || !point)
+               return -1;
+
+       map = isl_map_copy(map);
+       map = isl_map_compute_divs(map);
+       if (!map)
+               return -1;
+
+       for (i = 0; i < map->n; ++i) {
+               found = isl_basic_map_contains_point(map->p[i], point);
+               if (found < 0)
+                       goto error;
+               if (found)
+                       break;
+       }
+       isl_map_free(map);
+
+       return found;
+error:
+       isl_map_free(map);
+       return -1;
+}
+
+int isl_set_contains_point(__isl_keep isl_set *set, __isl_keep isl_point *point)
+{
+       return isl_map_contains_point((isl_map *)set, point);
+}
+
+__isl_give isl_set *isl_set_from_point(__isl_take isl_point *pnt)
+{
+       isl_basic_set *bset;
+       isl_basic_set *model;
+
+       model = isl_basic_set_empty(isl_dim_copy(pnt->dim));
+       bset = isl_basic_set_from_vec(isl_vec_copy(pnt->vec));
+       bset = isl_basic_set_from_underlying_set(bset, model);
+       isl_point_free(pnt);
+
+       return isl_set_from_basic_set(bset);
+}
+
 __isl_give isl_set *isl_set_box_from_points(__isl_take isl_point *pnt1,
        __isl_take isl_point *pnt2)
 {
@@ -273,24 +358,14 @@ __isl_give isl_set *isl_set_box_from_points(__isl_take isl_point *pnt1,
                return isl_set_empty(dim);
        }
        if (isl_point_is_void(pnt1)) {
-               isl_basic_set *model;
-               model = isl_basic_set_empty(isl_dim_copy(pnt2->dim));
-               bset = isl_basic_set_from_vec(isl_vec_copy(pnt2->vec));
-               bset = isl_basic_set_from_underlying_set(bset, model);
                isl_point_free(pnt1);
-               isl_point_free(pnt2);
                isl_int_clear(t);
-               return isl_set_from_basic_set(bset);
+               return isl_set_from_point(pnt2);
        }
        if (isl_point_is_void(pnt2)) {
-               isl_basic_set *model;
-               model = isl_basic_set_empty(isl_dim_copy(pnt1->dim));
-               bset = isl_basic_set_from_vec(isl_vec_copy(pnt1->vec));
-               bset = isl_basic_set_from_underlying_set(bset, model);
-               isl_point_free(pnt1);
                isl_point_free(pnt2);
                isl_int_clear(t);
-               return isl_set_from_basic_set(bset);
+               return isl_set_from_point(pnt1);
        }
 
        total = isl_dim_total(pnt1->dim);