brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.6 KiB · a7a3913 Raw
74 lines · c
1/*2 * Copyright 2013      Ecole Normale Superieure3 *4 * Use of this software is governed by the MIT license5 *6 * Written by Sven Verdoolaege,7 * Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France8 */9 10/* Apply "fn" to each of the elements of "multi" with as second argument "v".11 */12static __isl_give MULTI(BASE) *FN(MULTI(BASE),fn_val)(13	__isl_take MULTI(BASE) *multi,14	__isl_give EL *(*fn)(__isl_take EL *el, __isl_take isl_val *v),15	 __isl_take isl_val *v)16{17	isl_size n;18	int i;19 20	n = FN(MULTI(BASE),size)(multi);21	if (n < 0 || !v)22		goto error;23 24	for (i = 0; i < n; ++i) {25		EL *el;26 27		el = FN(MULTI(BASE),take_at)(multi, i);28		el = fn(el, isl_val_copy(v));29		multi = FN(MULTI(BASE),restore_at)(multi, i, el);30	}31 32	isl_val_free(v);33	return multi;34error:35	isl_val_free(v);36	FN(MULTI(BASE),free)(multi);37	return NULL;38}39 40#undef TYPE41#define TYPE	MULTI(BASE)42#include "isl_type_check_match_range_multi_val.c"43 44/* Elementwise apply "fn" to "multi" and "mv".45 */46static __isl_give MULTI(BASE) *FN(MULTI(BASE),fn_multi_val)(47	__isl_take MULTI(BASE) *multi,48	__isl_give EL *(*fn)(__isl_take EL *el, __isl_take isl_val *v),49	__isl_take isl_multi_val *mv)50{51	isl_size n;52	int i;53 54	n = FN(MULTI(BASE),size)(multi);55	if (n < 0 || FN(MULTI(BASE),check_match_range_multi_val)(multi, mv) < 0)56		goto error;57 58	for (i = 0; i < n; ++i) {59		isl_val *v;60		EL *el;61 62		v = isl_multi_val_get_val(mv, i);63		el = FN(MULTI(BASE),take_at)(multi, i);64		el = fn(el, v);65		multi = FN(MULTI(BASE),restore_at)(multi, i, el);66	}67 68	isl_multi_val_free(mv);69	return multi;70error:71	isl_multi_val_free(mv);72	return FN(MULTI(BASE),free)(multi);73}74