| /* |
| * Copyright 2013 Ecole Normale Superieure |
| * |
| * Use of this software is governed by the MIT license |
| * |
| * Written by Sven Verdoolaege, |
| * Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France |
| */ |
| |
| /* Apply "fn" to each of the elements of "multi" with as second argument "v". |
| */ |
| static __isl_give MULTI(BASE) *FN(MULTI(BASE),fn_val)( |
| __isl_take MULTI(BASE) *multi, |
| __isl_give EL *(*fn)(__isl_take EL *el, __isl_take isl_val *v), |
| __isl_take isl_val *v) |
| { |
| isl_size n; |
| int i; |
| |
| n = FN(MULTI(BASE),size)(multi); |
| if (n < 0 || !v) |
| goto error; |
| |
| for (i = 0; i < n; ++i) { |
| EL *el; |
| |
| el = FN(MULTI(BASE),take_at)(multi, i); |
| el = fn(el, isl_val_copy(v)); |
| multi = FN(MULTI(BASE),restore_at)(multi, i, el); |
| } |
| |
| isl_val_free(v); |
| return multi; |
| error: |
| isl_val_free(v); |
| FN(MULTI(BASE),free)(multi); |
| return NULL; |
| } |
| |
| #undef TYPE |
| #define TYPE MULTI(BASE) |
| #include "isl_type_check_match_range_multi_val.c" |
| |
| /* Elementwise apply "fn" to "multi" and "mv". |
| */ |
| static __isl_give MULTI(BASE) *FN(MULTI(BASE),fn_multi_val)( |
| __isl_take MULTI(BASE) *multi, |
| __isl_give EL *(*fn)(__isl_take EL *el, __isl_take isl_val *v), |
| __isl_take isl_multi_val *mv) |
| { |
| isl_size n; |
| int i; |
| |
| n = FN(MULTI(BASE),size)(multi); |
| if (n < 0 || FN(MULTI(BASE),check_match_range_multi_val)(multi, mv) < 0) |
| goto error; |
| |
| for (i = 0; i < n; ++i) { |
| isl_val *v; |
| EL *el; |
| |
| v = isl_multi_val_get_val(mv, i); |
| el = FN(MULTI(BASE),take_at)(multi, i); |
| el = fn(el, v); |
| multi = FN(MULTI(BASE),restore_at)(multi, i, el); |
| } |
| |
| isl_multi_val_free(mv); |
| return multi; |
| error: |
| isl_multi_val_free(mv); |
| return FN(MULTI(BASE),free)(multi); |
| } |