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;
39error:
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 */
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)(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);
75error:
76 FN(MULTI(BASE),free)(multi);
77 FN(APPLY_DOM,free)(map: set);
78 return NULL;
79}
80

source code of polly/lib/External/isl/isl_multi_apply_templ.c