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