utf: ast 2
[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  *  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 #include <sstream>
14 #include "types.hxx"
15
16 extern "C"
17 {
18 #include "localization.h"
19 #include "charEncoding.h"
20 #include "os_string.h"
21 }
22
23
24
25 namespace types
26 {
27
28 static bool isCoordIndex(int _iIndex, int* _piCoord, int _iCoordCount)
29 {
30     bool bFind = false;
31     for (int j = 0 ; j < _iCoordCount ; j++)
32     {
33         if (_piCoord[j] == _iIndex)
34         {
35             bFind = true;
36             break;
37         }
38     }
39     return bFind;
40 }
41
42 std::string GenericType::DimToString()
43 {
44     std::ostringstream ostr;
45     ostr << getRows() << "x" << getCols();
46     return ostr.str();
47 }
48
49 bool GenericType::isScalar() //2 dims and each dim == 1
50 {
51     if (m_iDims == 2 && m_piDims[0] == 1 && m_piDims[1] == 1)
52     {
53         return true;
54     }
55
56     return false;
57 }
58
59 bool GenericType::isIdentity(void)
60 {
61     if (m_piDims)
62     {
63         for (int i = 0; i < getDims(); i++)
64         {
65             if (m_piDims[i] != -1)
66             {
67                 return false;
68             }
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