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