kernel modules Wiedervereinigung
[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 #include <set>
22 #include <list>
23 #include <string>
24 #include <iostream>
25
26 extern "C"
27 {
28 #include "dynlib_ast.h"
29 }
30
31 namespace symbol
32 {
33
34 /** \brief Define class Symbol.
35  **
36  ** Map any wstring to a unique reference.
37  ** This allows to avoid an "strcmp()" style comparison of strings:
38  ** reference comparison is much faster.
39  */
40 class EXTERN_AST Symbol
41 {
42     /** \brief Define the type "set of wstring". */
43     typedef std::set < std::wstring> string_set_type;
44     /** \brief Define the type used for the size of wstring set. */
45     typedef string_set_type::size_type size_type;
46
47     /** \name Ctor & Dtor.
48      ** \{ */
49 public:
50     /** \brief Construct a Symbol (explicit).
51      ** \param s referenced wstring */
52     explicit Symbol (const std::wstring &s);
53     /** \} */
54
55
56     /** \name Accessors.
57      ** \{ */
58 public:
59     /** \brief Return the wstring referenced by this Symbol. */
60     const std::wstring& name_get () const;
61     /** \brief Return the number of referenced strings. */
62     static size_type map_size ();
63     /** \brief Return all symbols. */
64     static wchar_t** get_all ();
65     /** \} */
66
67
68     /** \name Operators.
69      ** \{ */
70 public:
71     /** \brief Compare two Symbol for equality.
72      ** \param rhs Symbol to compare with. */
73     bool operator== (const Symbol &rhs) const;
74     /** \brief Compare two Symbol for inequality.
75      ** \param rhs Symbol to compare with. */
76     bool operator!= (const Symbol &rhs) const;
77     /** \brief Compare two Symbol for order.
78      ** \param rhs Symbol to compare with. */
79     bool operator<  (const Symbol &rhs) const;
80     /** \} */
81
82     const string_set_type::const_iterator get_node() const
83     {
84         return _set_node;
85     }
86
87 private:
88     /** \brief Static (global to all instance of Symbol) strings container. */
89     static string_set_type _set;
90     /** \brief Pointer to the node containing the unique referenced wstring. */
91     const string_set_type::const_iterator _set_node;
92 };
93
94 /** \brief Intercept output stream redirection.
95  ** \param ostr the destination output stream
96  ** \param the a reference to the symbol to redirect
97  */
98 std::wostream& operator<< (std::wostream &ostr, const Symbol &the);
99
100 /** Typedef for the list of Symbol */
101 typedef std::list<const Symbol*> symbols_t;
102 }
103
104 #endif // !SYMBOL_HH