Analysis: infer when a refcount is required and add colors in DebugVisitor
[scilab.git] / scilab / modules / ast / includes / analysis / data / MacroDef.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2014 - Scilab Enterprises - Calixte DENIZET
4  *
5  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #ifndef __MACRO_DEF_HXX__
14 #define __MACRO_DEF_HXX__
15
16 #include <algorithm>
17 #include <list>
18 #include <string>
19 #include <vector>
20
21 #include "alldec.hxx"
22 #include "allexp.hxx"
23 #include "allvar.hxx"
24 #include "alltypes.hxx"
25 #include "symbol.hxx"
26 #include "tools.hxx"
27
28 namespace analysis
29 {
30
31 class MacroDef
32 {
33
34 protected:
35
36     const unsigned int lhs;
37     const unsigned int rhs;
38     ast::Exp * const original;
39
40     tools::SymbolOrdSet globals;
41
42 public:
43
44     MacroDef(const unsigned int _lhs, const unsigned int _rhs, ast::Exp * _original) : lhs(_lhs), rhs(_rhs), original(_original) { }
45     virtual ~MacroDef() { }
46
47     virtual ast::SeqExp & getBody() = 0;
48     virtual const ast::SeqExp & getOriginalBody() = 0;
49     virtual const std::wstring & getName() = 0;
50     virtual std::vector<symbol::Symbol> getIn() = 0;
51     virtual std::vector<symbol::Symbol> getOut() = 0;
52     virtual MacroDef * clone() const = 0;
53
54     inline unsigned int getLhs() const
55     {
56         return lhs;
57     }
58
59     inline unsigned int getRhs() const
60     {
61         return rhs;
62     }
63
64     inline ast::Exp * getOriginal() const
65     {
66         return original;
67     }
68
69     inline tools::SymbolOrdSet & getGlobals()
70     {
71         return globals;
72     }
73
74     inline const tools::SymbolOrdSet & getGlobals() const
75     {
76         return globals;
77     }
78
79     inline static std::vector<symbol::Symbol> asVector(const ast::exps_t * const l)
80     {
81         std::vector<symbol::Symbol> _l;
82         _l.reserve(l->size());
83         for (const auto var : *l)
84         {
85             _l.emplace_back(static_cast<ast::SimpleVar * const>(var)->getSymbol());
86         }
87         return _l;
88     }
89
90     inline static std::vector<symbol::Symbol> asVector(const std::list<symbol::Variable *> * const l)
91     {
92         std::vector<symbol::Symbol> _l;
93         _l.reserve(l->size());
94         for (const auto var : *l)
95         {
96             _l.emplace_back(var->getSymbol());
97         }
98         return _l;
99     }
100 };
101
102 class ExistingMacroDef : public MacroDef
103 {
104     const std::wstring name;
105     ast::SeqExp * se;
106     std::vector<symbol::Symbol> inputs;
107     std::vector<symbol::Symbol> outputs;
108
109 public:
110
111     ExistingMacroDef(types::Macro & _macro);
112     ExistingMacroDef(const ExistingMacroDef & emd);
113
114     ~ExistingMacroDef()
115     {
116         delete se;
117     }
118
119     ast::SeqExp & getBody();
120     const ast::SeqExp & getOriginalBody();
121     const std::wstring & getName();
122     std::vector<symbol::Symbol> getIn();
123     std::vector<symbol::Symbol> getOut();
124     MacroDef * clone() const;
125 };
126
127 class DeclaredMacroDef : public MacroDef
128 {
129     ast::FunctionDec * dec;
130
131 public:
132
133     DeclaredMacroDef(ast::FunctionDec * const _dec);
134
135     ~DeclaredMacroDef()
136     {
137         delete dec;
138     }
139
140     ast::SeqExp & getBody();
141     const ast::SeqExp & getOriginalBody();
142     const std::wstring & getName();
143     std::vector<symbol::Symbol> getIn();
144     std::vector<symbol::Symbol> getOut();
145     MacroDef * clone() const;
146 };
147
148 } // namespace analysis
149
150 #endif // __MACRO_DEF_HXX__