Blame isl-0.16.1/isl_multi_apply_templ.c

Packit fb9d21
/*
Packit fb9d21
 * Copyright 2011      Sven Verdoolaege
Packit fb9d21
 * Copyright 2012-2013 Ecole Normale Superieure
Packit fb9d21
 *
Packit fb9d21
 * Use of this software is governed by the MIT license
Packit fb9d21
 *
Packit fb9d21
 * Written by Sven Verdoolaege,
Packit fb9d21
 * Ecole Normale Superieure, 45 rue d’Ulm, 75230 Paris, France
Packit fb9d21
 */
Packit fb9d21
Packit fb9d21
#include <isl_multi_macro.h>
Packit fb9d21
Packit fb9d21
/* Transform the elements of "multi" by applying "fn" to them
Packit fb9d21
 * with extra argument "set".
Packit fb9d21
 *
Packit fb9d21
 * The parameters of "multi" and "set" are assumed to have been aligned.
Packit fb9d21
 */
Packit fb9d21
__isl_give MULTI(BASE) *FN(FN(MULTI(BASE),apply_aligned),APPLY_DOMBASE)(
Packit fb9d21
	__isl_take MULTI(BASE) *multi, __isl_take APPLY_DOM *set,
Packit fb9d21
	__isl_give EL *(*fn)(EL *el, __isl_take APPLY_DOM *set))
Packit fb9d21
{
Packit fb9d21
	int i;
Packit fb9d21
Packit fb9d21
	if (!multi || !set)
Packit fb9d21
		goto error;
Packit fb9d21
Packit fb9d21
	if (multi->n == 0) {
Packit fb9d21
		FN(APPLY_DOM,free)(set);
Packit fb9d21
		return multi;
Packit fb9d21
	}
Packit fb9d21
Packit fb9d21
	multi = FN(MULTI(BASE),cow)(multi);
Packit fb9d21
	if (!multi)
Packit fb9d21
		goto error;
Packit fb9d21
Packit fb9d21
	for (i = 0; i < multi->n; ++i) {
Packit fb9d21
		multi->p[i] = fn(multi->p[i], FN(APPLY_DOM,copy)(set));
Packit fb9d21
		if (!multi->p[i])
Packit fb9d21
			goto error;
Packit fb9d21
	}
Packit fb9d21
Packit fb9d21
	FN(APPLY_DOM,free)(set);
Packit fb9d21
	return multi;
Packit fb9d21
error:
Packit fb9d21
	FN(APPLY_DOM,free)(set);
Packit fb9d21
	FN(MULTI(BASE),free)(multi);
Packit fb9d21
	return NULL;
Packit fb9d21
}
Packit fb9d21
Packit fb9d21
/* Transform the elements of "multi" by applying "fn" to them
Packit fb9d21
 * with extra argument "set".
Packit fb9d21
 *
Packit fb9d21
 * Align the parameters if needed and call apply_set_aligned.
Packit fb9d21
 */
Packit fb9d21
static __isl_give MULTI(BASE) *FN(FN(MULTI(BASE),apply),APPLY_DOMBASE)(
Packit fb9d21
	__isl_take MULTI(BASE) *multi, __isl_take APPLY_DOM *set,
Packit fb9d21
	__isl_give EL *(*fn)(EL *el, __isl_take APPLY_DOM *set))
Packit fb9d21
{
Packit fb9d21
	isl_ctx *ctx;
Packit fb9d21
Packit fb9d21
	if (!multi || !set)
Packit fb9d21
		goto error;
Packit fb9d21
Packit fb9d21
	if (isl_space_match(multi->space, isl_dim_param,
Packit fb9d21
			    set->dim, isl_dim_param))
Packit fb9d21
		return FN(FN(MULTI(BASE),apply_aligned),APPLY_DOMBASE)(multi,
Packit fb9d21
								    set, fn);
Packit fb9d21
	ctx = FN(MULTI(BASE),get_ctx)(multi);
Packit fb9d21
	if (!isl_space_has_named_params(multi->space) ||
Packit fb9d21
	    !isl_space_has_named_params(set->dim))
Packit fb9d21
		isl_die(ctx, isl_error_invalid,
Packit fb9d21
			"unaligned unnamed parameters", goto error);
Packit fb9d21
	multi = FN(MULTI(BASE),align_params)(multi,
Packit fb9d21
						FN(APPLY_DOM,get_space)(set));
Packit fb9d21
	set = FN(APPLY_DOM,align_params)(set, FN(MULTI(BASE),get_space)(multi));
Packit fb9d21
	return FN(FN(MULTI(BASE),apply_aligned),APPLY_DOMBASE)(multi, set, fn);
Packit fb9d21
error:
Packit fb9d21
	FN(MULTI(BASE),free)(multi);
Packit fb9d21
	FN(APPLY_DOM,free)(set);
Packit fb9d21
	return NULL;
Packit fb9d21
}