fix ref count in symbol::Libraries
[scilab.git] / scilab / modules / ast / includes / symbol / libraries.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 __LIBRARIES_HXX__
14 #define __LIBRARIES_HXX__
15
16 #include <stack>
17 #include "symbol.hxx"
18 #include "types.hxx"
19 #include "library.hxx"
20
21 namespace symbol
22 {
23 struct ScopedLibrary
24 {
25     ScopedLibrary(int _iLevel, types::Library* _pLib) : m_iLevel(_iLevel), m_pLib(_pLib) {};
26
27     types::MacroFile* getMacroFile(const Symbol& _key)
28     {
29         return m_pLib->get(_key.getName());
30     }
31
32     int m_iLevel;
33     types::Library* m_pLib;
34 };
35
36 struct Library
37 {
38     typedef std::stack<ScopedLibrary*> StackLib;
39
40     Library(const Symbol& _name) : name(_name), m_global(false) {};
41
42     void put(types::Library* _pLib, int _iLevel);
43     types::MacroFile* get(const Symbol& _keyMacro) const;
44     int getMacrosName(std::list<std::wstring>& lst);
45
46     inline void put(ScopedLibrary* pSL)
47     {
48         stack.push(pSL);
49     }
50
51     inline bool empty() const
52     {
53         return stack.empty();
54     }
55
56     inline ScopedLibrary* top() const
57     {
58         return stack.top();
59     }
60
61     void pop()
62     {
63         stack.pop();
64     }
65
66     inline Symbol getSymbol() const
67     {
68         return name;
69     }
70
71 private :
72     StackLib stack;
73     Symbol name;
74     bool m_global;
75 };
76
77 struct Libraries
78 {
79     typedef std::map<Symbol, Library*> MapLibs;
80
81     Libraries() {}
82
83     Library* getOrCreate(const Symbol& _key);
84     int getLevel(const Symbol& _key) const;
85     void put(const Symbol& _keyLib, types::Library* _pLib, int _iLevel);
86     bool putInPreviousScope(const Symbol& _keyLib, types::Library* _pLib, int _iLevel);
87     types::InternalType* get(const Symbol& _key, int _iLevel);
88     bool remove(const Symbol& _key, int _iLevel);
89     int getMacrosName(std::list<std::wstring>& lst);
90     int getVarsName(std::list<std::wstring>& lst);
91     int getVarsToVariableBrowser(std::list<Library*>& lst);
92     void clearAll();
93     bool getVarsNameForWho(std::list<std::wstring>* lstVarName, int* iVarLenMax, bool bSorted = false) const;
94     int whereis(std::list<std::wstring>& lst, const Symbol& _key);
95     int librarieslist(std::list<std::wstring>& lst);
96
97 private:
98     MapLibs libs;
99 };
100 }
101 #endif /* !__LIBRARIES_HXX__ */