[ast] improved polynomial display with unicode superscripts
[scilab.git] / scilab / modules / ast / src / cpp / types / types.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2008-2008 - DIGITEO - Antoine ELIAS
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 #include <sstream>
17 #include "types.hxx"
18
19 extern "C"
20 {
21 #include "localization.h"
22 #include "charEncoding.h"
23 #include "os_string.h"
24 }
25
26
27
28 namespace types
29 {
30
31 static bool isCoordIndex(int _iIndex, int* _piCoord, int _iCoordCount)
32 {
33     bool bFind = false;
34     for (int j = 0 ; j < _iCoordCount ; j++)
35     {
36         if (_piCoord[j] == _iIndex)
37         {
38             bFind = true;
39             break;
40         }
41     }
42     return bFind;
43 }
44
45 std::wstring GenericType::DimToString()
46 {
47     std::wostringstream ostr;
48     ostr << getRows() << L"x" << getCols();
49     return ostr.str();
50 }
51
52 bool GenericType::isScalar() //2 dims and each dim == 1
53 {
54     if (m_iDims == 2 && m_piDims[0] == 1 && m_piDims[1] == 1)
55     {
56         return true;
57     }
58
59     return false;
60 }
61
62 bool GenericType::isIdentity(void)
63 {
64     for (int i = 0; i < getDims(); i++)
65     {
66         if (m_piDims[i] != -1)
67         {
68             return false;
69         }
70     }
71
72     return true;
73 }
74
75 bool GenericType::hasAllIndexesOfRow(int _iRow, int* _piCoord, int _iCoordCount)
76 {
77     bool bAll = true;
78     for (int i = 0; i < getCols(); i++)
79     {
80         //+1 to keep 1 based index
81         int iIdx = _iRow + i * getCols() + 1;
82
83
84         if (isCoordIndex(iIdx, _piCoord, _iCoordCount) == false)
85         {
86             bAll = false;
87             break;
88         }
89     }
90     return bAll;
91 }
92
93 bool GenericType::hasAllIndexesOfCol(int _iCol, int* _piCoord, int _iCoordCount)
94 {
95     bool bAll = true;
96     for (int i = 0; i < getRows(); i++)
97     {
98         //+1 to keep 1 based index
99         int iIdx = i + _iCol * getRows() + 1;
100
101
102         if (isCoordIndex(iIdx, _piCoord, _iCoordCount) == false)
103         {
104             bAll = false;
105             break;
106         }
107     }
108     return bAll;
109 }
110
111 int GenericType::getVarMaxDim(int _iCurrentDim, int _iMaxDim)
112 {
113     int iDim = 1;
114     if (m_iDims != 0)
115     {
116         if (_iMaxDim < m_iDims)
117         {
118             //view as "vector", not all dimensions are used
119             if (_iCurrentDim == (_iMaxDim - 1))
120             {
121                 for (int i = _iCurrentDim; i < m_iDims; i++)
122                 {
123                     iDim *= m_piDims[i];
124                 }
125             }
126             else
127             {
128                 iDim = m_piDims[_iCurrentDim];
129             }
130         }
131         else if (_iCurrentDim >= m_iDims)
132         {
133             iDim = 1;
134         }
135         else
136         {
137             //normal view, all dimensions are used
138             iDim = m_piDims[_iCurrentDim];
139         }
140     }
141     else
142     {
143         //for non ArrayOf derived types, like list, tlist, mlist
144         iDim = getSize();
145     }
146
147     return iDim;
148 }
149 }
150