Analysis: infer when a refcount is required and add colors in DebugVisitor
[scilab.git] / scilab / modules / ast / includes / analysis / data / TypeLocal.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2015 - 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 __TYPE_LOCAL_HXX__
14 #define __TYPE_LOCAL_HXX__
15
16 #include <iostream>
17
18 #include "TIType.hxx"
19
20 namespace analysis
21 {
22
23     struct TypeLocal
24     {
25         TIType::Type type;
26         int rows;
27         int cols;
28         bool isAnInt;
29
30         TypeLocal(const TIType::Type _type, const int _rows, const int _cols, const bool _isAnInt) : type(_type), rows(_rows), cols(_cols), isAnInt(_isAnInt) { }
31
32         TypeLocal(const TypeLocal & tl) : type(tl.type), rows(tl.rows), cols(tl.cols), isAnInt(tl.isAnInt) { } 
33         
34         inline bool operator<(const TypeLocal & R) const
35             {
36                 return type < R.type || (type == R.type && (rows < R.rows || (rows == R.rows && (cols < R.cols || (cols == R.cols && (int)isAnInt < (int)R.isAnInt)))));
37             }
38
39         inline bool operator==(const TypeLocal & R) const
40             {
41                 return type == R.type && rows == R.rows && cols == R.cols && isAnInt == R.isAnInt;
42             }
43
44         inline bool isScalar() const
45             {
46                 return rows == 1 && cols == 1;
47             }
48
49         inline bool isKnown() const
50             {
51                 return rows != -1;
52             }
53
54         inline int totalSize() const
55             {
56                 return isKnown() ? (rows * cols) : -1;
57             }
58
59         inline static TypeLocal get(const TIType & type, const bool isAnInt = false)
60             {
61                 if (type.isConstantDims())
62                 {
63                     return TypeLocal(type.type, type.rows.getConstant(), type.cols.getConstant(), isAnInt);
64                 }
65                 else
66                 {
67                     return TypeLocal(type.type, -1, -1, false);
68                 }       
69             }
70
71         friend std::wostream & operator<<(std::wostream & out, const TypeLocal & tl)
72             {
73                 out << TIType::toString(tl.type);
74                 if (tl.isAnInt)
75                 {
76                     out << L"(int64_t)";
77                 }
78                 out << L" ";
79                 if (tl.rows == -1 || tl.cols == -1)
80                 {
81                     out << L"?x?";
82                 }
83                 else
84                 {
85                     out << tl.rows << L'x' << tl.cols;
86                 }
87                 return out;
88             }
89     };
90
91 } // namespace analysis
92
93 #endif // __TYPE_LOCAL_HXX__