e3ffb9f3688ddbef76172dcd0390a78bca3d1701
[scilab.git] / scilab / modules / ast / includes / analysis / data / Info.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2014 - Scilab Enterprises - Calixte DENIZET
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 __INFO_HXX__
14 #define __INFO_HXX__
15
16 #include <iostream>
17
18 #include "TIType.hxx"
19 #include "Data.hxx"
20 #include "gvn/GVN.hxx"
21 #include "dynlib_ast.h"
22 namespace analysis
23 {
24
25 struct EXTERN_AST Info
26 {
27     enum Local
28     {
29         INFO_TRUE, INFO_FALSE, INFO_UNKNOWN
30     };
31
32     bool R;
33     bool W;
34     bool O;
35     bool isint;
36     Local local;
37     bool cleared;
38     bool exists;
39     bool knownValue;
40     double value;
41     TIType type;
42     Data * data;
43     GVN::Value * gvnValue;
44     ast::Exp * exp;
45
46     Info(Data * _data = nullptr) : R(false), W(false), O(false), isint(false), local(Local::INFO_TRUE), cleared(false), exists(true), knownValue(false), data(_data), gvnValue(nullptr), exp(nullptr) { }
47     Info(const Info & i) : R(i.R), W(i.W), O(i.O), isint(i.isint), local(i.local), cleared(i.cleared), exists(i.exists), knownValue(i.knownValue), value(i.value), type(i.type), data(i.data ? new Data(*i.data) : nullptr), gvnValue(i.gvnValue), exp(i.exp) { }
48
49     inline void merge(Info & info)
50     {
51         R = R || info.R;
52         W = W || info.W;
53         O = O || info.O;
54         isint = isint && info.isint;
55         if (local != info.local)
56         {
57             local = Local::INFO_UNKNOWN;
58         }
59         cleared = cleared && info.cleared;
60         exists = exists || info.exists;
61         knownValue = knownValue && info.knownValue && value == info.value;
62         type.merge(info.type);
63         data->valid = data->same(info.data);
64     }
65
66     inline void addData(const bool known, const symbol::Symbol & sym)
67     {
68         data = new Data(known, sym);
69     }
70     inline void addData(Data * _data, const symbol::Symbol & sym)
71     {
72         data = _data;
73         data->add(sym);
74     }
75
76     inline void setValue(double _value)
77     {
78         knownValue = true;
79         value = _value;
80     }
81
82     inline void setValue(GVN::Value * _value)
83     {
84         gvnValue = _value;
85     }
86
87     inline GVN::Value * getValue()
88     {
89         return gvnValue;
90     }
91
92     inline bool asDouble(double & _value) const
93     {
94         if (knownValue)
95         {
96             _value = value;
97             return true;
98         }
99
100         return false;
101     }
102
103     inline bool isknown() const
104     {
105         return local == Local::INFO_TRUE;
106     }
107
108     inline static const symbol::Symbol & getRightSym(ast::Exp * exp)
109     {
110         return static_cast<const ast::SimpleVar &>(static_cast<const ast::AssignExp *>(exp)->getRightExp()).getSymbol();
111     }
112
113     inline const TIType & getType() const
114     {
115         return type;
116     }
117
118     friend std::wostream & operator<<(std::wostream & out, const Info & info)
119     {
120         out << L"Type: " << info.type << L" - RWO:"
121             << (info.R ? L"T" : L"F")
122             << (info.W ? L"T" : L"F")
123             << (info.O ? L"T" : L"F")
124             << L" - int:" << (info.isint ? L"T" : L"F")
125             << L" - local:" << (info.local == Local::INFO_TRUE ? L"T" : (info.local == Local::INFO_FALSE ? L"F" : L"U"))
126             << L" - cleared:" << (info.cleared ? L"T" : L"F")
127             << L" - exists:" << (info.exists ? L"T" : L"F");
128
129         if (info.knownValue)
130         {
131             out << L" - value:" << info.value;
132         }
133
134         if (info.gvnValue)
135         {
136             out << L" - GVN value:" << *info.gvnValue;
137         }
138
139         out << L" - data:";
140         if (info.data)
141         {
142             out << *info.data;
143         }
144         else
145         {
146             out << L"null";
147         }
148
149         return out;
150     }
151 };
152
153 } // namespace analysis
154
155 #endif // __INFO_HXX__