License Header change: Removed the LICENSE_END before beta
[scilab.git] / scilab / modules / ast / includes / analysis / ConstantValue.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2015 - Scilab Enterprises - Calixte DENIZET
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 #ifndef __CONSTANT_VALUE_HXX__
17 #define __CONSTANT_VALUE_HXX__
18
19 #include <complex>
20 #include <iostream>
21 #include <string>
22 #include <type_traits>
23
24 #include "gvn/GVN.hxx"
25
26 namespace types
27 {
28 class InternalType;
29 }
30
31 namespace analysis
32 {
33 class EXTERN_AST ConstantValue
34 {
35
36 public:
37
38     enum Kind : unsigned char { GVNVAL, ITVAL, UNKNOWN };
39
40 private:
41
42     union Value
43     {
44         GVN::Value * gvnVal;
45         types::InternalType * pIT;
46
47         Value() { }
48         Value(GVN::Value * val) : gvnVal(val) { }
49         Value(types::InternalType * val) : pIT(val) { }
50     };
51
52     Value val;
53     Kind kind;
54
55 public:
56
57     ConstantValue() : kind(UNKNOWN) { }
58     ConstantValue(GVN::Value * _val) : val(_val), kind(GVNVAL) { }
59     ConstantValue(types::InternalType * _val);
60     ConstantValue(const ConstantValue & cv);
61     ConstantValue(ConstantValue && cv) : val(cv.val), kind(cv.kind)
62     {
63         cv.kind = UNKNOWN;
64     }
65
66     ConstantValue & operator=(const ConstantValue & R);
67     ConstantValue & operator=(types::InternalType * const pIT);
68     ConstantValue & operator=(GVN::Value * const _val);
69     ConstantValue & operator=(ConstantValue && R);
70
71     ~ConstantValue();
72
73     inline Kind getKind() const
74     {
75         return kind;
76     }
77
78     inline bool isKnown() const
79     {
80         return kind != UNKNOWN;
81     }
82
83     types::InternalType * getIT() const;
84     GVN::Value * getGVNValue() const;
85     bool getGVNValue(GVN & gvn, GVN::Value *& _val) const;
86     bool getDblValue(double & _val) const;
87     bool getBoolValue(bool & _val) const;
88     bool getCplxValue(std::complex<double> & _val) const;
89     bool getStrValue(std::wstring & val) const;
90     void merge(const ConstantValue & cv);
91
92     friend std::wostream & operator<<(std::wostream & out, const ConstantValue & cv);
93 };
94
95 } // namespace analysis
96
97 #endif // __CONSTANT_VALUE_HXX__