FAUST compiler  0.9.9.6b8
rintprim.cpp
Go to the documentation of this file.
00001 #include "xtended.hh"
00002 #include "compatibility.hh"
00003 #include "Text.hh"
00004 #include <math.h>
00005 
00006 #include "floats.hh"
00007 
00008 #if defined(WIN32) && ! defined(__MINGW32__) 
00009 /* missing on Windows : see http://bugs.mysql.com/bug.php?id=15936 */
00010 inline double rint(double nr)
00011 {
00012     double f = floor(nr);
00013     double c = ceil(nr);
00014     return (((c -nr) >= (nr - f)) ? f : c);
00015 }
00016 #endif
00017 
00018 class RintPrim : public xtended
00019 {
00020 
00021  public:
00022  
00023     RintPrim() : xtended("rint") {}
00024     
00025     virtual unsigned int arity () { return 1; }
00026     
00027     virtual bool    needCache ()    { return true; }
00028     
00029     virtual Type    infereSigType (const vector<Type>& args)
00030     {
00031         assert (args.size() == arity());
00032         interval i = args[0]->getInterval();
00033         if (i.valid) {
00034             return castInterval(floatCast(args[0]), interval(rint(i.lo), rint(i.hi)));
00035         } else {
00036             return floatCast(args[0]);
00037         }
00038     }
00039     
00040     virtual void    sigVisit (Tree sig, sigvisitor* visitor) {} 
00041     
00042     virtual int infereSigOrder (const vector<int>& args) {
00043         assert (args.size() == arity());
00044         return args[0];
00045     }
00046 
00047     
00048     virtual Tree    computeSigOutput (const vector<Tree>& args) {
00049         num n;
00050         assert (args.size() == arity());
00051         if (isNum(args[0],n)) {
00052             return tree(rint(double(n)));
00053         } else {
00054             return tree(symbol(), args[0]);
00055         }
00056     }
00057         
00058     virtual string  generateCode (Klass* klass, const vector<string>& args, const vector<Type>& types)
00059     {
00060         assert (args.size() == arity());
00061         assert (types.size() == arity());
00062 
00063         return subst("rint$1($0)", args[0], isuffix());
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         return subst("\\left[ {$0} \\right]", args[0]);
00072     }
00073     
00074 };
00075 
00076 
00077 xtended* gRintPrim = new RintPrim();
00078 
00079