reforge symbol/context management
[scilab.git] / scilab / modules / symbol / includes / context.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2007-2008 - INRIA - Bruno JOFRET
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 /**
14  ** \file symbol/context.hh
15  ** \brief Define class Context.
16  */
17
18 #ifndef __CONTEXT_HXX__
19 #define __CONTEXT_HXX__
20 //#include "stack.hxx"
21 //#include "heap.hxx"
22 #include "scope.hxx"
23 #include "variables.hxx"
24 #include "internal.hxx"
25 #include "function.hxx"
26 #include "macro.hxx"
27 #include "macrofile.hxx"
28 #include "export_symbol.h"
29
30 namespace symbol
31 {
32
33 /** \brief Define class Context.
34 */
35 class EXTERN_SYMBOL Context
36 {
37 public :
38     static Context* getInstance(void);
39
40     /** Open a context scope i.e
41     ** open the heap table one
42     ** and the env table too. */
43     void scope_begin();
44
45     /** Close a context scope i.e
46     ** close the heap table one
47     ** and the env table too. */
48     void scope_end();
49
50     /** If key was associated to some Entry_T in the open scopes, return the
51     ** most recent insertion. Otherwise return the empty pointer. */
52     types::InternalType* get(const symbol::Symbol& key) const;
53
54     /** If key was associated to some Entry_T in the last opened scope, return it.
55     ** Otherwise return the empty pointer. */
56     types::InternalType* getCurrentLevel(const symbol::Symbol& key) const;
57
58     /** If key was associated to some Entry_T in the open scopes, return the
59     ** most recent insertion DESPITE the current/last one. Otherwise return the empty pointer. */
60     types::InternalType* getAllButCurrentLevel(const symbol::Symbol& key) const;
61
62     /** If key was associated to some Entry_T in the open scopes, return the
63     ** most recent insertion. Otherwise return the empty pointer. */
64     types::InternalType* getFunction(const symbol::Symbol& key) const;
65
66     /*return function list in the module _stModuleName*/
67     std::list<symbol::Symbol>& getFunctionList(const std::wstring& _stModuleName, bool _bFromEnd = true);
68
69     /* global functions */
70
71     /*return global variable visibility status*/
72     bool isGlobalVisible(const symbol::Symbol& key) const;
73
74     /*return global variable, search in global scope ( highest )*/
75     types::InternalType* getGlobalValue(const symbol::Symbol& key) const;
76
77     /*return global variable existance status*/
78     bool isGlobalExists(const symbol::Symbol& key) const;
79
80     /*create or update a global variable*/
81     void setGlobalValue(const symbol::Symbol& key, types::InternalType &value);
82
83     /*remove global variable and all visibility references */
84     void removeGlobal(const symbol::Symbol& key);
85
86     /*remove all global variables and references */
87     void removeGlobalAll();
88
89     /*create an empty variable*/
90     void createEmptyGlobalValue(const symbol::Symbol& key);
91
92     /*set variable visible/hidden in current global scope*/
93     void setGlobalVisible(const symbol::Symbol& key, bool bVisible = true);
94
95     /*print all tables*/
96     void print();
97
98     /*add symbol and value in the stack*/
99     bool put(const symbol::Symbol& key, types::InternalType& type);
100     /*add symbol and value in the previous scope*/
101     bool putInPreviousScope(const symbol::Symbol& key, types::InternalType& type);
102
103     /* remove symbol/value association */
104     bool remove(const symbol::Symbol& key);
105
106     bool addFunction(types::Function *_info);
107     bool AddMacro(types::Macro *_info);
108     bool AddMacroFile(types::MacroFile *_info);
109     void print(std::wostream& ostr) const
110     {
111         ostr << L"  Environment Variables:" << std::endl;
112         ostr << L"==========================" << std::endl;
113         ostr << *m_scopes;
114     };
115 private :
116
117     Scopes* m_scopes;
118
119     Context();
120     static Context* me;
121 };
122
123 inline std::wostream& operator<< (std::wostream& ostr, const Context &ctx)
124 {
125     ctx.print(ostr);
126     return ostr;
127 }
128
129 }
130 #endif /* !__CONTEXT_HXX__ */