interface: update to move of llvm/Support/Host.h to llvm/TargetParser/Host.h
[isl.git] / isl_multi_apply_templ.c
blob31e27f26fb41cabe638c38482503f02c1ccc3b88
1 /*
2 * Copyright 2011 Sven Verdoolaege
3 * Copyright 2012-2013 Ecole Normale Superieure
5 * Use of this software is governed by the MIT license
7 * Written by Sven Verdoolaege,
8 * Ecole Normale Superieure, 45 rue d’Ulm, 75230 Paris, France
9 */
11 #include <isl_multi_macro.h>
13 /* Transform the elements of "multi" by applying "fn" to them
14 * with extra argument "set".
16 * The parameters of "multi" and "set" are assumed to have been aligned.
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))
22 isl_size n;
23 int i;
25 n = FN(MULTI(BASE),size)(multi);
26 if (n < 0 || !set)
27 goto error;
29 for (i = 0; i < n; ++i) {
30 EL *el;
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);
37 FN(APPLY_DOM,free)(set);
38 return multi;
39 error:
40 FN(APPLY_DOM,free)(set);
41 FN(MULTI(BASE),free)(multi);
42 return NULL;
45 /* Transform the elements of "multi" by applying "fn" to them
46 * with extra argument "set".
48 * Align the parameters if needed and call apply_set_aligned.
50 static __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))
54 isl_bool aligned;
55 isl_ctx *ctx;
57 if (!multi || !set)
58 goto error;
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);
75 error:
76 FN(MULTI(BASE),free)(multi);
77 FN(APPLY_DOM,free)(set);
78 return NULL;