| /* |
| * 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 |
| */ |
| |
| #define xCAT(A,B) A ## B |
| #define CAT(A,B) xCAT(A,B) |
| #undef TYPE |
| #define TYPE CAT(isl_,BASE) |
| #define xFN(TYPE,NAME) TYPE ## _ ## NAME |
| #define FN(TYPE,NAME) xFN(TYPE,NAME) |
| |
| #undef SUFFIX |
| #define SUFFIX BASE |
| #undef ARG1 |
| #define ARG1 isl_multi_pw_aff |
| #undef ARG2 |
| #define ARG2 TYPE |
| |
| static |
| #include "isl_align_params_templ.c" |
| |
| /* Compute the pullback of "mpa" by the function represented by "fn". |
| * In other words, plug in "fn" in "mpa". |
| * |
| * If "mpa" has an explicit domain, then it is this domain |
| * that needs to undergo a pullback, i.e., a preimage. |
| */ |
| __isl_give isl_multi_pw_aff *FN(isl_multi_pw_aff_pullback,BASE)( |
| __isl_take isl_multi_pw_aff *mpa, __isl_take TYPE *fn) |
| { |
| int i; |
| isl_size n; |
| isl_space *space = NULL; |
| |
| FN(isl_multi_pw_aff_align_params,BASE)(&mpa, &fn); |
| mpa = isl_multi_pw_aff_cow(mpa); |
| n = isl_multi_pw_aff_size(mpa); |
| if (n < 0 || !fn) |
| goto error; |
| |
| space = isl_space_join(FN(TYPE,get_space)(fn), |
| isl_multi_pw_aff_get_space(mpa)); |
| |
| for (i = 0; i < n; ++i) { |
| isl_pw_aff *pa; |
| |
| pa = isl_multi_pw_aff_take_at(mpa, i); |
| pa = FN(isl_pw_aff_pullback,BASE)(pa, FN(TYPE,copy)(fn)); |
| mpa = isl_multi_pw_aff_restore_at(mpa, i, pa); |
| if (!mpa) |
| goto error; |
| } |
| if (isl_multi_pw_aff_has_explicit_domain(mpa)) { |
| mpa->u.dom = FN(isl_set_preimage,BASE)(mpa->u.dom, |
| FN(TYPE,copy)(fn)); |
| if (!mpa->u.dom) |
| goto error; |
| } |
| |
| FN(TYPE,free)(fn); |
| isl_multi_pw_aff_restore_space(mpa, space); |
| return mpa; |
| error: |
| isl_space_free(space); |
| isl_multi_pw_aff_free(mpa); |
| FN(TYPE,free)(fn); |
| return NULL; |
| } |