Replace Min, Max and Abs by std::min, std::max and std::abs
[scilab.git] / scilab / modules / ast / src / cpp / ast / expHistory.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2014 - Scilab Enterprises - Cedric Delamarre
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 "expHistory.hxx"
14 #include "types_tools.hxx"
15 #include "types.hxx"
16 #include "context.hxx"
17
18 /**
19 ** Constructor & Destructor (public)
20 */
21
22 ExpHistory::ExpHistory() : m_pArgs(NULL), m_piArgsDimsArray(NULL), m_pExp(NULL), m_pParent(NULL), m_pITCurrent(NULL), m_bReinsertMe(false), m_bCellExp(false), m_iArgsDims(0), m_iWhere(-1), m_iLevel(0), m_pArgsOwner(false)
23 {
24 }
25
26
27 ExpHistory::ExpHistory(ExpHistory* _pEH, ast::SimpleVar* _pExp) : m_pArgs(NULL), m_piArgsDimsArray(NULL), m_pExp(_pExp), m_pParent(_pEH), m_pITCurrent(NULL), m_bReinsertMe(false), m_bCellExp(false), m_iArgsDims(0), m_iWhere(-1), m_iLevel(0), m_pArgsOwner(false)
28 {
29 }
30
31 ExpHistory::ExpHistory(ExpHistory* _pParent, types::typed_list* _pArgs) : m_pArgs(_pArgs), m_piArgsDimsArray(NULL), m_pExp(NULL), m_pParent(_pParent), m_pITCurrent(NULL), m_bReinsertMe(false), m_bCellExp(false), m_iArgsDims(0), m_iWhere(-1), m_iLevel(0), m_pArgsOwner(false)
32 {
33 }
34
35 ExpHistory::ExpHistory(ExpHistory* _pParent, ast::SimpleVar* _pExp, types::typed_list* _pArgs, int _iLevel,  bool _bCellExp, types::InternalType* _pITCurrent) :
36     m_pArgs(_pArgs),
37     m_piArgsDimsArray(NULL),
38     m_pExp(_pExp),
39     m_pParent(_pParent),
40     m_pITCurrent(_pITCurrent),
41     m_bReinsertMe(false),
42     m_bCellExp(_bCellExp),
43     m_iArgsDims(0),
44     m_iWhere(-1),
45     m_iLevel(_iLevel),
46     m_pArgsOwner(false)
47 {
48 }
49
50 ExpHistory::~ExpHistory()
51 {
52     if (m_piArgsDimsArray)
53     {
54         delete[] m_piArgsDimsArray;
55     }
56
57     if (m_pArgs && m_pArgsOwner)
58     {
59         types::typed_list::iterator iter = m_pArgs->begin();
60         for (; iter != m_pArgs->end(); ++iter)
61         {
62             if ((*iter)->isDeletable())
63             {
64                 delete *iter;
65             }
66         }
67
68         delete m_pArgs;
69         m_pArgs = NULL;
70     }
71 }
72
73 /**
74 ** Accessor (public)
75 */
76
77 void ExpHistory::setExp(ast::SimpleVar* _pExp)
78 {
79     m_pExp = _pExp;
80 }
81
82 ast::SimpleVar* ExpHistory::getExp()
83 {
84     return m_pExp;
85 }
86
87 std::wstring ExpHistory::getExpAsString()
88 {
89     std::wstring wcsExp = L"";
90     if (m_pExp)
91     {
92         wcsExp = m_pExp->name_get().name_get();
93     }
94
95     return wcsExp;
96 }
97
98 void ExpHistory::setArgs(types::typed_list* _pArgs)
99 {
100     if (m_pArgs && m_pArgsOwner)
101     {
102         delete m_pArgs;
103     }
104     m_pArgs = _pArgs;
105     m_pArgsOwner = true;
106 }
107
108 void ExpHistory::setArgsOwner(bool owner)
109 {
110     m_pArgsOwner = owner;
111 }
112
113 void ExpHistory::computeArgs()
114 {
115     if (m_pArgs)
116     {
117         m_iArgsDims = (int)m_pArgs->size();
118
119         // compute indexes
120         m_piArgsDimsArray  = new int[m_iArgsDims];
121
122         types::typed_list* pNewArgs = new types::typed_list();
123         int iCount = types::checkIndexesArguments(m_pITCurrent, m_pArgs, pNewArgs, m_piArgsDimsArray, NULL);
124
125         delete m_pArgs;
126         m_pArgs = pNewArgs;
127         m_pArgsOwner = true;
128
129         int* piDimsArray = m_pITCurrent->getAs<types::GenericType>()->getDimsArray();
130         if (m_iArgsDims == 1)
131         {
132             if (m_pITCurrent->getAs<types::GenericType>()->getDims() == 2)
133             {
134                 if ( piDimsArray[1] == 1 ||
135                         piDimsArray[0] == 0 && piDimsArray[1] == 0)
136                 {
137                     int iTemp = m_piArgsDimsArray[0];
138                     delete[] m_piArgsDimsArray;
139                     m_piArgsDimsArray = new int[2];
140                     m_iArgsDims = 2;
141                     m_piArgsDimsArray[0] = iTemp;
142                     m_piArgsDimsArray[1] = 1;
143                 }
144                 else if (piDimsArray[0] == 1)
145                 {
146                     int iTemp = m_piArgsDimsArray[0];
147                     delete[] m_piArgsDimsArray;
148                     m_piArgsDimsArray = new int[2];
149                     m_iArgsDims = 2;
150                     m_piArgsDimsArray[0] = 1;
151                     m_piArgsDimsArray[1] = iTemp;
152                 }
153             }
154         }
155         else
156         {
157             const int size = std::min(m_iArgsDims, m_pITCurrent->getAs<types::GenericType>()->getDims());
158             for (int i = 0; i < size; i++)
159             {
160                 if (piDimsArray[i] > m_piArgsDimsArray[i])
161                 {
162                     m_piArgsDimsArray[i] = piDimsArray[i];
163                 }
164             }
165         }
166     }
167 }
168
169 types::typed_list* ExpHistory::getArgs()
170 {
171     return m_pArgs;
172 }
173
174 int ExpHistory::getSizeFromArgs()
175 {
176     int iSizeFromArgs = 0;
177
178     if (m_pArgs)
179     {
180         int size;
181         iSizeFromArgs = 1;
182         if (m_piArgsDimsArray == NULL)
183         {
184             computeArgs();
185         }
186
187         size = m_pArgs->size();
188         for (int i = 0; i < size; i++)
189         {
190             iSizeFromArgs *= m_piArgsDimsArray[i];
191         }
192     }
193
194     return iSizeFromArgs;
195 }
196
197 int* ExpHistory::getArgsDimsArray()
198 {
199     if (m_pArgs)
200     {
201         if (m_piArgsDimsArray == NULL)
202         {
203             computeArgs();
204         }
205     }
206
207     return m_piArgsDimsArray;
208 }
209
210 int ExpHistory::getArgsDims()
211 {
212     if (m_pArgs)
213     {
214         if (m_piArgsDimsArray == NULL)
215         {
216             computeArgs();
217         }
218     }
219
220     return m_iArgsDims;
221 }
222
223 bool ExpHistory::needResize()
224 {
225     if (m_pArgs)
226     {
227         int iDims = m_pITCurrent->getAs<types::GenericType>()->getDims();
228
229         if (m_piArgsDimsArray == NULL)
230         {
231             computeArgs();
232         }
233
234         if (m_iArgsDims == 1)
235         {
236             int iSize = m_pITCurrent->getAs<types::GenericType>()->getSize();
237             if (iSize < m_piArgsDimsArray[0])
238             {
239                 return true;
240             }
241         }
242         else
243         {
244             if (iDims < m_iArgsDims)
245             {
246                 return true;
247             }
248
249             int* piDimsArray = m_pITCurrent->getAs<types::GenericType>()->getDimsArray();
250             for (int i = 0; i < m_iArgsDims; i++)
251             {
252                 if (piDimsArray[i] < m_piArgsDimsArray[i])
253                 {
254                     return true;
255                 }
256             }
257         }
258     }
259
260     return false;
261 }
262
263 bool ExpHistory::setCurrent(types::InternalType* _pITCurrent)
264 {
265     if (m_pITCurrent == _pITCurrent)
266     {
267         return false;
268     }
269
270     m_pITCurrent = _pITCurrent;
271     return true;
272 }
273
274 types::InternalType* ExpHistory::getCurrent()
275 {
276     return m_pITCurrent;
277 }
278
279 ExpHistory* ExpHistory::getParent()
280 {
281     return m_pParent;
282 }
283
284 void ExpHistory::setReinsertion()
285 {
286     if (m_pITCurrent != NULL && m_pITCurrent->isHandle() == false)
287     {
288         m_bReinsertMe = true;
289     }
290 }
291
292 void ExpHistory::resetReinsertion()
293 {
294     m_bReinsertMe = false;
295 }
296
297 bool ExpHistory::reinsertMe()
298 {
299     return m_bReinsertMe;
300 }
301
302 int ExpHistory::getWhereReinsert()
303 {
304     return m_iWhere;
305 }
306
307 void ExpHistory::setWhereReinsert(int _iWhere)
308 {
309     m_iWhere = _iWhere;
310 }
311
312 int ExpHistory::getLevel()
313 {
314     return m_iLevel;
315 }
316
317 void ExpHistory::setLevel(int _iLevel)
318 {
319     m_iLevel = _iLevel;
320 }
321
322 void ExpHistory::setCellExp()
323 {
324     m_bCellExp = true;
325 }
326
327 bool ExpHistory::isCellExp()
328 {
329     return m_bCellExp;
330 }