mirror of
https://review.haiku-os.org/buildtools
synced 2024-11-23 07:18:49 +01:00
c8db99d323
GCC had a horrible .gitignore, untracked files were not applied
87 lines
2.0 KiB
C
87 lines
2.0 KiB
C
/*
|
|
* Copyright 2010 INRIA Saclay
|
|
* Copyright 2013 Ecole Normale Superieure
|
|
*
|
|
* Use of this software is governed by the MIT license
|
|
*
|
|
* Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
|
|
* Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
|
|
* 91893 Orsay, France
|
|
* and Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France
|
|
*/
|
|
|
|
#include <isl/val.h>
|
|
#include <isl_space_private.h>
|
|
#include <isl_point_private.h>
|
|
|
|
#include <isl_pw_macro.h>
|
|
|
|
/* Evaluate "pw" in the void point "pnt".
|
|
* In particular, return the value NaN.
|
|
*/
|
|
static __isl_give isl_val *FN(PW,eval_void)(__isl_take PW *pw,
|
|
__isl_take isl_point *pnt)
|
|
{
|
|
isl_ctx *ctx;
|
|
|
|
ctx = isl_point_get_ctx(pnt);
|
|
FN(PW,free)(pw);
|
|
isl_point_free(pnt);
|
|
return isl_val_nan(ctx);
|
|
}
|
|
|
|
/* Evaluate the piecewise function "pw" in "pnt".
|
|
* If the point is void, then return NaN.
|
|
* If the point lies outside the domain of "pw", then return 0 or NaN
|
|
* depending on whether 0 is the default value for this type of function.
|
|
*/
|
|
__isl_give isl_val *FN(PW,eval)(__isl_take PW *pw, __isl_take isl_point *pnt)
|
|
{
|
|
int i;
|
|
isl_bool is_void;
|
|
isl_bool found;
|
|
isl_ctx *ctx;
|
|
isl_bool ok;
|
|
isl_space *pnt_space, *pw_space;
|
|
isl_val *v;
|
|
|
|
pnt_space = isl_point_peek_space(pnt);
|
|
pw_space = FN(PW,peek_space)(pw);
|
|
ok = isl_space_is_domain_internal(pnt_space, pw_space);
|
|
if (ok < 0)
|
|
goto error;
|
|
ctx = isl_point_get_ctx(pnt);
|
|
if (!ok)
|
|
isl_die(ctx, isl_error_invalid,
|
|
"incompatible spaces", goto error);
|
|
is_void = isl_point_is_void(pnt);
|
|
if (is_void < 0)
|
|
goto error;
|
|
if (is_void)
|
|
return FN(PW,eval_void)(pw, pnt);
|
|
|
|
found = isl_bool_false;
|
|
for (i = 0; i < pw->n; ++i) {
|
|
found = isl_set_contains_point(pw->p[i].set, pnt);
|
|
if (found < 0)
|
|
goto error;
|
|
if (found)
|
|
break;
|
|
}
|
|
if (found) {
|
|
v = FN(EL,eval)(FN(EL,copy)(pw->p[i].FIELD),
|
|
isl_point_copy(pnt));
|
|
} else if (DEFAULT_IS_ZERO) {
|
|
v = isl_val_zero(ctx);
|
|
} else {
|
|
v = isl_val_nan(ctx);
|
|
}
|
|
FN(PW,free)(pw);
|
|
isl_point_free(pnt);
|
|
return v;
|
|
error:
|
|
FN(PW,free)(pw);
|
|
isl_point_free(pnt);
|
|
return NULL;
|
|
}
|