Merge branch 'master' of https://scm.cri.ensmp.fr/git/Faustine
[Faustine.git] / interpretor / preprocessor / faust-0.9.47mr3 / compiler / extended / log10prim.cpp
1 #include "xtended.hh"
2 #include "Text.hh"
3 #include <math.h>
4
5 #include "floats.hh"
6
7
8 class Log10Prim : public xtended
9 {
10
11 public:
12
13 Log10Prim() : xtended("logten") {}
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() == arity());
22 interval i = args[0]->getInterval();
23 if (i.valid && (i.lo > 0)) {
24 return castInterval(floatCast(args[0]), interval(log10(i.lo), log10(i.hi)));
25 } else {
26 return floatCast(args[0]);
27 }
28 }
29
30 virtual void sigVisit (Tree sig, sigvisitor* visitor) {}
31
32 virtual int infereSigOrder (const vector<int>& args) {
33 assert (args.size() == arity());
34 return args[0];
35 }
36
37
38 virtual Tree computeSigOutput (const vector<Tree>& args) {
39 num n;
40 assert (args.size() == arity());
41 if (isNum(args[0],n)) {
42 return tree(log10(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("log10$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("\\log_{10}\\left( $0 \\right)", args[0]);
62 }
63
64 };
65
66
67 xtended* gLog10Prim = new Log10Prim();
68
69