+ if (!bmap)
+ goto error;
+ if (bmap->nparam == 0 && bmap->n_in == 0 && bmap->n_div == 0)
+ return (struct isl_basic_set *)bmap;
+ bmap = isl_basic_map_cow(bmap);
+ if (!bmap)
+ goto error;
+ bmap->n_out += bmap->nparam + bmap->n_in + bmap->n_div;
+ bmap->nparam = 0;
+ bmap->n_in = 0;
+ bmap->extra -= bmap->n_div;
+ bmap->n_div = 0;
+ bmap = isl_basic_map_finalize(bmap);
+ return (struct isl_basic_set *)bmap;
+error:
+ return NULL;
+}
+
+struct isl_basic_map *isl_basic_map_overlying_set(
+ struct isl_basic_set *bset, struct isl_basic_map *like)
+{
+ struct isl_basic_map *bmap;
+ struct isl_ctx *ctx;
+ unsigned total;
+ int i, k;
+
+ if (!bset || !like)
+ goto error;
+ ctx = bset->ctx;
+ isl_assert(ctx, bset->dim ==
+ like->nparam + like->n_in + like->n_out + like->n_div,
+ goto error);
+ if (like->nparam == 0 && like->n_in == 0 && like->n_div == 0) {
+ isl_basic_map_free(like);
+ return (struct isl_basic_map *)bset;
+ }
+ bset = isl_basic_set_cow(bset);
+ if (!bset)
+ goto error;
+ total = bset->dim + bset->extra;
+ bmap = (struct isl_basic_map *)bset;
+ bmap->nparam = like->nparam;
+ bmap->n_in = like->n_in;
+ bmap->n_out = like->n_out;
+ bmap->extra += like->n_div;
+ if (bmap->extra) {
+ unsigned ltotal;
+ ltotal = total - bmap->extra + like->extra;
+ if (ltotal > total)
+ ltotal = total;
+ bmap->block2 = isl_blk_extend(ctx, bmap->block2,
+ bmap->extra * (1 + 1 + total));
+ if (isl_blk_is_error(bmap->block2))
+ goto error;
+ bmap->div = isl_realloc_array(ctx, bmap->div, isl_int *,
+ bmap->extra);
+ if (!bmap->div)
+ goto error;
+ bmap = isl_basic_map_extend(bmap, bmap->nparam,
+ bmap->n_in, bmap->n_out, 0, 0, 2 * like->n_div);
+ for (i = 0; i < like->n_div; ++i) {
+ k = isl_basic_map_alloc_div(bmap);
+ if (k < 0)
+ goto error;
+ isl_seq_cpy(bmap->div[k], like->div[i], 1 + 1 + ltotal);
+ isl_seq_clr(bmap->div[k]+1+1+ltotal, total - ltotal);
+ if (add_div_constraints(bmap, k) < 0)
+ goto error;
+ }
+ }
+ isl_basic_map_free(like);
+ bmap = isl_basic_map_finalize(bmap);
+ return bmap;
+error:
+ isl_basic_map_free(like);
+ isl_basic_set_free(bset);
+ return NULL;
+}
+
+struct isl_basic_set *isl_basic_set_from_underlying_set(
+ struct isl_basic_set *bset, struct isl_basic_set *like)
+{
+ return (struct isl_basic_set *)
+ isl_basic_map_overlying_set(bset, (struct isl_basic_map *)like);
+}
+
+struct isl_set *isl_set_from_underlying_set(
+ struct isl_set *set, struct isl_basic_set *like)
+{
+ int i;
+
+ if (!set || !like)
+ goto error;
+ isl_assert(set->ctx, set->dim == like->nparam + like->dim + like->n_div,
+ goto error);
+ if (like->nparam == 0 && like->n_div == 0) {
+ isl_basic_set_free(like);
+ return set;
+ }
+ set = isl_set_cow(set);
+ if (!set)
+ goto error;
+ for (i = 0; i < set->n; ++i) {
+ set->p[i] = isl_basic_set_from_underlying_set(set->p[i],
+ isl_basic_set_copy(like));
+ if (!set->p[i])
+ goto error;
+ }
+ set->nparam = like->nparam;
+ set->dim = like->dim;
+ isl_basic_set_free(like);
+ return set;
+error:
+ isl_basic_set_free(like);
+ isl_set_free(set);
+ return NULL;
+}
+
+struct isl_set *isl_map_underlying_set(struct isl_map *map)
+{
+ int i;
+
+ map = isl_map_align_divs(map);
+ map = isl_map_cow(map);
+ if (!map)
+ return NULL;
+
+ for (i = 0; i < map->n; ++i) {
+ map->p[i] = (struct isl_basic_map *)
+ isl_basic_map_underlying_set(map->p[i]);
+ if (!map->p[i])
+ goto error;
+ }
+ if (map->n == 0)
+ map->n_out += map->nparam + map->n_in;
+ else
+ map->n_out = map->p[0]->n_out;
+ map->nparam = 0;
+ map->n_in = 0;
+ return (struct isl_set *)map;
+error:
+ isl_map_free(map);
+ return NULL;
+}
+
+struct isl_set *isl_set_to_underlying_set(struct isl_set *set)
+{
+ return (struct isl_set *)isl_map_underlying_set((struct isl_map *)set);
+}
+
+struct isl_basic_set *isl_basic_map_domain(struct isl_basic_map *bmap)
+{