Analysis: infer when a refcount is required and add colors in DebugVisitor
[scilab.git] / scilab / modules / ast / includes / analysis / Result.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 __RESULT_HXX__
14 #define __RESULT_HXX__
15
16 #include <iostream>
17
18 #include "gvn/GVN.hxx"
19 #include "gvn/SymbolicDimension.hxx"
20 #include "gvn/SymbolicRange.hxx"
21 #include "TIType.hxx"
22 #include "tools.hxx"
23 #include "ConstantValue.hxx"
24
25 namespace analysis
26 {
27 class Result
28 {
29
30 public:
31
32     enum FnName { ZEROS, ONES, RAND, DUNNO };
33
34 private:
35
36     TIType type;
37     int tempId;
38     FnName fnname;
39     ConstantValue constant;
40     SymbolicRange range;
41     SymbolicDimension maxIndex;
42
43 public:
44
45     Result() : type(), tempId(-1) { }
46     Result(const TIType & _type, const int _tempId = -1) : type(_type), tempId(_tempId) { }
47     Result(TIType && _type, const int _tempId = -1) : type(_type), tempId(_tempId) { }
48
49     inline bool istemp() const
50     {
51         return tempId >= 0;
52     }
53
54     inline void setFnName(FnName _fnname)
55     {
56         fnname = _fnname;
57     }
58
59     inline FnName getFnName() const
60     {
61         return fnname;
62     }
63
64     inline const TIType & getType() const
65     {
66         return type;
67     }
68
69     inline TIType & getType()
70     {
71         return type;
72     }
73
74     inline int getTempId() const
75     {
76         return tempId;
77     }
78
79     inline bool isTemp() const
80     {
81         return tempId != -1;
82     }
83
84     inline bool hasGVNValue() const
85     {
86         return constant.getGVNValue() != nullptr;
87     }
88
89     inline ConstantValue & getConstant()
90     {
91         return constant;
92     }
93
94     inline const ConstantValue & getConstant() const
95     {
96         return constant;
97     }
98
99     inline ConstantValue & setConstant(ConstantValue & val)
100     {
101         constant = val;
102         return constant;
103     }
104
105     inline SymbolicRange & getRange()
106     {
107         return range;
108     }
109
110     inline const SymbolicRange & getRange() const
111     {
112         return range;
113     }
114
115     inline SymbolicRange & setRange(SymbolicRange & _range)
116     {
117         range = _range;
118         return range;
119     }
120
121     inline SymbolicRange & setRange(SymbolicRange && _range)
122     {
123         range = _range;
124         return range;
125     }
126
127     inline bool isAnInt() const
128     {
129         return hasGVNValue() || getRange().isValid();
130     }
131
132     inline SymbolicDimension & getMaxIndex()
133     {
134         return maxIndex;
135     }
136
137     inline const SymbolicDimension & getMaxIndex() const
138     {
139         return maxIndex;
140     }
141
142     inline SymbolicDimension & setMaxIndex(SymbolicDimension & _maxIndex)
143     {
144         maxIndex = _maxIndex;
145         return maxIndex;
146     }
147
148     inline SymbolicDimension & setMaxIndex(SymbolicDimension && _maxIndex)
149     {
150         maxIndex = _maxIndex;
151         return maxIndex;
152     }
153
154     friend std::wostream & operator<<(std::wostream & out, const Result & res)
155     {
156         out << L"Result {" << res.type;
157         if (res.tempId != -1)
158         {
159             out << L", temp id:" << res.tempId;
160         }
161         if (res.constant.isKnown())
162         {
163             out << L", constant:" << res.constant;
164         }
165         if (res.isAnInt())
166         {
167             out << L", isAnInt: T";
168         }
169         out << L'}';
170
171         return out;
172     }
173 };
174
175 } // namespace analysis
176
177 #endif // __RESULT_HXX__