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