X-Git-Url: https://scm.cri.ensmp.fr/git/Faustine.git/blobdiff_plain/1059e1cc0c2ecfa237406949aa26155b6a5b9154..66f23d4fabf89ad09adbd4dfc15ac6b5b2b7da83:/interpreter/preprocessor/faust-0.9.47mr3/compiler/extended/powprim.cpp diff --git a/interpreter/preprocessor/faust-0.9.47mr3/compiler/extended/powprim.cpp b/interpreter/preprocessor/faust-0.9.47mr3/compiler/extended/powprim.cpp new file mode 100644 index 0000000..bf81b71 --- /dev/null +++ b/interpreter/preprocessor/faust-0.9.47mr3/compiler/extended/powprim.cpp @@ -0,0 +1,74 @@ +#include "xtended.hh" +#include "Text.hh" +#include + +#include "floats.hh" + +class PowPrim : public xtended +{ + + public: + + PowPrim() : xtended("powf") {} + + virtual unsigned int arity () { return 2; } + + virtual bool needCache () { return true; } + + virtual Type infereSigType (const vector& args) + { + assert (args.size() == arity()); + //return castInterval(floatCast(args[0]|args[1]), interval()); // temporary !!! + return castInterval(args[0]|args[1], interval()); // temporary !!! + } + + 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) { + num n,m; + assert (args.size() == arity()); + if (isNum(args[0],n) & isNum(args[1],m)) { + return tree(pow(double(n), double(m))); + } 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()); + + if (types[1]->nature() == kInt) { + klass->rememberNeedPowerDef(); + return subst("faustpower<$1>($0)", args[0], args[1]); + } else { + return subst("pow$2($0,$1)", args[0], args[1], isuffix()); + } + } + + virtual string generateLateq (Lateq* lateq, const vector& args, const vector& types) + { + assert (args.size() == arity()); + assert (types.size() == arity()); + + return subst("{$0}^{$1}", args[0], args[1]); + } + + // power is now used as an infix binary operator, we return true to + // indicate that we want ^(n) to be equivalent to _^n + virtual bool isSpecialInfix() { return true; } + + +}; + + +xtended* gPowPrim = new PowPrim(); + +