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
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
))
25 n
= FN(MULTI(BASE
),size
)(multi
);
30 FN(APPLY_DOM
,free
)(set
);
34 multi
= FN(MULTI(BASE
),cow
)(multi
);
38 for (i
= 0; i
< n
; ++i
) {
39 multi
->u
.p
[i
] = fn(multi
->u
.p
[i
], FN(APPLY_DOM
,copy
)(set
));
44 FN(APPLY_DOM
,free
)(set
);
47 FN(APPLY_DOM
,free
)(set
);
48 FN(MULTI(BASE
),free
)(multi
);
52 /* Transform the elements of "multi" by applying "fn" to them
53 * with extra argument "set".
55 * Align the parameters if needed and call apply_set_aligned.
57 static __isl_give
MULTI(BASE
) *FN(FN(MULTI(BASE
),apply
),APPLY_DOMBASE
)(
58 __isl_take
MULTI(BASE
) *multi
, __isl_take APPLY_DOM
*set
,
59 __isl_give EL
*(*fn
)(EL
*el
, __isl_take APPLY_DOM
*set
))
67 aligned
= FN(APPLY_DOM
,space_has_equal_params
)(set
, multi
->space
);
71 return FN(FN(MULTI(BASE
),apply_aligned
),APPLY_DOMBASE
)(multi
,
73 ctx
= FN(MULTI(BASE
),get_ctx
)(multi
);
74 if (!isl_space_has_named_params(multi
->space
) ||
75 !isl_space_has_named_params(set
->dim
))
76 isl_die(ctx
, isl_error_invalid
,
77 "unaligned unnamed parameters", goto error
);
78 multi
= FN(MULTI(BASE
),align_params
)(multi
,
79 FN(APPLY_DOM
,get_space
)(set
));
80 set
= FN(APPLY_DOM
,align_params
)(set
, FN(MULTI(BASE
),get_space
)(multi
));
81 return FN(FN(MULTI(BASE
),apply_aligned
),APPLY_DOMBASE
)(multi
, set
, fn
);
83 FN(MULTI(BASE
),free
)(multi
);
84 FN(APPLY_DOM
,free
)(set
);