remove watches from scilab debugger
[scilab.git] / scilab / modules / ast / includes / ast / visitor.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2007-2008 - DIGITEO - 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 visitor.hxx
18  ** \brief Defines the root class of all visitor classes.
19  **
20  ** There are two kinds of visitors, just like there are two kinds of
21  ** iterators: the ConstVisitors (which cannot modify the tree they
22  ** visit), and the NonConstVisitors (which *can* modify the tree).\n
23  ** \n
24  ** Both kind of visitors share the same form of hierarchy:
25  ** AbstractVisitor (<- AConcreteVisitor).\n
26  ** \n
27  ** Since we don't want to implement twice the AbstractVisitor and
28  ** twice the DefaultVisitor, we use class templates:
29  ** \li GenVisitor < const_kind >
30  ** \li GenVisitor < non_const_kind >
31  */
32
33 #ifndef AST_VISITOR_HXX
34 #define AST_VISITOR_HXX
35
36 #include "decls.hxx"
37 #include "dynlib_ast.h"
38
39 namespace ast
40 {
41
42 /** \name Allow const selection. */
43 /** \{ */
44 /** \brief Select const methods. */
45 struct const_kind {};
46 /** \brief Select non-const methods. */
47 struct non_const_kind {};
48 /** \} */
49
50 template <typename K, typename T>
51 /** \brief select_const<SELECTOR, TYPE>.
52  **
53  ** We use template to be able to select the const or not
54  ** const variety of a TYPE.\n
55  ** SELECTOR must be `const_kind' or `non_const_kind'. */
56 struct select_const
57 {
58     /** \brief \a t is non-const, just like T. */
59     typedef T t;
60 };
61
62 template <typename T>
63 /** \brief select_const<const_kind, TYPE>
64  **
65  ** Specialized version of select_const for const_kind.
66  ** \see select_const */
67 struct select_const<const_kind, T>
68 {
69     /** \brief \a t is the const version of type T. */
70     typedef const T t;
71 };
72
73
74 template <typename K>
75 /** \brief Root class of all visitors.
76  **
77  ** GenVisitor<CONSTNESS-SELECTOR> is the root class of all
78  ** visitors. */
79 class EXTERN_AST GenVisitor
80 {
81     /** \name Ctor & dtor.
82      ** \{ */
83 public:
84     /** \brief Destroys a GenVisitor */
85     virtual ~GenVisitor ()
86     {
87     }
88     /** \} */
89
90     //force devrived class to implement clone method
91     virtual GenVisitor* clone() = 0;
92
93
94     /** \name Visit Variable related nodes.
95      ** \{ */
96 public:
97     virtual void visit (typename select_const<K, SimpleVar>::t & e) = 0;
98     virtual void visit (typename select_const<K, DollarVar>::t & e) = 0;
99     virtual void visit (typename select_const<K, ColonVar>::t & e) = 0;
100     virtual void visit (typename select_const<K, ArrayListVar>::t & e) = 0;
101     /** \} */
102
103     /** \name Visit Constant Expressions related nodes.
104      ** \{ */
105 public:
106     virtual void visit (typename select_const<K, DoubleExp>::t & e) = 0;
107     virtual void visit (typename select_const<K, BoolExp>::t & e) = 0;
108     virtual void visit (typename select_const<K, StringExp>::t & e) = 0;
109     virtual void visit (typename select_const<K, CommentExp>::t & e) = 0;
110     virtual void visit (typename select_const<K, NilExp>::t & e) = 0;
111     /** \} */
112
113     /** \name Visit Instructions related nodes.
114      ** \{ */
115 public:
116     virtual void visit (typename select_const<K, CallExp>::t & e) = 0;
117     virtual void visit (typename select_const<K, CellCallExp>::t & e) = 0;
118     virtual void visit (typename select_const<K, OpExp>::t & e) = 0;
119     virtual void visit (typename select_const<K, LogicalOpExp>::t & e) = 0;
120     virtual void visit (typename select_const<K, AssignExp>::t & e) = 0;
121     virtual void visit (typename select_const<K, IfExp>::t & e) = 0;
122     virtual void visit (typename select_const<K, WhileExp>::t & e) = 0;
123     virtual void visit (typename select_const<K, ForExp>::t & e) = 0;
124     virtual void visit (typename select_const<K, BreakExp>::t & e) = 0;
125     virtual void visit (typename select_const<K, ContinueExp>::t & e) = 0;
126     virtual void visit (typename select_const<K, TryCatchExp>::t & e) = 0;
127     virtual void visit (typename select_const<K, SelectExp>::t & e) = 0;
128     virtual void visit (typename select_const<K, CaseExp>::t & e) = 0;
129     virtual void visit (typename select_const<K, ReturnExp>::t & e) = 0;
130     virtual void visit (typename select_const<K, FieldExp>::t & e) = 0;
131     /** \} */
132
133     /** \name Visit Single Operation related nodes.
134      ** \{ */
135 public:
136     virtual void visit (typename select_const<K, NotExp>::t & e) = 0;
137     virtual void visit (typename select_const<K, TransposeExp>::t & e) = 0;
138     /** \} */
139
140     /** \name Visit Matrix related nodes.
141      ** \{ */
142 public:
143     virtual void visit (typename select_const<K, MatrixExp>::t & e) = 0;
144     virtual void visit (typename select_const<K, MatrixLineExp>::t & e) = 0;
145     /** \} */
146
147     /** \name Visit Cell related nodes.
148      ** \{ */
149 public:
150     virtual void visit (typename select_const<K, CellExp>::t & e) = 0;
151     /** \} */
152
153     /** \name Visit List of Expressions related nodes.
154       ** \{ */
155 public:
156     virtual void visit (typename select_const<K, SeqExp>::t & e) = 0;
157     virtual void visit (typename select_const<K, ArrayListExp>::t & e) = 0;
158     virtual void visit (typename select_const<K, AssignListExp>::t & e) = 0;
159     /** \} */
160
161
162     /** \name Visit Declaration related nodes.
163      ** \{ */
164 public:
165     virtual void visit (typename select_const<K, VarDec>::t & e) = 0;
166     virtual void visit (typename select_const<K, FunctionDec>::t & e) = 0;
167     /** \} */
168
169     /** \name Visit Type dedicated Expressions related node.
170      ** \{ */
171 public:
172     virtual void visit (typename select_const<K, ListExp>::t & e) = 0;
173     /** \} */
174
175 public:
176     virtual void visit (typename select_const<K, OptimizedExp>::t & e) = 0;
177     virtual void visit (typename select_const<K, MemfillExp>::t & e) = 0;
178
179     /*optimized*/
180     virtual void visit (typename select_const<K, DAXPYExp>::t & e) = 0;
181
182     virtual void visit (typename select_const<K, IntSelectExp>::t & e) = 0;
183     virtual void visit (typename select_const<K, StringSelectExp>::t & e) = 0;
184 };
185
186 /** \brief Define shortand type for a const visitor */
187 typedef GenVisitor<const_kind> ConstVisitor;
188 /** \brief Define shortand type for a non const visitor */
189 typedef GenVisitor<non_const_kind> Visitor;
190
191 } // namespace ast
192
193
194 #endif // !AST_VISITOR_HXX