fix precedence of uminus in operation
[scilab.git] / scilab / modules / ast / includes / exps / doubleexp.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2007-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 #ifndef AST_DOUBLEEXP_HXX
14 #define AST_DOUBLEEXP_HXX
15
16 #include "constexp.hxx"
17
18 #include "visitor.hxx"
19
20 namespace ast
21 {
22 /** \brief Abstract an Double Expression node.
23 **
24 ** \b Example:  42.51 */
25 class DoubleExp : public ConstExp
26 {
27 public:
28     DoubleExp (const Location& location, double value)
29         : ConstExp (location),
30           _value (value)
31     {
32     }
33
34     DoubleExp (const Location& location, types::InternalType* value)
35         : ConstExp (location),
36           _value (0)
37     {
38         setConstant(value);
39     }
40     /** \brief Destroy an Double Expression node.
41     **
42     ** Delete size et init (exp) (see constructor). */
43     virtual ~DoubleExp ()
44     {
45     }
46     /** \} */
47
48     virtual DoubleExp* clone()
49     {
50         DoubleExp* cloned = new DoubleExp(getLocation(), getValue());
51         cloned->setVerbose(isVerbose());
52         return cloned;
53     }
54
55     virtual bool equal(const Exp & e) const
56     {
57         return e.getType() == DOUBLEEXP && _value == static_cast<const DoubleExp &>(e)._value;
58     }
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     /** \brief Return the value */
80     double getValue() const
81     {
82         return _value;
83     }
84     /** \} */
85
86     virtual ExpType getType() const
87     {
88         return DOUBLEEXP;
89     }
90
91     inline bool isDoubleExp() const
92     {
93         return true;
94     }
95     
96     inline DoubleExp* neg()
97     {
98         _value = -_value;
99         //constant will not be update but
100         //normally neg is only called by parser
101         //before constant was created
102         return this;
103     }
104
105
106 protected:
107     double _value;
108 };
109
110 } // namespace ast
111 #endif