#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)
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)
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;
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)
{
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);