80 lines · c
1/*2 * Copyright 2011 Sven Verdoolaege3 * Copyright 2012-2013 Ecole Normale Superieure4 *5 * Use of this software is governed by the MIT license6 *7 * Written by Sven Verdoolaege,8 * Ecole Normale Superieure, 45 rue d’Ulm, 75230 Paris, France9 */10 11#include <isl_multi_macro.h>12 13/* Transform the elements of "multi" by applying "fn" to them14 * with extra argument "set".15 *16 * The parameters of "multi" and "set" are assumed to have been aligned.17 */18__isl_give MULTI(BASE) *FN(FN(MULTI(BASE),apply_aligned),APPLY_DOMBASE)(19 __isl_take MULTI(BASE) *multi, __isl_take APPLY_DOM *set,20 __isl_give EL *(*fn)(EL *el, __isl_take APPLY_DOM *set))21{22 isl_size n;23 int i;24 25 n = FN(MULTI(BASE),size)(multi);26 if (n < 0 || !set)27 goto error;28 29 for (i = 0; i < n; ++i) {30 EL *el;31 32 el = FN(MULTI(BASE),take_at)(multi, i);33 el = fn(el, FN(APPLY_DOM,copy)(set));34 multi = FN(MULTI(BASE),restore_at)(multi, i, el);35 }36 37 FN(APPLY_DOM,free)(set);38 return multi;39error:40 FN(APPLY_DOM,free)(set);41 FN(MULTI(BASE),free)(multi);42 return NULL;43}44 45/* Transform the elements of "multi" by applying "fn" to them46 * with extra argument "set".47 *48 * Align the parameters if needed and call apply_set_aligned.49 */50static __isl_give MULTI(BASE) *FN(FN(MULTI(BASE),apply),APPLY_DOMBASE)(51 __isl_take MULTI(BASE) *multi, __isl_take APPLY_DOM *set,52 __isl_give EL *(*fn)(EL *el, __isl_take APPLY_DOM *set))53{54 isl_bool aligned;55 isl_ctx *ctx;56 57 if (!multi || !set)58 goto error;59 60 aligned = FN(APPLY_DOM,space_has_equal_params)(set, multi->space);61 if (aligned < 0)62 goto error;63 if (aligned)64 return FN(FN(MULTI(BASE),apply_aligned),APPLY_DOMBASE)(multi,65 set, fn);66 ctx = FN(MULTI(BASE),get_ctx)(multi);67 if (!isl_space_has_named_params(multi->space) ||68 !isl_space_has_named_params(set->dim))69 isl_die(ctx, isl_error_invalid,70 "unaligned unnamed parameters", goto error);71 multi = FN(MULTI(BASE),align_params)(multi,72 FN(APPLY_DOM,get_space)(set));73 set = FN(APPLY_DOM,align_params)(set, FN(MULTI(BASE),get_space)(multi));74 return FN(FN(MULTI(BASE),apply_aligned),APPLY_DOMBASE)(multi, set, fn);75error:76 FN(MULTI(BASE),free)(multi);77 FN(APPLY_DOM,free)(set);78 return NULL;79}80