* Bug 15599 fixed: now degree of zero polynomial is -Inf
[scilab.git] / scilab / modules / ast / includes / symbol / variables.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2014 - Scilab Enterprises - Antoine ELIAS
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 #ifndef __VARIABLES_HXX__
17 #define __VARIABLES_HXX__
18
19 #include <string>
20 #include <map>
21 #include <stack>
22 #include "symbol.hxx"
23 #include "internal.hxx"
24 #include "double.hxx"
25 #include "dynlib_ast.h"
26 #include "callable.hxx"
27
28 namespace symbol
29 {
30 struct ScopedVariable
31 {
32     ScopedVariable(int _iLevel, types::InternalType* _pIT)
33         : m_iLevel(_iLevel), m_pIT(_pIT), m_globalVisible(false), protect(false) {}
34
35     int m_iLevel;
36     types::InternalType* m_pIT;
37     bool m_globalVisible;
38     bool protect;
39 };
40
41 struct EXTERN_AST Variable
42 {
43     typedef std::stack<ScopedVariable*> StackVar;
44
45     Variable(const Symbol& _name) : name(_name), m_Global(false), m_GlobalValue(NULL), last(nullptr) {};
46     ~Variable();
47
48     bool put(types::InternalType* _pIT, int _iLevel);
49     void setGlobalValue(types::InternalType* _pIT);
50     void setGlobalVisible(int _iLevel, bool _bVisible);
51
52     inline bool put(ScopedVariable* pSV)
53     {
54         last = pSV;
55         stack.push(last);
56         return true;
57     }
58
59     inline types::InternalType* get() const
60     {
61         if (empty())
62         {
63             return NULL;
64         }
65
66         if (m_Global && top()->m_globalVisible)
67         {
68             return m_GlobalValue;
69         }
70         else
71         {
72             return top()->m_pIT;
73         }
74     }
75
76     inline bool empty() const
77     {
78         return stack.empty();
79     }
80
81     inline ScopedVariable* top() const
82     {
83         return last;
84     }
85
86     inline void pop()
87     {
88         stack.pop();
89         if (stack.empty())
90         {
91             last = nullptr;
92         }
93         else
94         {
95             last = stack.top();
96         }
97     }
98
99     inline Symbol getSymbol() const
100     {
101         return name;
102     }
103
104     //globals
105
106     inline void setGlobal(bool _bGlobal)
107     {
108         m_Global = _bGlobal;
109     }
110
111     inline bool isGlobal()
112     {
113         return m_Global;
114     }
115
116     inline bool isGlobalVisible(int _iLevel)
117     {
118         if (empty() == false)
119         {
120             if (top()->m_iLevel == _iLevel)
121             {
122                 return top()->m_globalVisible;
123             }
124         }
125
126         return false;
127     }
128
129     inline types::InternalType* getGlobalValue()
130     {
131         return m_GlobalValue;
132     }
133
134 private :
135     Symbol name;
136     bool m_Global;
137     types::InternalType* m_GlobalValue;
138     StackVar stack;
139     ScopedVariable* last;
140 };
141
142 struct Variables
143 {
144     typedef std::map<Symbol, Variable*> MapVars;
145
146     Variables() {};
147
148     Variable* getOrCreate(const Symbol& _key);
149     int getLevel(const Symbol& _key) const;
150     void put(const Symbol& _key, types::InternalType* _pIT, int _iLevel);
151     types::InternalType* get(const Symbol& _key, int _iLevel);
152     types::InternalType* get(Variable* _var, int _iLevel);
153     types::InternalType* getAllButCurrentLevel(const Symbol& _key, int _iLevel);
154     bool remove(Variable* _var, int _iLevel);
155     bool remove(const Symbol& _key, int _iLevel);
156     int getMacrosName(std::list<std::wstring>& lst);
157     int getVarsName(std::list<std::wstring>& lst);
158     bool getVarsNameForWho(std::list<std::wstring>& lstVarName, int* iVarLenMax, bool bSorted = false) const;
159     bool getGlobalNameForWho(std::list<std::wstring>& lstVarName, int* iVarLenMax, bool bSorted = false) const;
160     int getProtectedVarsName(std::list<std::wstring>& lstVarName) const;
161     int getFunctionsName(std::list<std::wstring>& lst);
162     int getFunctionList(std::list<Symbol>& lst, std::wstring _stModuleName, int _iLevel);
163     int getFunctionList(std::list<types::Callable *>& lst, std::wstring _stModuleName, int _iLevel);
164     int getVarsToVariableBrowser(std::list<Variable*>& lst);
165     bool putInPreviousScope(Variable* _var, types::InternalType* _pIT, int _iLevel);
166
167     //globals
168
169     void setGlobal(const Symbol& _key);
170     void setGlobalVisible(const Symbol& _key, bool _bVisible, int _iLevel);
171     bool isGlobalVisible(const Symbol& _key, int _iLevel);
172     bool isGlobal(const Symbol& _key, int /*_iLevel*/);
173     types::InternalType* getGlobalValue(const Symbol& _key);
174     void removeGlobal(const Symbol& _key, int _iLevel);
175     void clearAll();
176
177 private:
178     MapVars vars;
179 };
180 }
181
182 #endif // !__VARIABLES_HXX__