Improve performance for loop and insertion
[scilab.git] / scilab / modules / ast / includes / exps / trycatchexp.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2008-2008 - 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 trycatchexp.hxx
15  ** Define the Trycatchuence Expression class.
16  */
17
18 #ifndef AST_TRYCATCHEXP_HXX
19 #define AST_TRYCATCHEXP_HXX
20
21 #include "controlexp.hxx"
22 #include "seqexp.hxx"
23
24 namespace ast
25 {
26
27 /** \brief Abstract a Trycatchuence Expression node.
28 **
29 ** \b Example: try (print_int(2097); catch print("WipeOut")) */
30 class TryCatchExp : public ControlExp
31 {
32     /** \name Ctor & dtor.
33     ** \{ */
34 public:
35     /** \brief Construct a Trycatchuence Expression node.
36     ** \param location scanner position informations
37     ** \param body EXP LIST intruction
38     */
39     TryCatchExp (const Location& location,
40                  SeqExp& tryme,
41                  SeqExp& catchme)
42         : ControlExp (location)
43     {
44         tryme.setParent(this);
45         catchme.setParent(this);
46         _exps.push_back(tryme.getAs<Exp>());
47         _exps.push_back(catchme.getAs<Exp>());
48     }
49
50     virtual ~TryCatchExp ()
51     {
52     }
53
54     virtual TryCatchExp* clone()
55     {
56         TryCatchExp* cloned = new TryCatchExp(getLocation(), *getTry().clone()->getAs<SeqExp>(), *getCatch().clone()->getAs<SeqExp>());
57         cloned->setVerbose(isVerbose());
58         return cloned;
59     }
60     /** \name Visitors entry point.
61     ** \{ */
62 public:
63     /** \brief Accept a const visitor \a v. */
64     virtual void accept (Visitor& v)
65     {
66         v.visit (*this);
67     }
68     /** \brief Accept a non-const visitor \a v. */
69     virtual void accept (ConstVisitor& v) const
70     {
71         v.visit (*this);
72     }
73     /** \} */
74
75
76     /** \name Accessors.
77     ** \{ */
78 public:
79     const Exp& getTry() const
80     {
81         return *_exps[0];
82     }
83
84     Exp& getTry()
85     {
86         return *_exps[0];
87     }
88
89     const Exp& getCatch() const
90     {
91         return *_exps[1];
92     }
93
94     Exp& getCatch()
95     {
96         return *_exps[1];
97     }
98     /** \} */
99
100     virtual ExpType getType() const
101     {
102         return TRYCATCHEXP;
103     }
104     inline bool isTryCatchExp() const
105     {
106         return true;
107     }
108 };
109
110 } // namespace ast
111
112 #endif /* !AST_TRYCATCHEXP_HXX */