isl_stream: accept "@" token
[platform/upstream/isl.git] / isl_dim.c
index 220b81f..c364c8b 100644 (file)
--- a/isl_dim.c
+++ b/isl_dim.c
@@ -7,7 +7,7 @@
  * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium
  */
 
-#include "isl_dim.h"
+#include <isl_dim_private.h>
 #include "isl_name.h"
 
 struct isl_dim *isl_dim_alloc(struct isl_ctx *ctx,
@@ -344,6 +344,49 @@ struct isl_dim *isl_dim_add(struct isl_dim *dim, enum isl_dim_type type,
        return dim;
 }
 
+__isl_give isl_dim *isl_dim_move(__isl_take isl_dim *dim,
+       enum isl_dim_type dst_type, unsigned dst_pos,
+       enum isl_dim_type src_type, unsigned src_pos, unsigned n)
+{
+       if (!dim)
+               return NULL;
+       if (n == 0)
+               return dim;
+
+       isl_assert(dim->ctx, src_pos + n <= isl_dim_size(dim, src_type),
+               goto error);
+
+       /* just the simple case for now */
+       isl_assert(dim->ctx,
+               offset(dim, dst_type) + dst_pos ==
+               offset(dim, src_type) + src_pos + ((src_type < dst_type) ? n : 0),
+               goto error);
+
+       if (dst_type == src_type)
+               return dim;
+
+       dim = isl_dim_cow(dim);
+       if (!dim)
+               return NULL;
+
+       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;
@@ -353,7 +396,7 @@ struct isl_dim *isl_dim_join(struct isl_dim *left, struct isl_dim *right)
 
        isl_assert(left->ctx, match(left, isl_dim_param, right, isl_dim_param),
                        goto error);
-       isl_assert(left->ctx, match(left, isl_dim_out, right, isl_dim_in),
+       isl_assert(left->ctx, n(left, isl_dim_out) == n(right, isl_dim_in),
                        goto error);
 
        dim = isl_dim_alloc(left->ctx, left->nparam, left->n_in, right->n_out);
@@ -593,8 +636,8 @@ unsigned isl_dim_total(struct isl_dim *dim)
 int isl_dim_equal(struct isl_dim *dim1, struct isl_dim *dim2)
 {
        return match(dim1, isl_dim_param, dim2, isl_dim_param) &&
-              match(dim1, isl_dim_in, dim2, isl_dim_in) &&
-              match(dim1, isl_dim_out, dim2, isl_dim_out);
+              n(dim1, isl_dim_in) == n(dim2, isl_dim_in) &&
+              n(dim1, isl_dim_out) == n(dim2, isl_dim_out);
 }
 
 int isl_dim_compatible(struct isl_dim *dim1, struct isl_dim *dim2)