00001 #include "xtended.hh"
00002 #include "Text.hh"
00003 #include <math.h>
00004 #include "sigtyperules.hh"
00005
00006 #include "floats.hh"
00007
00008 class AbsPrim : public xtended
00009 {
00010
00011 public:
00012
00013 AbsPrim() : xtended("abs") {}
00014
00015 virtual unsigned int arity () { return 1; }
00016
00017 virtual bool needCache () { return true; }
00018
00019 virtual Type infereSigType (const vector<Type>& types)
00020 {
00021 assert (types.size() == arity());
00022 Type t = types[0];
00023 return castInterval(t, abs(t->getInterval()));
00024 return t;
00025 }
00026
00027 virtual void sigVisit (Tree sig, sigvisitor* visitor) {}
00028
00029 virtual int infereSigOrder (const vector<int>& args)
00030 {
00031 assert (args.size() == arity());
00032 return args[0];
00033 }
00034
00035
00036 virtual Tree computeSigOutput (const vector<Tree>& args)
00037 {
00038 double f; int i;
00039
00040 assert (args.size() == arity());
00041
00042 if (isDouble(args[0]->node(),&f)) {
00043 return tree(fabs(f));
00044
00045 } else if (isInt(args[0]->node(),&i)) {
00046 return tree(abs(i));
00047
00048 } else {
00049 return tree(symbol(), args[0]);
00050 }
00051 }
00052
00053 virtual string generateCode (Klass* klass, const vector<string>& args, const vector<Type>& types)
00054 {
00055 assert (args.size() == arity());
00056 assert (types.size() == arity());
00057
00058 Type t = infereSigType(types);
00059 if (t->nature() == kReal) {
00060 return subst("fabs$1($0)", args[0], isuffix());
00061 } else {
00062 return subst("abs($0)", args[0]);
00063 }
00064 }
00065
00066 virtual string generateLateq (Lateq* lateq, const vector<string>& args, const vector<Type>& types)
00067 {
00068 assert (args.size() == arity());
00069 assert (types.size() == arity());
00070
00071 Type t = infereSigType(types);
00072 return subst("\\left\\lvert{$0}\\right\\rvert", args[0]);
00073 }
00074 };
00075
00076
00077 xtended* gAbsPrim = new AbsPrim();
00078
00079