Merge branch 'master' of https://scm.cri.ensmp.fr/git/Faustine
[Faustine.git] / interpretor / preprocessor / faust-0.9.47mr3 / compiler / extended / floorprim.cpp
1 #include "xtended.hh"
2 #include "Text.hh"
3 #include <math.h>
4
5 #include "floats.hh"
6
7 class FloorPrim : public xtended
8 {
9
10 public:
11
12 FloorPrim() : xtended("floor") {}
13
14 virtual unsigned int arity () { return 1; }
15
16 virtual bool needCache () { return true; }
17
18 virtual Type infereSigType (const vector<Type>& args)
19 {
20 assert (args.size() == arity());
21 return floatCast(args[0]);
22 }
23
24 virtual void sigVisit (Tree sig, sigvisitor* visitor) {}
25
26 virtual int infereSigOrder (const vector<int>& args) {
27 assert (args.size() == arity());
28 return args[0];
29 }
30
31
32 virtual Tree computeSigOutput (const vector<Tree>& args) {
33 num n;
34 assert (args.size() == arity());
35 if (isNum(args[0],n)) {
36 return tree(floor(double(n)));
37 } else {
38 return tree(symbol(), args[0]);
39 }
40 }
41
42 virtual string generateCode (Klass* klass, const vector<string>& args, const vector<Type>& types)
43 {
44 assert (args.size() == arity());
45 assert (types.size() == arity());
46
47 return subst("floor$1($0)", args[0], isuffix());
48 }
49
50 virtual string generateLateq (Lateq* lateq, const vector<string>& args, const vector<Type>& types)
51 {
52 assert (args.size() == arity());
53 assert (types.size() == arity());
54
55 return subst("\\left\\lfloor {$0} \\right\\rfloor", args[0]);
56 }
57
58 };
59
60
61 xtended* gFloorPrim = new FloorPrim();
62
63