Home | History | Annotate | Line # | Download | only in dist
      1  1.1  mrg /*
      2  1.1  mrg  * Copyright 2011      Sven Verdoolaege
      3  1.1  mrg  * Copyright 2012-2013 Ecole Normale Superieure
      4  1.1  mrg  *
      5  1.1  mrg  * Use of this software is governed by the MIT license
      6  1.1  mrg  *
      7  1.1  mrg  * Written by Sven Verdoolaege,
      8  1.1  mrg  * Ecole Normale Superieure, 45 rue dUlm, 75230 Paris, France
      9  1.1  mrg  */
     10  1.1  mrg 
     11  1.1  mrg #include <isl_multi_macro.h>
     12  1.1  mrg 
     13  1.1  mrg /* Transform the elements of "multi" by applying "fn" to them
     14  1.1  mrg  * with extra argument "set".
     15  1.1  mrg  * If "multi" has an explicit domain, then apply "fn_domain" or
     16  1.1  mrg  * "fn_params" to this explicit domain instead.
     17  1.1  mrg  * In particular, if the explicit domain is a parameter set,
     18  1.1  mrg  * then apply "fn_params".  Otherwise, apply "fn_domain".
     19  1.1  mrg  */
     20  1.1  mrg static __isl_give MULTI(BASE) *FN(FN(MULTI(BASE),apply),APPLY_DOMBASE)(
     21  1.1  mrg 	__isl_take MULTI(BASE) *multi, __isl_take APPLY_DOM *set,
     22  1.1  mrg 	__isl_give EL *(*fn)(EL *el, __isl_take APPLY_DOM *set),
     23  1.1  mrg 	__isl_give DOM *(*fn_domain)(DOM *domain, __isl_take APPLY_DOM *set),
     24  1.1  mrg 	__isl_give DOM *(*fn_params)(DOM *domain, __isl_take APPLY_DOM *set))
     25  1.1  mrg {
     26  1.1  mrg 	isl_size n;
     27  1.1  mrg 	int i;
     28  1.1  mrg 
     29  1.1  mrg 	FN(FN(MULTI(BASE),align_params),APPLY_DOMBASE)(&multi, &set);
     30  1.1  mrg 
     31  1.1  mrg 	if (FN(MULTI(BASE),has_explicit_domain)(multi))
     32  1.1  mrg 		return FN(FN(MULTI(BASE),apply_domain),APPLY_DOMBASE)(multi,
     33  1.1  mrg 						set, fn_domain, fn_params);
     34  1.1  mrg 
     35  1.1  mrg 	n = FN(MULTI(BASE),size)(multi);
     36  1.1  mrg 	if (n < 0 || !set)
     37  1.1  mrg 		goto error;
     38  1.1  mrg 
     39  1.1  mrg 	for (i = 0; i < n; ++i) {
     40  1.1  mrg 		EL *el;
     41  1.1  mrg 
     42  1.1  mrg 		el = FN(MULTI(BASE),take_at)(multi, i);
     43  1.1  mrg 		el = fn(el, FN(APPLY_DOM,copy)(set));
     44  1.1  mrg 		multi = FN(MULTI(BASE),restore_at)(multi, i, el);
     45  1.1  mrg 	}
     46  1.1  mrg 
     47  1.1  mrg 	FN(APPLY_DOM,free)(set);
     48  1.1  mrg 	return multi;
     49  1.1  mrg error:
     50  1.1  mrg 	FN(APPLY_DOM,free)(set);
     51  1.1  mrg 	FN(MULTI(BASE),free)(multi);
     52  1.1  mrg 	return NULL;
     53  1.1  mrg }
     54