00001 #include "xtended.hh" 00002 #include "Text.hh" 00003 #include <math.h> 00004 00005 00006 class Log10Prim : public xtended 00007 { 00008 00009 public: 00010 00011 Log10Prim() : xtended("log10f") {} 00012 00013 virtual unsigned int arity () { return 1; } 00014 00015 virtual bool needCache () { return true; } 00016 00017 virtual Type infereSigType (const vector<Type>& args) 00018 { 00019 assert (args.size() == arity()); 00020 interval i = args[0]->getInterval(); 00021 if (i.valid && (i.lo > 0)) { 00022 return castInterval(floatCast(args[0]), interval(log10(i.lo), log10(i.hi))); 00023 } else { 00024 return floatCast(args[0]); 00025 } 00026 } 00027 00028 virtual void sigVisit (Tree sig, sigvisitor* visitor) {} 00029 00030 virtual int infereSigOrder (const vector<int>& args) { 00031 assert (args.size() == arity()); 00032 return args[0]; 00033 } 00034 00035 00036 virtual Tree computeSigOutput (const vector<Tree>& args) { 00037 num n; 00038 assert (args.size() == arity()); 00039 if (isNum(args[0],n)) { 00040 return tree(log10f(float(n))); 00041 } else { 00042 return tree(symbol(), args[0]); 00043 } 00044 } 00045 00046 virtual string generateCode (Klass* klass, const vector<string>& args, const vector<Type>& types) 00047 { 00048 assert (args.size() == arity()); 00049 return subst("log10f($0)", args[0]); 00050 } 00051 00052 }; 00053 00054 00055 xtended* gLog10Prim = new Log10Prim(); 00056 00057