e6fb640fc65d1546a24758dc9caaa25f8017956e
[Faustine.git] / interpretor / faust-0.9.47mr3 / compiler / extended / sqrtprim.cpp
1 #include "xtended.hh"
2 #include "Text.hh"
3 #include <math.h>
4
5 #include "floats.hh"
6
7
8 class SqrtPrim : public xtended
9 {
10
11 public:
12
13 SqrtPrim() : xtended("sqrt") {}
14
15 virtual unsigned int arity () { return 1; }
16
17 virtual bool needCache () { return true; }
18
19 virtual Type infereSigType (const vector<Type>& args)
20 {
21 assert (args.size() == 1);
22 Type t = args[0];
23 interval i = t->getInterval();
24 if (i.valid && i.lo >=0) {
25 return castInterval(floatCast(t), interval(sqrt(i.lo), sqrt(i.hi)));
26 } else {
27 return castInterval(floatCast(t), interval());
28 }
29 }
30
31 virtual void sigVisit (Tree sig, sigvisitor* visitor) {}
32
33 virtual int infereSigOrder (const vector<int>& args) {
34 return args[0];
35 }
36
37
38 virtual Tree computeSigOutput (const vector<Tree>& args) {
39 // verifier les simplifications
40 num n;
41 if (isNum(args[0],n)) {
42 return tree(sqrt(double(n)));
43 } else {
44 return tree(symbol(), args[0]);
45 }
46 }
47
48 virtual string generateCode (Klass* klass, const vector<string>& args, const vector<Type>& types)
49 {
50 assert (args.size() == arity());
51 assert (types.size() == arity());
52
53 return subst("sqrt$1($0)", args[0], isuffix());
54 }
55
56 virtual string generateLateq (Lateq* lateq, const vector<string>& args, const vector<Type>& types)
57 {
58 assert (args.size() == arity());
59 assert (types.size() == arity());
60
61 return subst("\\sqrt{$0}", args[0]);
62 }
63
64 };
65
66
67 xtended* gSqrtPrim = new SqrtPrim();
68
69