2bb4e89f2a3f369d4facf155a4477251647ae051
[scilab.git] / scilab / modules / ast / src / cpp / types / bool.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 "bool.hxx"
15 #include "boolexp.hxx"
16 #include "tostring_common.hxx"
17 #include "configvariable.hxx"
18 #include "type_traits.hxx"
19
20 extern "C"
21 {
22 #include "core_math.h"
23 }
24
25 namespace types
26 {
27 Bool::~Bool()
28 {
29     if (isDeletable() == true)
30     {
31         deleteAll();
32     }
33
34     delete m_pRealData;
35 #ifndef NDEBUG
36     Inspector::removeItem(this);
37 #endif
38 }
39
40 Bool::Bool(int _iRows, int _iCols)
41 {
42     int piDims[2]   = {_iRows, _iCols};
43     int *piBool = NULL;
44     create(piDims, 2, &piBool, NULL);
45 #ifndef NDEBUG
46     Inspector::addItem(this);
47 #endif
48 }
49
50 Bool::Bool(int _iReal)
51 {
52     int piDims[2]   = {1, 1};
53     int *piBool = NULL;
54     create(piDims, 2, &piBool, NULL);
55     piBool[0] = _iReal == 0 ? 0 : 1;
56 #ifndef NDEBUG
57     Inspector::addItem(this);
58 #endif
59 }
60
61 Bool::Bool(int _iRows, int _iCols, int **_piData)
62 {
63     int piDims[2] = {_iRows, _iCols};
64     create(piDims, 2, _piData, NULL);
65 #ifndef NDEBUG
66     Inspector::addItem(this);
67 #endif
68 }
69
70 Bool::Bool(int _iDims, int* _piDims)
71 {
72     int* piData = NULL;
73     create(_piDims, _iDims, &piData, NULL);
74 #ifndef NDEBUG
75     Inspector::addItem(this);
76 #endif
77 }
78
79 InternalType* Bool::clone()
80 {
81     Bool *pbClone =  new Bool(getDims(), getDimsArray());
82     pbClone->set(get());
83     return pbClone;
84 }
85
86 void Bool::whoAmI()
87 {
88     std::cout << "types::Bool";
89 }
90
91 bool Bool::setFalse()
92 {
93     for (int i = 0 ; i < getSize() ; i++)
94     {
95         set(i, 0);
96     }
97     return true;
98 }
99
100 bool Bool::setTrue()
101 {
102     for (int i = 0 ; i < getSize() ; i++)
103     {
104         set(i, 1);
105     }
106     return true;
107 }
108
109 bool Bool::subMatrixToString(std::wostringstream& ostr, int* _piDims, int /*_iDims*/)
110 {
111     int iCurrentLine = 0;
112     int iLineLen = ConfigVariable::getConsoleWidth();
113     int iMaxLines = ConfigVariable::getConsoleLines();
114
115     if (isScalar())
116     {
117         //scalar
118         _piDims[0] = 0;
119         _piDims[1] = 0;
120         int iPos = getIndex(_piDims);
121         ostr << (get(iPos) == 1 ? L"  T" : L"  F");
122         ostr << std::endl;
123     }
124     else if (getCols() == 1)
125     {
126         //column vector
127         for (int i = m_iRows1PrintState ; i < getRows() ; i++)
128         {
129             iCurrentLine++;
130             if ((iMaxLines == 0 && iCurrentLine >= MAX_LINES) || (iMaxLines != 0 && iCurrentLine >= iMaxLines))
131             {
132                 m_iRows1PrintState = i;
133                 return false;
134             }
135
136             _piDims[1] = 0;
137             _piDims[0] = i;
138             int iPos = getIndex(_piDims);
139             ostr << (get(iPos) ? L" T" : L" F");
140             ostr << std::endl;
141         }
142     }
143     else if (getRows() == 1)
144     {
145         //row vector
146         std::wostringstream ostemp;
147         int iLastVal = m_iCols1PrintState;
148         int iLen = 0;
149
150         for (int i = m_iCols1PrintState ; i < getCols() ; i++)
151         {
152             _piDims[0] = 0;
153             _piDims[1] = i;
154             int iPos = getIndex(_piDims);
155
156             if (iLen + 2 >= iLineLen)
157             {
158                 iCurrentLine += 4; //"column x to Y" + empty line + value + empty line
159                 if ((iMaxLines == 0 && iCurrentLine >= MAX_LINES) || (iMaxLines != 0 && iCurrentLine >= iMaxLines))
160                 {
161                     m_iCols1PrintState = iLastVal;
162                     return false;
163                 }
164
165                 ostr << std::endl << L"       column " << iLastVal + 1 << L" to " << i << std::endl << std::endl;
166                 ostr << L" " << ostemp.str() << std::endl;
167                 ostemp.str(L"");
168                 iLastVal = i;
169                 iLen = 0;
170             }
171
172             ostemp << (get(iPos) ? L" T" : L" F");
173             iLen += 2;
174         }
175
176         if (iLastVal != 0)
177         {
178             ostr << std::endl << L"       column " << iLastVal + 1 << L" to " << getCols() << std::endl << std::endl;
179         }
180         ostr << L" " << ostemp.str() << std::endl;
181     }
182     else
183     {
184         std::wostringstream ostemp;
185         int iLen = 0;
186         int iLastCol = m_iCols1PrintState;
187
188         //compute the row size for padding for each printed bloc.
189         for (int iCols1 = m_iCols1PrintState ; iCols1 < getCols() ; iCols1++)
190         {
191             if (iLen + 2 > iLineLen)
192             {
193                 //find the limit, print this part
194                 for (int iRows2 = m_iRows2PrintState ; iRows2 < getRows() ; iRows2++)
195                 {
196                     iCurrentLine++;
197                     if ((iMaxLines == 0 && iCurrentLine >= MAX_LINES) ||
198                             ( (iMaxLines != 0 && iCurrentLine + 3 >= iMaxLines && iRows2 == m_iRows2PrintState) ||
199                               (iMaxLines != 0 && iCurrentLine + 1 >= iMaxLines && iRows2 != m_iRows2PrintState)))
200                     {
201                         if (m_iRows2PrintState == 0 && iRows2 != 0)
202                         {
203                             //add header
204                             ostr << std::endl << L"       column " << iLastCol + 1 << L" to " << iCols1 << std::endl << std::endl;
205                         }
206                         ostr << L" " << ostemp.str();
207                         m_iRows2PrintState = iRows2;
208                         m_iCols1PrintState = iLastCol;
209                         return false;
210                     }
211
212                     for (int iCols2 = iLastCol ; iCols2 < iCols1 ; iCols2++)
213                     {
214                         _piDims[0] = iRows2;
215                         _piDims[1] = iCols2;
216                         int iPos = getIndex(_piDims);
217                         ostemp << (get(iPos) == 0 ? L" F" : L" T");
218                     }
219                     ostemp << std::endl << L" ";
220                 }
221                 iLen = 0;
222                 iCurrentLine++;
223                 if (m_iRows2PrintState == 0)
224                 {
225                     iCurrentLine += 3;
226                     ostr << std::endl << L"       column " << iLastCol + 1 << L" to " << iCols1 << std::endl << std::endl;
227                 }
228
229                 ostr << L" " << ostemp.str();
230                 ostemp.str(L"");
231                 iLastCol = iCols1;
232                 m_iRows2PrintState = 0;
233                 m_iCols1PrintState = 0;
234             }
235             iLen += 2;
236         }
237
238         for (int iRows2 = m_iRows2PrintState ; iRows2 < getRows() ; iRows2++)
239         {
240             iCurrentLine++;
241             if ((iMaxLines == 0 && iCurrentLine >= MAX_LINES) || (iMaxLines != 0 && iCurrentLine >= iMaxLines))
242             {
243                 if (m_iRows2PrintState == 0 && iLastCol != 0)
244                 {
245                     //add header
246                     ostr << std::endl << L"       column " << iLastCol + 1 << L" to " << getCols() << std::endl << std::endl;
247                 }
248
249                 ostr << ostemp.str();
250                 m_iRows2PrintState = iRows2;
251                 m_iCols1PrintState = iLastCol;
252                 return false;
253             }
254
255             for (int iCols2 = iLastCol ; iCols2 < getCols() ; iCols2++)
256             {
257                 _piDims[0] = iRows2;
258                 _piDims[1] = iCols2;
259                 int iPos = getIndex(_piDims);
260
261                 ostemp << (get(iPos) == 0 ? L" F" : L" T");
262             }
263             ostemp << std::endl << L" ";
264         }
265         if (m_iRows2PrintState == 0 && iLastCol != 0)
266         {
267             ostr << std::endl << L"       column " << iLastCol + 1 << L" to " << getCols() << std::endl << std::endl;
268         }
269         ostr << ostemp.str();
270     }
271
272     return true;
273 }
274
275 bool Bool::operator==(const InternalType& it)
276 {
277     if (const_cast<InternalType &>(it).isBool() == false)
278     {
279         return false;
280     }
281
282     Bool* pb = const_cast<InternalType &>(it).getAs<types::Bool>();
283
284     if (pb->getDims() != getDims())
285     {
286         return false;
287     }
288
289     for (int i = 0 ; i < getDims() ; i++)
290     {
291         if (pb->getDimsArray()[i] != getDimsArray()[i])
292         {
293             return false;
294         }
295     }
296
297     if (memcmp(get(), pb->get(), getSize() * sizeof(int)) != 0)
298     {
299         return false;
300     }
301     return true;
302 }
303
304 bool Bool::operator!=(const InternalType& it)
305 {
306     return !(*this == it);
307 }
308
309 int Bool::getNullValue()
310 {
311     return 0;
312 }
313
314 Bool* Bool::createEmpty(int _iDims, int* _piDims, bool /*_bComplex*/)
315 {
316     return new Bool(_iDims, _piDims);
317 }
318
319 int Bool::copyValue(int _iData)
320 {
321     return _iData == 0 ? 0 : 1;
322 }
323
324 void Bool::deleteAll()
325 {
326     delete[] m_pRealData;
327     m_pRealData = NULL;
328     deleteImg();
329 }
330
331 void Bool::deleteImg()
332 {
333 }
334
335 int* Bool::allocData(int _iSize)
336 {
337     return new int[_iSize];
338 }
339
340 ast::Exp* Bool::getExp(const Location& loc)
341 {
342     return new ast::BoolExp(loc, this);
343 }
344
345 bool Bool::transpose(InternalType *& out)
346 {
347     return type_traits::transpose(*this, out);
348 }
349
350 }