- if (!dim)
- return NULL;
- if (n == 0)
- return dim;
-
- isl_assert(dim->ctx, src_pos + n <= isl_dim_size(dim, src_type),
- goto error);
-
- if (dst_type == src_type && dst_pos == src_pos)
- return dim;
-
- isl_assert(dim->ctx, dst_type != src_type, goto error);
-
- dim = isl_dim_reset(dim, src_type);
- dim = isl_dim_reset(dim, dst_type);
-
- dim = isl_dim_cow(dim);
- if (!dim)
- return NULL;
-
- if (dim->names) {
- struct isl_name **names;
- enum isl_dim_type t;
- int off;
- int s[3];
- int *size = s - isl_dim_param;
- names = isl_calloc_array(dim->ctx, struct isl_name *,
- dim->nparam + dim->n_in + dim->n_out);
- if (!names)
- goto error;
- off = 0;
- size[isl_dim_param] = dim->nparam;
- size[isl_dim_in] = dim->n_in;
- size[isl_dim_out] = dim->n_out;
- for (t = isl_dim_param; t <= isl_dim_out; ++t) {
- if (t == dst_type) {
- get_names(dim, t, 0, dst_pos, names + off);
- off += dst_pos;
- get_names(dim, src_type, src_pos, n, names+off);
- off += n;
- get_names(dim, t, dst_pos, size[t] - dst_pos,
- names + off);
- off += size[t] - dst_pos;
- } else if (t == src_type) {
- get_names(dim, t, 0, src_pos, names + off);
- off += src_pos;
- get_names(dim, t, src_pos + n,
- size[t] - src_pos - n, names + off);
- off += size[t] - src_pos - n;
- } else {
- get_names(dim, t, 0, size[t], names + off);
- off += size[t];
- }
- }
- free(dim->names);
- dim->names = names;
- dim->n_name = dim->nparam + dim->n_in + dim->n_out;
- }
-
- switch (dst_type) {
- case isl_dim_param: dim->nparam += n; break;
- case isl_dim_in: dim->n_in += n; break;
- case isl_dim_out: dim->n_out += n; break;
- }
-
- switch (src_type) {
- case isl_dim_param: dim->nparam -= n; break;
- case isl_dim_in: dim->n_in -= n; break;
- case isl_dim_out: dim->n_out -= n; break;
- }
-
- return dim;
-error:
- isl_dim_free(dim);
- return NULL;
-}
-
-struct isl_dim *isl_dim_join(struct isl_dim *left, struct isl_dim *right)
-{
- struct isl_dim *dim;
-
- if (!left || !right)
- goto error;
-
- isl_assert(left->ctx, match(left, isl_dim_param, right, isl_dim_param),
- goto error);
- isl_assert(left->ctx,
- isl_dim_tuple_match(left, isl_dim_out, right, isl_dim_in),
- goto error);
-
- dim = isl_dim_alloc(left->ctx, left->nparam, left->n_in, right->n_out);
- if (!dim)
- goto error;
-
- dim = copy_names(dim, isl_dim_param, 0, left, isl_dim_param);
- dim = copy_names(dim, isl_dim_in, 0, left, isl_dim_in);
- dim = copy_names(dim, isl_dim_out, 0, right, isl_dim_out);
-
- if (dim && left->tuple_name[0] &&
- !(dim->tuple_name[0] = isl_name_copy(dim->ctx, left->tuple_name[0])))
- goto error;
- if (dim && right->tuple_name[1] &&
- !(dim->tuple_name[1] = isl_name_copy(dim->ctx, right->tuple_name[1])))
- goto error;
- if (dim && left->nested[0] &&
- !(dim->nested[0] = isl_dim_copy(left->nested[0])))
- goto error;
- if (dim && right->nested[1] &&
- !(dim->nested[1] = isl_dim_copy(right->nested[1])))
- goto error;
-
- isl_dim_free(left);
- isl_dim_free(right);
-
- return dim;
-error:
- isl_dim_free(left);
- isl_dim_free(right);
- return NULL;