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
))
28 FN(APPLY_DOM
,free
)(set
);
32 multi
= FN(MULTI(BASE
),cow
)(multi
);
36 for (i
= 0; i
< multi
->n
; ++i
) {
37 multi
->p
[i
] = fn(multi
->p
[i
], FN(APPLY_DOM
,copy
)(set
));
42 FN(APPLY_DOM
,free
)(set
);
45 FN(APPLY_DOM
,free
)(set
);
46 FN(MULTI(BASE
),free
)(multi
);
50 /* Transform the elements of "multi" by applying "fn" to them
51 * with extra argument "set".
53 * Align the parameters if needed and call apply_set_aligned.
55 static __isl_give
MULTI(BASE
) *FN(FN(MULTI(BASE
),apply
),APPLY_DOMBASE
)(
56 __isl_take
MULTI(BASE
) *multi
, __isl_take APPLY_DOM
*set
,
57 __isl_give EL
*(*fn
)(EL
*el
, __isl_take APPLY_DOM
*set
))
65 aligned
= FN(APPLY_DOM
,space_has_equal_params
)(set
, multi
->space
);
69 return FN(FN(MULTI(BASE
),apply_aligned
),APPLY_DOMBASE
)(multi
,
71 ctx
= FN(MULTI(BASE
),get_ctx
)(multi
);
72 if (!isl_space_has_named_params(multi
->space
) ||
73 !isl_space_has_named_params(set
->dim
))
74 isl_die(ctx
, isl_error_invalid
,
75 "unaligned unnamed parameters", goto error
);
76 multi
= FN(MULTI(BASE
),align_params
)(multi
,
77 FN(APPLY_DOM
,get_space
)(set
));
78 set
= FN(APPLY_DOM
,align_params
)(set
, FN(MULTI(BASE
),get_space
)(multi
));
79 return FN(FN(MULTI(BASE
),apply_aligned
),APPLY_DOMBASE
)(multi
, set
, fn
);
81 FN(MULTI(BASE
),free
)(multi
);
82 FN(APPLY_DOM
,free
)(set
);