fix ref count in symbol::Libraries
[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  *  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 __VARIABLES_HXX__
14 #define __VARIABLES_HXX__
15
16 #include <string>
17 #include <stack>
18 #include "symbol.hxx"
19 #include "internal.hxx"
20 #include "double.hxx"
21 #include "dynlib_ast.h"
22
23 namespace symbol
24 {
25 struct ScopedVariable
26 {
27     ScopedVariable(int _iLevel, types::InternalType* _pIT)
28         : m_iLevel(_iLevel), m_pIT(_pIT), m_globalVisible(false), protect(false) {}
29
30     int m_iLevel;
31     types::InternalType* m_pIT;
32     bool m_globalVisible;
33     bool protect;
34 };
35
36 struct EXTERN_AST Variable
37 {
38     typedef std::stack<ScopedVariable*> StackVar;
39
40     Variable(const Symbol& _name) : name(_name), m_Global(false), m_GlobalValue(NULL), last(nullptr) {};
41     ~Variable();
42
43     void put(types::InternalType* _pIT, int _iLevel);
44     void setGlobalValue(types::InternalType* _pIT);
45     void setGlobalVisible(int _iLevel, bool _bVisible);
46
47     inline void put(ScopedVariable* pSV)
48     {
49         last = pSV;
50         stack.push(last);
51     }
52
53     inline types::InternalType* get() const
54     {
55         if (empty())
56         {
57             return NULL;
58         }
59
60         if (m_Global && top()->m_globalVisible)
61         {
62             return m_GlobalValue;
63         }
64         else
65         {
66             return top()->m_pIT;
67         }
68     }
69
70     inline bool empty() const
71     {
72         return stack.empty();
73     }
74
75     inline ScopedVariable* top() const
76     {
77         return last;
78     }
79
80     inline void pop()
81     {
82         stack.pop();
83         if (stack.empty())
84         {
85             last = nullptr;
86         }
87         else
88         {
89             last = stack.top();
90         }
91     }
92
93     inline Symbol getSymbol() const
94     {
95         return name;
96     }
97
98     //globals
99
100     inline void setGlobal(bool _bGlobal)
101     {
102         m_Global = _bGlobal;
103     }
104
105     inline bool isGlobal()
106     {
107         return m_Global;
108     }
109
110     inline bool isGlobalVisible(int _iLevel)
111     {
112         if (empty() == false)
113         {
114             if (top()->m_iLevel == _iLevel)
115             {
116                 return top()->m_globalVisible;
117             }
118         }
119
120         return false;
121     }
122
123     inline types::InternalType* getGlobalValue()
124     {
125         return m_GlobalValue;
126     }
127
128 private :
129     Symbol name;
130     bool m_Global;
131     types::InternalType* m_GlobalValue;
132     StackVar stack;
133     ScopedVariable* last;
134 };
135
136 struct Variables
137 {
138     typedef std::map<Symbol, Variable*> MapVars;
139
140     Variables() {};
141
142     Variable* getOrCreate(const Symbol& _key);
143     int getLevel(const Symbol& _key) const;
144     void put(const Symbol& _key, types::InternalType* _pIT, int _iLevel);
145     types::InternalType* get(const Symbol& _key, int _iLevel);
146     types::InternalType* get(Variable* _var, int _iLevel);
147     types::InternalType* getAllButCurrentLevel(const Symbol& _key, int _iLevel);
148     bool remove(Variable* _var, int _iLevel);
149     bool remove(const Symbol& _key, int _iLevel);
150     int getMacrosName(std::list<std::wstring>& lst);
151     int getVarsName(std::list<std::wstring>& lst);
152     bool getVarsNameForWho(std::list<std::wstring>& lstVarName, int* iVarLenMax, bool bSorted = false) const;
153     bool getGlobalNameForWho(std::list<std::wstring>& lstVarName, int* iVarLenMax, bool bSorted = false) const;
154     int getProtectedVarsName(std::list<std::wstring>& lstVarName) const;
155     int getFunctionsName(std::list<std::wstring>& lst);
156     int getFunctionList(std::list<Symbol>& lst, std::wstring _stModuleName, int _iLevel);
157     int getVarsToVariableBrowser(std::list<Variable*>& lst);
158     bool putInPreviousScope(Variable* _var, types::InternalType* _pIT, int _iLevel);
159
160     //globals
161
162     void setGlobal(const Symbol& _key);
163     void setGlobalVisible(const Symbol& _key, bool _bVisible, int _iLevel);
164     bool isGlobalVisible(const Symbol& _key, int _iLevel);
165     bool isGlobal(const Symbol& _key, int /*_iLevel*/);
166     types::InternalType* getGlobalValue(const Symbol& _key);
167     void removeGlobal(const Symbol& _key, int _iLevel);
168     void clearAll();
169
170 private:
171     MapVars vars;
172 };
173 }
174
175 #endif // !__VARIABLES_HXX__