bug #13983: who_user returns wrong values
[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_CONSOLE   1
37
38 namespace symbol
39 {
40
41 /** \brief Define class Symbol.
42  **
43  ** Map any wstring to a unique reference.
44  ** This allows to avoid an "strcmp()" style comparison of strings:
45  ** reference comparison is much faster.
46  */
47 class EXTERN_AST Symbol
48 {
49     /** \brief Define the type "set of wstring". */
50     typedef std::set < std::wstring> string_set_type;
51     /** \brief Define the type used for the size of wstring set. */
52     typedef string_set_type::size_type size_type;
53
54     /** \name Ctor & Dtor.
55      ** \{ */
56 public:
57     /** \brief Construct a Symbol (explicit).
58      ** \param s referenced wstring */
59     explicit Symbol (const std::wstring &s);
60     /** \} */
61
62
63     /** \name Accessors.
64      ** \{ */
65 public:
66     /** \brief Return the wstring referenced by this Symbol. */
67     const std::wstring& getName () const;
68     /** \brief Return the number of referenced strings. */
69     static size_type getSize ();
70     /** \brief Return all symbols. */
71     static wchar_t** getAll ();
72     /** \} */
73
74
75     /** \name Operators.
76      ** \{ */
77 public:
78     /** \brief Compare two Symbol for equality.
79      ** \param rhs Symbol to compare with. */
80     bool operator== (const Symbol &rhs) const;
81     /** \brief Compare two Symbol for inequality.
82      ** \param rhs Symbol to compare with. */
83     bool operator!= (const Symbol &rhs) const;
84     /** \brief Compare two Symbol for order.
85      ** \param rhs Symbol to compare with. */
86     bool operator<  (const Symbol &rhs) const;
87     /** \} */
88
89     const string_set_type::const_iterator getNode() const
90     {
91         return _set_node;
92     }
93
94 private:
95     /** \brief Static (global to all instance of Symbol) strings container. */
96     static string_set_type _set;
97     /** \brief Pointer to the node containing the unique referenced wstring. */
98     const string_set_type::const_iterator _set_node;
99 };
100
101 /** \brief Intercept output stream redirection.
102  ** \param ostr the destination output stream
103  ** \param the a reference to the symbol to redirect
104  */
105 std::wostream& operator<< (std::wostream &ostr, const Symbol &the);
106
107 /** Typedef for the list of Symbol */
108 typedef std::list<const Symbol*> symbols_t;
109 }
110
111 namespace std
112 {
113 template<>
114 struct hash<symbol::Symbol>
115 {
116     inline size_t operator()(const symbol::Symbol & sym) const
117     {
118         return std::hash<std::wstring>()(sym.getName());
119     }
120 };
121 } // namespace std
122
123 #endif // !SYMBOL_HH