From 4cee5cd9de4200eca501c65513b9435d9949120d Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Mon, 8 Nov 2010 16:34:07 +0100 Subject: [PATCH] isl_vertices_foreach_cell: store individual vertex ids inside cell 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 --- isl_bernstein.c | 6 +++--- isl_vertices.c | 32 +++++++++++++++----------------- isl_vertices_private.h | 3 ++- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/isl_bernstein.c b/isl_bernstein.c index 58fc7c99..c022930d 100644 --- a/isl_bernstein.c +++ b/isl_bernstein.c @@ -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)); diff --git a/isl_vertices.c b/isl_vertices.c index 4abd3ae8..c1dc6c17 100644 --- a/isl_vertices.c +++ b/isl_vertices.c @@ -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; diff --git a/isl_vertices_private.h b/isl_vertices_private.h index 2ec82700..90382e1f 100644 --- a/isl_vertices_private.h +++ b/isl_vertices_private.h @@ -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 { -- 2.11.4.GIT