X-Git-Url: https://scm.cri.ensmp.fr/git/Faustine.git/blobdiff_plain/1059e1cc0c2ecfa237406949aa26155b6a5b9154..66f23d4fabf89ad09adbd4dfc15ac6b5b2b7da83:/interpreter/preprocessor/faust-0.9.47mr3/compiler/extended/maxprim.cpp diff --git a/interpreter/preprocessor/faust-0.9.47mr3/compiler/extended/maxprim.cpp b/interpreter/preprocessor/faust-0.9.47mr3/compiler/extended/maxprim.cpp new file mode 100644 index 0000000..9c58ca7 --- /dev/null +++ b/interpreter/preprocessor/faust-0.9.47mr3/compiler/extended/maxprim.cpp @@ -0,0 +1,95 @@ +#include "xtended.hh" +#include "Text.hh" +#include +#include "sigtyperules.hh" + +#include "floats.hh" + +class MaxPrim : public xtended +{ + + public: + + MaxPrim() : xtended("max") {} + + virtual unsigned int arity () { return 2; } + + virtual bool needCache () { return true; } + + virtual Type infereSigType (const vector& types) + { + assert (types.size() == arity()); + interval i = types[0]->getInterval(); + interval j = types[1]->getInterval(); + return castInterval(types[0]|types[1], max(i,j)); + } + + virtual void sigVisit (Tree sig, sigvisitor* visitor) {} + + virtual int infereSigOrder (const vector& args) + { + assert (args.size() == arity()); + return max(args[0], args[1]); + } + + + virtual Tree computeSigOutput (const vector& args) + { + double f,g; int i,j; + + assert (args.size() == arity()); + + if (isDouble(args[0]->node(),&f)) { + + if (isDouble(args[1]->node(), &g)) { + return tree(max(f, g)); + } else if (isInt(args[1]->node(),&j)) { + return tree(max(f, double(j))); + } else { + return tree(symbol(), args[0], args[1]); + } + + } else if (isInt(args[0]->node(),&i)) { + + if (isDouble(args[1]->node(), &g)) { + return tree(max(double(i), g)); + } else if (isInt(args[1]->node(),&j)) { + return tree(max(i, j)); + } else { + return tree(symbol(), args[0], args[1]); + } + + } else { + + return tree(symbol(), args[0], args[1]); + } + } + + virtual string generateCode (Klass* klass, const vector& args, const vector& types) + { + assert (args.size() == arity()); + assert (types.size() == arity()); + + Type t = infereSigType(types); + if (t->nature() == kReal) { + return subst("max($0, $1)", args[0], args[1]); + } else { + return subst("max($0, $1)", args[0], args[1]); + } + } + + virtual string generateLateq (Lateq* lateq, const vector& args, const vector& types) + { + assert (args.size() == arity()); + assert (types.size() == arity()); + + Type t = infereSigType(types); + return subst("\\max\\left( $0, $1 \\right)", args[0], args[1]); + } + +}; + + +xtended* gMaxPrim = new MaxPrim(); + +