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