X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=isl_vec.c;h=ce1744921efe982ce90bf360e2280915772e2f43;hb=26880800630424c383fc26fdbde4c9fde114fbd0;hp=b0bd1a3a5ca1e17ee968b18cedf59f71e0f954cf;hpb=9f56bb6ae497a84716e53c1531b8c02d6b1a41d8;p=platform%2Fupstream%2Fisl.git diff --git a/isl_vec.c b/isl_vec.c index b0bd1a3..ce17449 100644 --- a/isl_vec.c +++ b/isl_vec.c @@ -1,7 +1,7 @@ /* * Copyright 2008-2009 Katholieke Universiteit Leuven * - * Use of this software is governed by the GNU LGPLv2.1 license + * Use of this software is governed by the MIT license * * Written by Sven Verdoolaege, K.U.Leuven, Departement * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium @@ -87,6 +87,39 @@ __isl_give isl_vec *isl_vec_zero_extend(__isl_take isl_vec *vec, unsigned size) 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) @@ -103,6 +136,8 @@ struct isl_vec *isl_vec_dup(struct isl_vec *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; } @@ -121,17 +156,68 @@ struct isl_vec *isl_vec_cow(struct isl_vec *vec) return vec2; } -void isl_vec_free(struct isl_vec *vec) +void *isl_vec_free(__isl_take isl_vec *vec) { if (!vec) - return; + return NULL; if (--vec->ref > 0) - return; + return NULL; isl_ctx_deref(vec->ctx); isl_blk_free(vec->ctx, vec->block); free(vec); + + return NULL; +} + +int isl_vec_size(__isl_keep isl_vec *vec) +{ + return vec ? vec->size : -1; +} + +int isl_vec_get_element(__isl_keep isl_vec *vec, int pos, isl_int *v) +{ + if (!vec) + return -1; + + if (pos < 0 || pos >= vec->size) + isl_die(vec->ctx, isl_error_invalid, "position out of range", + return -1); + isl_int_set(*v, vec->el[pos]); + return 0; +} + +__isl_give isl_vec *isl_vec_set_element(__isl_take isl_vec *vec, + int pos, isl_int v) +{ + vec = isl_vec_cow(vec); + if (!vec) + return NULL; + if (pos < 0 || pos >= vec->size) + isl_die(vec->ctx, isl_error_invalid, "position out of range", + goto error); + isl_int_set(vec->el[pos], v); + return vec; +error: + isl_vec_free(vec); + return NULL; +} + +__isl_give isl_vec *isl_vec_set_element_si(__isl_take isl_vec *vec, + int pos, int v) +{ + vec = isl_vec_cow(vec); + if (!vec) + return NULL; + if (pos < 0 || pos >= vec->size) + isl_die(vec->ctx, isl_error_invalid, "position out of range", + goto error); + isl_int_set_si(vec->el[pos], v); + return vec; +error: + isl_vec_free(vec); + return NULL; } int isl_vec_is_equal(__isl_keep isl_vec *vec1, __isl_keep isl_vec *vec2) @@ -181,6 +267,24 @@ void isl_vec_dump(struct isl_vec *vec) isl_printer_free(printer); } +__isl_give isl_vec *isl_vec_set(__isl_take isl_vec *vec, isl_int v) +{ + vec = isl_vec_cow(vec); + if (!vec) + return NULL; + isl_seq_set(vec->el, v, vec->size); + return vec; +} + +__isl_give isl_vec *isl_vec_set_si(__isl_take isl_vec *vec, int v) +{ + vec = isl_vec_cow(vec); + if (!vec) + return NULL; + isl_seq_set_si(vec->el, v, vec->size); + return vec; +} + __isl_give isl_vec *isl_vec_clr(__isl_take isl_vec *vec) { vec = isl_vec_cow(vec); @@ -219,6 +323,15 @@ struct isl_vec *isl_vec_normalize(struct isl_vec *vec) return vec; } +__isl_give isl_vec *isl_vec_neg(__isl_take isl_vec *vec) +{ + vec = isl_vec_cow(vec); + if (!vec) + return NULL; + isl_seq_neg(vec->el, vec->el, vec->size); + return vec; +} + __isl_give isl_vec *isl_vec_scale(__isl_take isl_vec *vec, isl_int m) { if (isl_int_is_one(m)) @@ -230,6 +343,19 @@ __isl_give isl_vec *isl_vec_scale(__isl_take isl_vec *vec, isl_int m) 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) {