1 | /* |
2 | * Copyright 2011 Sven Verdoolaege |
3 | * Copyright 2012-2013 Ecole Normale Superieure |
4 | * |
5 | * Use of this software is governed by the MIT license |
6 | * |
7 | * Written by Sven Verdoolaege, |
8 | * Ecole Normale Superieure, 45 rue d’Ulm, 75230 Paris, France |
9 | */ |
10 | |
11 | #include <isl_multi_macro.h> |
12 | |
13 | /* Transform the elements of "multi" by applying "fn" to them |
14 | * 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, pos: i); |
33 | el = fn(el, FN(APPLY_DOM,copy)(map: set)); |
34 | multi = FN(MULTI(BASE),restore_at)(multi, pos: i, el); |
35 | } |
36 | |
37 | FN(APPLY_DOM,free)(map: set); |
38 | return multi; |
39 | error: |
40 | FN(APPLY_DOM,free)(map: set); |
41 | FN(MULTI(BASE),free)(multi); |
42 | return NULL; |
43 | } |
44 | |
45 | /* Transform the elements of "multi" by applying "fn" to them |
46 | * with extra argument "set". |
47 | * |
48 | * Align the parameters if needed and call apply_set_aligned. |
49 | */ |
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)) |
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)(map: set, space: 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(space: multi->space) || |
68 | !isl_space_has_named_params(space: 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)(map: set)); |
73 | set = FN(APPLY_DOM,align_params)(map: 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)(map: set); |
78 | return NULL; |
79 | } |
80 | |