3b618d9d3bb336ce799ce610db27d7eeb3c57632
[scilab.git] / scilab / modules / ast / includes / exps / selectexp.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2010-2010 - DIGITEO - 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 selectexp.hxx
15  ** Define Select Expression class
16  */
17
18 #ifndef __AST_SELECT_EXP_HXX__
19 #define __AST_SELECT_EXP_HXX__
20
21 #include "controlexp.hxx"
22 #include "exp.hxx"
23 #include "caseexp.hxx"
24 #include "seqexp.hxx"
25
26 namespace ast
27 {
28 class SelectExp : public ControlExp
29 {
30 public :
31     SelectExp(const Location& location,
32               Exp& select,
33               exps_t& cases,
34               Exp& defaultCase)
35         : ControlExp (location),
36           _hasDefault(true)
37     {
38         select.setParent(this);
39         _exps.push_back(&select);
40
41         for (auto it : cases)
42         {
43             it->setParent(this);
44             _exps.push_back(it);
45         }
46
47         delete &cases;
48         defaultCase.setParent(this);
49         _exps.push_back(&defaultCase);
50     }
51
52     SelectExp(const Location& location,
53               Exp& select,
54               exps_t& cases)
55         : ControlExp (location),
56           _hasDefault(false)
57     {
58         select.setParent(this);
59         _exps.push_back(&select);
60
61         for (exps_t::const_iterator it = cases.begin(), itEnd = cases.end(); it != itEnd ; ++it)
62         {
63             (*it)->setParent(this);
64             _exps.push_back(*it);
65         }
66
67         delete &cases;
68     }
69
70     ~SelectExp()
71     {
72     }
73
74     virtual SelectExp* clone()
75     {
76         exps_t* cases = new exps_t;
77         exps_t::const_iterator it = ++(_exps.begin());
78         exps_t::const_iterator itEnd = _exps.end();
79         if (_hasDefault)
80         {
81             --itEnd;
82         }
83
84         for (; it != itEnd ; ++it)
85         {
86             cases->push_back((*it)->clone());
87         }
88
89         SelectExp* cloned = NULL;
90         if (_hasDefault)
91         {
92             cloned = new SelectExp(getLocation(), *getSelect()->clone(), *cases, *getDefaultCase()->clone());
93         }
94         else
95         {
96             cloned = new SelectExp(getLocation(), *getSelect()->clone(), *cases);
97         }
98
99         cloned->setVerbose(isVerbose());
100         return cloned;
101     }
102
103     virtual bool equal(const Exp & e) const
104     {
105         return Exp::equal(e) && hasDefault() == static_cast<const SelectExp &>(e).hasDefault();
106     }
107
108 public :
109     Exp* getSelect() const
110     {
111         return _exps[0];
112     }
113
114     inline exps_t getCases() const
115     {
116         return ast::exps_t(std::next(_exps.begin()), _hasDefault ? std::prev(_exps.end()) : _exps.end());
117     }
118
119     inline exps_t getCases()
120     {
121         return ast::exps_t(std::next(_exps.begin()), _hasDefault ? std::prev(_exps.end()) : _exps.end());
122     }
123
124     Exp* getDefaultCase() const
125     {
126         if (_hasDefault)
127         {
128             return _exps.back();
129         }
130         else
131         {
132             return NULL;
133         }
134     }
135
136     /** \name Visitors entry point.
137     ** \{ */
138 public:
139     /** \brief Accept a const visitor \a v. */
140     virtual void accept (Visitor& v)
141     {
142         v.visit (*this);
143     }
144     /** \brief Accept a non-const visitor \a v. */
145     virtual void accept (ConstVisitor& v) const
146     {
147         v.visit (*this);
148     }
149     /** \} */
150
151     virtual ExpType getType() const
152     {
153         return SELECTEXP;
154     }
155
156     inline bool isSelectExp() const
157     {
158         return true;
159     }
160
161     bool hasDefault()
162     {
163         return _hasDefault;
164     }
165
166     bool hasDefault() const
167     {
168         return _hasDefault;
169     }
170
171     bool _hasDefault;
172 };
173
174 }
175
176
177 #endif /* !__AST_SELECT_EXP_HXX__ */