00001 #include "xtended.hh"
00002 #include "Text.hh"
00003 #include <math.h>
00004
00005 #include "floats.hh"
00006
00007 class Atan2Prim : public xtended
00008 {
00009
00010 public:
00011
00012 Atan2Prim() : xtended("atan2") {}
00013
00014 virtual unsigned int arity () { return 2; }
00015
00016 virtual bool needCache () { return true; }
00017
00018 virtual Type infereSigType (const vector<Type>& args)
00019 {
00020 assert (args.size() == 2);
00021 return floatCast(args[0]|args[1]);
00022 }
00023
00024 virtual void sigVisit (Tree sig, sigvisitor* visitor) {}
00025
00026 virtual int infereSigOrder (const vector<int>& args) {
00027 return max(args[0], args[1]);
00028 }
00029
00030
00031 virtual Tree computeSigOutput (const vector<Tree>& args)
00032 {
00033 assert (args.size() == 2);
00034 num n,m;
00035 if (isNum(args[0],n) && isNum(args[1],m)) {
00036 return tree(atan2(double(n), double(m)));
00037 } else {
00038 return tree(symbol(), args[0], args[1]);
00039 }
00040 }
00041
00042 virtual string generateCode (Klass* klass, const vector<string>& args, const vector<Type>& types)
00043 {
00044 assert (args.size() == arity());
00045 assert (types.size() == arity());
00046
00047 return subst("atan2$2($0,$1)", args[0], args[1], isuffix());
00048 }
00049
00050 virtual string generateLateq (Lateq* lateq, const vector<string>& args, const vector<Type>& types)
00051 {
00052 assert (args.size() == arity());
00053 assert (types.size() == arity());
00054
00055 return subst("\\arctan\\frac{$0}{$1}", args[0], args[1]);
00056 }
00057
00058 };
00059
00060
00061 xtended* gAtan2Prim = new Atan2Prim();
00062
00063