c0d66dbbb2f0d203bc3eeb32545b32ee115bcff5
[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     if (m_piDims)
65     {
66         for (int i = 0; i < getDims(); i++)
67         {
68             if (m_piDims[i] != -1)
69             {
70                 return false;
71             }
72         }
73     }
74
75     return true;
76 }
77
78 bool GenericType::hasAllIndexesOfRow(int _iRow, int* _piCoord, int _iCoordCount)
79 {
80     bool bAll = true;
81     for (int i = 0; i < getCols(); i++)
82     {
83         //+1 to keep 1 based index
84         int iIdx = _iRow + i * getCols() + 1;
85
86
87         if (isCoordIndex(iIdx, _piCoord, _iCoordCount) == false)
88         {
89             bAll = false;
90             break;
91         }
92     }
93     return bAll;
94 }
95
96 bool GenericType::hasAllIndexesOfCol(int _iCol, int* _piCoord, int _iCoordCount)
97 {
98     bool bAll = true;
99     for (int i = 0; i < getRows(); i++)
100     {
101         //+1 to keep 1 based index
102         int iIdx = i + _iCol * getRows() + 1;
103
104
105         if (isCoordIndex(iIdx, _piCoord, _iCoordCount) == false)
106         {
107             bAll = false;
108             break;
109         }
110     }
111     return bAll;
112 }
113
114 int GenericType::getVarMaxDim(int _iCurrentDim, int _iMaxDim)
115 {
116     int iDim = 1;
117     if (m_iDims != 0)
118     {
119         if (_iMaxDim < m_iDims)
120         {
121             //view as "vector", not all dimensions are used
122             if (_iCurrentDim == (_iMaxDim - 1))
123             {
124                 for (int i = _iCurrentDim; i < m_iDims; i++)
125                 {
126                     iDim *= m_piDims[i];
127                 }
128             }
129             else
130             {
131                 iDim = m_piDims[_iCurrentDim];
132             }
133         }
134         else if (_iCurrentDim >= m_iDims)
135         {
136             iDim = 1;
137         }
138         else
139         {
140             //normal view, all dimensions are used
141             iDim = m_piDims[_iCurrentDim];
142         }
143     }
144     else
145     {
146         //for non ArrayOf derived types, like list, tlist, mlist
147         iDim = getSize();
148     }
149
150     return iDim;
151 }
152 }
153