add save(filename) to save all variables in context.
[scilab.git] / scilab / modules / ast / includes / symbol / symbol.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.hh
15  ** \brief Define class Symbol.
16  */
17
18 #ifndef SYMBOL_HH
19 #define SYMBOL_HH
20
21 #ifdef _MSC_VER
22 #pragma warning (disable : 4251)
23 #endif
24 #include <set>
25 #include <list>
26 #include <string>
27 #include <iostream>
28
29 extern "C"
30 {
31 #include "dynlib_ast.h"
32 }
33
34 #define SCOPE_ALL       -1
35 #define SCOPE_GATEWAY   0
36 #define SCOPE_MACRO     1
37 #define SCOPE_CONSOLE   2
38
39 namespace symbol
40 {
41
42 /** \brief Define class Symbol.
43  **
44  ** Map any wstring to a unique reference.
45  ** This allows to avoid an "strcmp()" style comparison of strings:
46  ** reference comparison is much faster.
47  */
48 class EXTERN_AST Symbol
49 {
50     /** \brief Define the type "set of wstring". */
51     typedef std::set < std::wstring> string_set_type;
52     /** \brief Define the type used for the size of wstring set. */
53     typedef string_set_type::size_type size_type;
54
55     /** \name Ctor & Dtor.
56      ** \{ */
57 public:
58     /** \brief Construct a Symbol (explicit).
59      ** \param s referenced wstring */
60     explicit Symbol (const std::wstring &s);
61     /** \} */
62
63
64     /** \name Accessors.
65      ** \{ */
66 public:
67     /** \brief Return the wstring referenced by this Symbol. */
68     const std::wstring& getName () const;
69     /** \brief Return the number of referenced strings. */
70     static size_type getSize ();
71     /** \brief Return all symbols. */
72     static wchar_t** getAll ();
73     /** \} */
74
75
76     /** \name Operators.
77      ** \{ */
78 public:
79     /** \brief Compare two Symbol for equality.
80      ** \param rhs Symbol to compare with. */
81     bool operator== (const Symbol &rhs) const;
82     /** \brief Compare two Symbol for inequality.
83      ** \param rhs Symbol to compare with. */
84     bool operator!= (const Symbol &rhs) const;
85     /** \brief Compare two Symbol for order.
86      ** \param rhs Symbol to compare with. */
87     bool operator<  (const Symbol &rhs) const;
88     /** \} */
89
90     const string_set_type::const_iterator getNode() const
91     {
92         return _set_node;
93     }
94
95 private:
96     /** \brief Static (global to all instance of Symbol) strings container. */
97     static string_set_type _set;
98     /** \brief Pointer to the node containing the unique referenced wstring. */
99     const string_set_type::const_iterator _set_node;
100 };
101
102 /** \brief Intercept output stream redirection.
103  ** \param ostr the destination output stream
104  ** \param the a reference to the symbol to redirect
105  */
106 std::wostream& operator<< (std::wostream &ostr, const Symbol &the);
107
108 /** Typedef for the list of Symbol */
109 typedef std::list<const Symbol*> symbols_t;
110 }
111
112 namespace std
113 {
114 template<>
115 struct hash<symbol::Symbol>
116 {
117     inline size_t operator()(const symbol::Symbol & sym) const
118     {
119         return std::hash<std::wstring>()(sym.getName());
120     }
121 };
122 } // namespace std
123
124 #endif // !SYMBOL_HH