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 */
16static __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