X-Git-Url: https://scm.cri.ensmp.fr/git/Faustine.git/blobdiff_plain/c7f552fd8888da2f0d8cfb228fe0f28d3df3a12c..b4b6f2ea75b9f0f3ca918f5b84016610bf7a4d4f:/interpretor/preprocessor/faust-0.9.47mr3/compiler/headers/interval.hh diff --git a/interpretor/preprocessor/faust-0.9.47mr3/compiler/headers/interval.hh b/interpretor/preprocessor/faust-0.9.47mr3/compiler/headers/interval.hh new file mode 100644 index 0000000..eb599f8 --- /dev/null +++ b/interpretor/preprocessor/faust-0.9.47mr3/compiler/headers/interval.hh @@ -0,0 +1,228 @@ +/************************************************************************ + ************************************************************************ + FAUST compiler + Copyright (C) 2003-2004 GRAME, Centre National de Creation Musicale + --------------------------------------------------------------------- + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + ************************************************************************ + ************************************************************************/ + + + +#ifndef __signals_intervals__ +#define __signals_intervals__ + +#include +#include + +#ifdef WIN32 +inline double log2(double e) { return log(e)/log(double(2)); } +#endif + +using namespace std; + +struct interval +{ + bool valid; ///< true if it is a valid interval + double lo; ///< minimal value + double hi; ///< maximal value + + interval () : valid(false), lo(-HUGE_VAL), hi(HUGE_VAL) {} + interval (double n) : valid(true), lo(n), hi(n) {} + interval (double n, double m) : valid(true), lo(min(n,m)), hi(max(n,m)) {} + interval (const interval& r) : valid(r.valid), lo(r.lo), hi(r.hi) {} + + bool isconst() { return valid & (lo == hi); } +}; + +inline ostream& operator<<(ostream& dst, const interval& i) +{ + if (i.valid) { + return dst << "interval(" << i.lo << ", " << i.hi << ")"; + } else { + return dst << "interval()"; + } +} + +inline double min(double x, double y) { return (xy) ? x:y; } +inline double min4(double a, double b, double c, double d) { return min(min(a,b),min(c,d)); } +inline double max4(double a, double b, double c, double d) { return max(max(a,b),max(c,d)); } + +inline interval reunion(const interval& x, const interval& y) +{ + if (x.valid & y.valid) { + return interval(min(x.lo,y.lo), max(x.hi,y.hi)); + } else { + return interval(); + } +} + + +inline interval operator+(const interval& x, const interval& y) +{ + return (x.valid&y.valid) ? interval(x.lo+y.lo, x.hi+y.hi) : interval(); +} + +inline interval operator-(const interval& x, const interval& y) +{ + return (x.valid & y.valid) ? interval(x.lo-y.hi, x.hi-y.lo) : interval();; +} + +inline interval operator*(const interval& x, const interval& y) +{ + if (x.valid&y.valid) { + double a=x.lo*y.lo; + double b=x.lo*y.hi; + double c=x.hi*y.lo; + double d=x.hi*y.hi; + return interval(min4(a,b,c,d), max4(a,b,c,d)); + } else { + return interval(); + } +} + +inline interval operator/(const interval& x, const interval& y) +{ + return (x.valid && y.valid && (y.lo > 0 | y.hi < 0)) + ? x * interval(1/y.hi,1/y.lo) + : interval(); +} + +inline interval operator%(const interval& x, const interval& y) +{ + return (x.valid && y.valid && x.lo >= 0 && y.lo > 0) + ? interval(0,y.hi) + : interval(); +} + +/** + * Convert a number 1bbb..b into a bit mask 1111..1 of same width + */ +inline int bitmask (double x) { + int v = int(x); + for (int i=1; i<32; i*=2) { v |= v>>i; } + return v; +} + +//----------------------booleans&bits-------------------------------------- + +inline interval operator&(const interval& x, const interval& y) +{ + if (x.valid && y.valid) { + if (x.lo >= 0 & y.lo >= 0) { + return interval(0, bitmask(x.hi) & bitmask(y.hi)); + } else if (y.lo >= 0) { + return interval(0, bitmask(y.hi)); + } else if (x.lo >= 0) { + return interval(0, bitmask(y.hi)); + } else { + return interval(); + } + } else if (x.valid & x.lo >= 0) { + return interval(0, bitmask(x.hi)); + } else if (y.valid & y.lo >= 0) { + return interval(0, bitmask(y.hi)); + } else { + return interval(); + } +} + +inline interval operator|(const interval& x, const interval& y) +{ + if (x.valid && y.valid && x.lo >= 0 && y.lo >= 0) { + return interval(0, bitmask(x.hi) | bitmask(y.hi)); + } else { + return interval(); + } +} + +inline interval operator^(const interval&, const interval&) +{ + return interval(); +} + +inline interval operator<<(const interval&, const interval&) +{ + return interval(); +} + +inline interval operator>>(const interval&, const interval&) +{ + return interval(); +} + +// ---------------------comparaisons------------------------------ +// note : les comparaisons ne portent pas sur les intervals +// mais l'interval des comparaisons de signaux + +inline interval operator<(const interval&, const interval&) +{ + return interval(0,1); +} + +inline interval operator<=(const interval&, const interval&) +{ + return interval(0,1); +} + +inline interval operator>(const interval&, const interval&) +{ + return interval(0,1); +} + +inline interval operator>=(const interval&, const interval&) +{ + return interval(0,1); +} + +inline interval operator==(const interval&, const interval&) +{ + return interval(0,1); +} + +inline interval operator!=(const interval&, const interval&) +{ + return interval(0,1); +} + +//----------------------------------------------------------------------- + +inline interval min(const interval& x, const interval& y) +{ + return interval(min(x.lo,y.lo), min(x.hi,y.hi)); +} + +inline interval max(const interval& x, const interval& y) +{ + return interval(max(x.lo,y.lo), max(x.hi,y.hi)); +} + +inline interval abs(const interval& x) +{ + if (x.valid) { + if (x.lo >= 0) { + return x; + } else if (x.hi < 0) { + return interval(fabs(x.hi), fabs(x.lo)); + } else { + return interval(0, max(fabs(x.lo), x.hi)); + } + } else { + return x; + } +} + +#endif