#include <isl_ctx_private.h>
#include <isl/seq.h>
#include <isl/vec.h>
+#include <isl_val_private.h>
isl_ctx *isl_vec_get_ctx(__isl_keep isl_vec *vec)
{
return vec;
}
+/* Return a vector containing the elements of "vec1" followed by
+ * those of "vec2".
+ */
+__isl_give isl_vec *isl_vec_concat(__isl_take isl_vec *vec1,
+ __isl_take isl_vec *vec2)
+{
+ if (!vec1 || !vec2)
+ goto error;
+
+ if (vec2->size == 0) {
+ isl_vec_free(vec2);
+ return vec1;
+ }
+
+ if (vec1->size == 0) {
+ isl_vec_free(vec1);
+ return vec2;
+ }
+
+ vec1 = isl_vec_extend(vec1, vec1->size + vec2->size);
+ if (!vec1)
+ goto error;
+
+ isl_seq_cpy(vec1->el + vec1->size - vec2->size, vec2->el, vec2->size);
+
+ isl_vec_free(vec2);
+ return vec1;
+error:
+ isl_vec_free(vec1);
+ isl_vec_free(vec2);
+ return NULL;
+}
+
struct isl_vec *isl_vec_copy(struct isl_vec *vec)
{
if (!vec)
if (!vec)
return NULL;
vec2 = isl_vec_alloc(vec->ctx, vec->size);
+ if (!vec2)
+ return NULL;
isl_seq_cpy(vec2->el, vec->el, vec->size);
return vec2;
}
return 0;
}
+/* Extract the element at position "pos" of "vec".
+ */
+__isl_give isl_val *isl_vec_get_element_val(__isl_keep isl_vec *vec, int pos)
+{
+ isl_ctx *ctx;
+
+ if (!vec)
+ return NULL;
+ ctx = isl_vec_get_ctx(vec);
+ if (pos < 0 || pos >= vec->size)
+ isl_die(ctx, isl_error_invalid, "position out of range",
+ return NULL);
+ return isl_val_int_from_isl_int(ctx, vec->el[pos]);
+}
+
__isl_give isl_vec *isl_vec_set_element(__isl_take isl_vec *vec,
int pos, isl_int v)
{
return NULL;
}
+/* Replace the element at position "pos" of "vec" by "v".
+ */
+__isl_give isl_vec *isl_vec_set_element_val(__isl_take isl_vec *vec,
+ int pos, __isl_take isl_val *v)
+{
+ if (!v)
+ return isl_vec_free(vec);
+ if (!isl_val_is_int(v))
+ isl_die(isl_val_get_ctx(v), isl_error_invalid,
+ "expecting integer value", goto error);
+ vec = isl_vec_set_element(vec, pos, v->n);
+ isl_val_free(v);
+ return vec;
+error:
+ isl_val_free(v);
+ return isl_vec_free(vec);
+}
+
+/* Compare the elements of "vec1" and "vec2" at position "pos".
+ */
+int isl_vec_cmp_element(__isl_keep isl_vec *vec1, __isl_keep isl_vec *vec2,
+ int pos)
+{
+ if (!vec1 || !vec2)
+ return 0;
+ if (pos < 0 || pos >= vec1->size || pos >= vec2->size)
+ isl_die(isl_vec_get_ctx(vec1), isl_error_invalid,
+ "position out of range", return 0);
+ return isl_int_cmp(vec1->el[pos], vec2->el[pos]);
+}
+
int isl_vec_is_equal(__isl_keep isl_vec *vec1, __isl_keep isl_vec *vec2)
{
if (!vec1 || !vec2)
return vec;
}
+/* Replace all elements of "vec" by "v".
+ */
+__isl_give isl_vec *isl_vec_set_val(__isl_take isl_vec *vec,
+ __isl_take isl_val *v)
+{
+ vec = isl_vec_cow(vec);
+ if (!vec || !v)
+ goto error;
+ if (!isl_val_is_int(v))
+ isl_die(isl_val_get_ctx(v), isl_error_invalid,
+ "expecting integer value", goto error);
+ isl_seq_set(vec->el, v->n, vec->size);
+ isl_val_free(v);
+ return vec;
+error:
+ isl_vec_free(vec);
+ isl_val_free(v);
+ return NULL;
+}
+
__isl_give isl_vec *isl_vec_clr(__isl_take isl_vec *vec)
{
vec = isl_vec_cow(vec);
return vec;
}
+/* Reduce the elements of "vec" modulo "m".
+ */
+__isl_give isl_vec *isl_vec_fdiv_r(__isl_take isl_vec *vec, isl_int m)
+{
+ vec = isl_vec_cow(vec);
+ if (!vec)
+ return NULL;
+
+ isl_seq_fdiv_r(vec->el, vec->el, m, vec->size);
+
+ return vec;
+}
+
__isl_give isl_vec *isl_vec_add(__isl_take isl_vec *vec1,
__isl_take isl_vec *vec2)
{