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