xref: /netbsd-src/external/mit/isl/dist/isl_multi_apply_explicit_domain_templ.c (revision 5971e316fdea024efff6be8f03536623db06833e)
1 /*
2  * Copyright 2017      Sven Verdoolaege
3  *
4  * Use of this software is governed by the MIT license
5  *
6  * Written by Sven Verdoolaege.
7  */
8 
9 /* Transform the explicit domain of "multi" by applying "fn_domain" or
10  * "fn_params" to it with extra argument "domain".
11  * In particular, if the explicit domain is a parameter set,
12  * then apply "fn_params".  Otherwise, apply "fn_domain".
13  *
14  * The parameters of "multi" and "domain" are assumed to have been aligned.
15  */
MULTI(BASE)16 static __isl_give MULTI(BASE) *FN(FN(MULTI(BASE),apply_domain),APPLY_DOMBASE)(
17 	__isl_take MULTI(BASE) *multi, __isl_take APPLY_DOM *domain,
18 	__isl_give DOM *(*fn_domain)(DOM *domain, __isl_take APPLY_DOM *set),
19 	__isl_give DOM *(*fn_params)(DOM *domain, __isl_take APPLY_DOM *set))
20 {
21 	isl_bool is_params;
22 	DOM *multi_dom;
23 
24 	multi_dom = FN(MULTI(BASE),get_explicit_domain)(multi);
25 	is_params = FN(DOM,is_params)(multi_dom);
26 	if (is_params < 0) {
27 		FN(APPLY_DOM,free)(domain);
28 		multi_dom = FN(DOM,free)(multi_dom);
29 	} else if (!is_params) {
30 		multi_dom = fn_domain(multi_dom, domain);
31 	} else {
32 		multi_dom = fn_params(multi_dom, domain);
33 	}
34 	multi = FN(MULTI(BASE),set_explicit_domain)(multi, multi_dom);
35 	return multi;
36 }
37 
38 #include <isl_multi_apply_templ.c>
39