isl_vertices_foreach_cell: store individual vertex ids inside cell
authorSven Verdoolaege <skimo@kotnet.org>
Mon, 8 Nov 2010 15:34:07 +0000 (16:34 +0100)
committerSven Verdoolaege <skimo@kotnet.org>
Fri, 12 Nov 2010 15:07:51 +0000 (16:07 +0100)
Currently, each cell corresponds to a (possibly reduced) chamber
in the chamber decomposition.  If we want to allow other kinds
of cells, e.g., triangulations of chambers, then we need to
store the vertex ids inside the individual cells.

Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
isl_bernstein.c
isl_vertices.c
isl_vertices_private.h

index 58fc7c9..c022930 100644 (file)
@@ -100,7 +100,7 @@ static int is_tight(int *k, int n, int d, isl_cell *cell)
                                return 0;
                        continue;
                }
-               v = cell->vertices->c[cell->id].vertices[n - 1 - i];
+               v = cell->ids[n - 1 - i];
                return vertex_is_integral(cell->vertices->v[v].vertex);
        }
 
@@ -253,7 +253,7 @@ static int bernstein_coefficients_cell(__isl_take isl_cell *cell, void *user)
        isl_set *dom;
 
        nvar = isl_qpolynomial_dim(poly, isl_dim_set) - 1;
-       n_vertices = cell->vertices->c[cell->id].n_vertices;
+       n_vertices = cell->n_vertices;
 
        subs = isl_alloc_array(data->poly->dim->ctx, isl_qpolynomial *,
                                1 + nvar);
@@ -272,7 +272,7 @@ static int bernstein_coefficients_cell(__isl_take isl_cell *cell, void *user)
                c = isl_qpolynomial_var(isl_dim_copy(dim_dst), isl_dim_set,
                                        1 + nvar + i);
                for (j = 0; j < nvar; ++j) {
-                       int k = cell->vertices->c[cell->id].vertices[i];
+                       int k = cell->ids[i];
                        isl_qpolynomial *v;
                        v = vertex_coordinate(cell->vertices->v[k].vertex, j,
                                                isl_dim_copy(dim_param));
index 4abd3ae..c1dc6c1 100644 (file)
@@ -1066,34 +1066,34 @@ isl_ctx *isl_cell_get_ctx(__isl_keep isl_cell *cell)
 
 __isl_give isl_basic_set *isl_cell_get_domain(__isl_keep isl_cell *cell)
 {
-       struct isl_chamber *c;
-
-       if (!cell)
-               return NULL;
-
-       c = &cell->vertices->c[cell->id];
-
-       return isl_basic_set_copy(c->dom);
+       return cell ? isl_basic_set_copy(cell->dom) : NULL;
 }
 
 static __isl_give isl_cell *isl_cell_alloc(__isl_take isl_vertices *vertices,
        __isl_take isl_basic_set *dom, int id)
 {
-       isl_cell *cell;
+       int i;
+       isl_cell *cell = NULL;
 
        if (!vertices || !dom)
                goto error;
 
-       cell = isl_alloc_type(dom->ctx, isl_cell);
+       cell = isl_calloc_type(dom->ctx, isl_cell);
        if (!cell)
                goto error;
 
+       cell->n_vertices = vertices->c[id].n_vertices;
+       cell->ids = isl_alloc_array(dom->ctx, int, cell->n_vertices);
+       if (!cell->ids)
+               goto error;
+       for (i = 0; i < cell->n_vertices; ++i)
+               cell->ids[i] = vertices->c[id].vertices[i];
        cell->vertices = vertices;
        cell->dom = dom;
-       cell->id = id;
 
        return cell;
 error:
+       isl_cell_free(cell);
        isl_vertices_free(vertices);
        isl_basic_set_free(dom);
        return NULL;
@@ -1105,6 +1105,7 @@ void isl_cell_free(__isl_take isl_cell *cell)
                return;
 
        isl_vertices_free(cell->vertices);
+       free(cell->ids);
        isl_basic_set_free(cell->dom);
        free(cell);
 }
@@ -1315,21 +1316,18 @@ int isl_cell_foreach_vertex(__isl_keep isl_cell *cell,
 {
        int i;
        isl_vertex *vertex;
-       struct isl_chamber *c;
 
        if (!cell)
                return -1;
 
-       c = &cell->vertices->c[cell->id];
-
-       if (c->n_vertices == 0)
+       if (cell->n_vertices == 0)
                return 0;
 
-       for (i = 0; i < c->n_vertices; ++i) {
+       for (i = 0; i < cell->n_vertices; ++i) {
                int r;
 
                vertex = isl_vertex_alloc(isl_vertices_copy(cell->vertices),
-                                               c->vertices[i]);
+                                         cell->ids[i]);
                if (!vertex)
                        return -1;
 
index 2ec8270..90382e1 100644 (file)
@@ -38,9 +38,10 @@ struct isl_vertices {
 };
 
 struct isl_cell {
+       int n_vertices;
+       int *ids;
        isl_vertices *vertices;
        isl_basic_set *dom;
-       int id;
 };
 
 struct isl_external_vertex {