FAUST compiler  0.9.9.6b8
logprim.cpp
Go to the documentation of this file.
00001 #include "xtended.hh"
00002 #include "Text.hh"
00003 #include <math.h>
00004 
00005 #include "floats.hh"
00006 
00007 class LogPrim : public xtended
00008 {
00009 
00010  public:
00011  
00012     LogPrim() : xtended("log") {}
00013     
00014     virtual unsigned int arity () { return 1; }
00015     
00016     virtual bool    needCache ()    { return true; }
00017     
00018     virtual Type    infereSigType (const vector<Type>& args)
00019     {
00020         assert (args.size() == arity());
00021         interval i = args[0]->getInterval();
00022         if (i.valid & i.lo>0) {
00023             return castInterval(floatCast(args[0]), interval(log(i.lo), log(i.hi)));
00024         } else {
00025             return floatCast(args[0]);
00026         }
00027     }
00028     
00029     virtual void    sigVisit (Tree sig, sigvisitor* visitor) {} 
00030     
00031     virtual int infereSigOrder (const vector<int>& args) {
00032         assert (args.size() == arity());
00033         return args[0];
00034     }
00035 
00036     
00037     virtual Tree    computeSigOutput (const vector<Tree>& args) {
00038         num n;
00039         assert (args.size() == arity());
00040         if (isNum(args[0],n)) {
00041             return tree(log(double(n)));
00042         } else {
00043             return tree(symbol(), args[0]);
00044         }
00045     }
00046         
00047     virtual string  generateCode (Klass* klass, const vector<string>& args, const vector<Type>& types)
00048     {
00049         assert (args.size() == arity());
00050         assert (types.size() == arity());
00051         
00052         return subst("log$1($0)", args[0], isuffix());
00053     }
00054     
00055     virtual string  generateLateq (Lateq* lateq, const vector<string>& args, const vector<Type>& types)
00056     {
00057         assert (args.size() == arity());
00058         assert (types.size() == arity());
00059         
00060         return subst("\\ln\\left( $0 \\right)", args[0]);
00061     }
00062     
00063 };
00064 
00065 
00066 xtended* gLogPrim = new LogPrim();
00067 
00068