Bump version numbers to 6.2.0
[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  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15
16 /**
17  ** \file symbol.hh
18  ** \brief Define class Symbol.
19  */
20
21 #ifndef SYMBOL_HH
22 #define SYMBOL_HH
23
24 #ifdef _MSC_VER
25 #pragma warning (disable : 4251)
26 #endif
27 #include <set>
28 #include <list>
29 #include <string>
30 #include <iostream>
31
32 extern "C"
33 {
34 #include "dynlib_ast.h"
35 }
36
37 #define SCOPE_ALL       -1
38 #define SCOPE_GATEWAY   0
39 #define SCOPE_CONSOLE   1
40
41 namespace symbol
42 {
43
44 /** \brief Define class Symbol.
45  **
46  ** Map any wstring to a unique reference.
47  ** This allows to avoid an "strcmp()" style comparison of strings:
48  ** reference comparison is much faster.
49  */
50 class EXTERN_AST Symbol
51 {
52     /** \brief Define the type "set of wstring". */
53     typedef std::set < std::wstring> string_set_type;
54     /** \brief Define the type used for the size of wstring set. */
55     typedef string_set_type::size_type size_type;
56
57     /** \name Ctor & Dtor.
58      ** \{ */
59 public:
60     /** \brief Construct a Symbol (explicit).
61      ** \param s referenced wstring */
62     explicit Symbol (const std::wstring &s);
63     /** \} */
64
65
66     /** \name Accessors.
67      ** \{ */
68 public:
69     /** \brief Return the wstring referenced by this Symbol. */
70     const std::wstring& getName () const;
71     /** \brief Return the number of referenced strings. */
72     static size_type getSize ();
73     /** \brief Return all symbols. */
74     static wchar_t** getAll ();
75     /** \} */
76
77
78     /** \name Operators.
79      ** \{ */
80 public:
81     /** \brief Compare two Symbol for equality.
82      ** \param rhs Symbol to compare with. */
83     bool operator== (const Symbol &rhs) const;
84     /** \brief Compare two Symbol for inequality.
85      ** \param rhs Symbol to compare with. */
86     bool operator!= (const Symbol &rhs) const;
87     /** \brief Compare two Symbol for order.
88      ** \param rhs Symbol to compare with. */
89     bool operator<  (const Symbol &rhs) const;
90     /** \} */
91
92     const string_set_type::const_iterator getNode() const
93     {
94         return _set_node;
95     }
96
97 private:
98     /** \brief Static (global to all instance of Symbol) strings container. */
99     static string_set_type _set;
100     /** \brief Pointer to the node containing the unique referenced wstring. */
101     const string_set_type::const_iterator _set_node;
102 };
103
104 /** \brief Intercept output stream redirection.
105  ** \param ostr the destination output stream
106  ** \param the a reference to the symbol to redirect
107  */
108 EXTERN_AST std::wostream& operator<< (std::wostream &ostr, const Symbol &the);
109
110 /** Typedef for the list of Symbol */
111 typedef std::list<const Symbol*> symbols_t;
112 }
113
114 namespace std
115 {
116 template<>
117 struct hash<symbol::Symbol>
118 {
119     inline size_t operator()(const symbol::Symbol & sym) const
120     {
121         return std::hash<std::wstring>()(sym.getName());
122     }
123 };
124 } // namespace std
125
126 #endif // !SYMBOL_HH