FAUST compiler  0.9.9.6b8
log10prim.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 
00008 class Log10Prim : public xtended
00009 {
00010 
00011  public:
00012  
00013     Log10Prim() : xtended("log10f") {}
00014     
00015     virtual unsigned int arity () { return 1; }
00016     
00017     virtual bool    needCache ()    { return true; }
00018     
00019     virtual Type    infereSigType (const vector<Type>& args)
00020     {
00021         assert (args.size() == arity());
00022         interval i = args[0]->getInterval();
00023         if (i.valid && (i.lo > 0)) {
00024             return castInterval(floatCast(args[0]), interval(log10(i.lo), log10(i.hi)));
00025         } else {
00026             return floatCast(args[0]);
00027         }
00028     }
00029     
00030     virtual void    sigVisit (Tree sig, sigvisitor* visitor) {} 
00031     
00032     virtual int infereSigOrder (const vector<int>& args) {
00033         assert (args.size() == arity());
00034         return args[0];
00035     }
00036 
00037     
00038     virtual Tree    computeSigOutput (const vector<Tree>& args) {
00039         num n;
00040         assert (args.size() == arity());
00041         if (isNum(args[0],n)) {
00042             return tree(log10(double(n)));
00043         } else {
00044             return tree(symbol(), args[0]);
00045         }
00046     }
00047         
00048     virtual string  generateCode (Klass* klass, const vector<string>& args, const vector<Type>& types)
00049     {
00050         assert (args.size() == arity());
00051         assert (types.size() == arity());
00052         
00053         return subst("log10$1($0)", args[0], isuffix());
00054     }
00055     
00056     virtual string  generateLateq (Lateq* lateq, const vector<string>& args, const vector<Type>& types)
00057     {
00058         assert (args.size() == arity());
00059         assert (types.size() == arity());
00060         
00061         return subst("\\log_{10}\\left( $0 \\right)", args[0]);
00062     }
00063     
00064 };
00065 
00066 
00067 xtended* gLog10Prim = new Log10Prim();
00068 
00069