c8fd68cdcd56510345d4f87569dc2ed6c1556cec
[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 pArgs only if i'm the owner
126         // else it will be deleted by the expHistory
127         // which are the flag m_pArgsOwner = true
128         if (m_pArgsOwner)
129         {
130             delete m_pArgs;
131         }
132
133         m_pArgs = pNewArgs;
134         m_pArgsOwner = true;
135
136         int* piDimsArray = m_pITCurrent->getAs<types::GenericType>()->getDimsArray();
137         if (m_iArgsDims == 1)
138         {
139             if (m_pITCurrent->getAs<types::GenericType>()->getDims() == 2)
140             {
141                 if ( piDimsArray[1] == 1 ||
142                         piDimsArray[0] == 0 && piDimsArray[1] == 0)
143                 {
144                     int iTemp = m_piArgsDimsArray[0];
145                     delete[] m_piArgsDimsArray;
146                     m_piArgsDimsArray = new int[2];
147                     m_iArgsDims = 2;
148                     m_piArgsDimsArray[0] = iTemp;
149                     m_piArgsDimsArray[1] = 1;
150                 }
151                 else if (piDimsArray[0] == 1)
152                 {
153                     int iTemp = m_piArgsDimsArray[0];
154                     delete[] m_piArgsDimsArray;
155                     m_piArgsDimsArray = new int[2];
156                     m_iArgsDims = 2;
157                     m_piArgsDimsArray[0] = 1;
158                     m_piArgsDimsArray[1] = iTemp;
159                 }
160             }
161         }
162         else
163         {
164             const int size = std::min(m_iArgsDims, m_pITCurrent->getAs<types::GenericType>()->getDims());
165             for (int i = 0; i < size; i++)
166             {
167                 if (piDimsArray[i] > m_piArgsDimsArray[i])
168                 {
169                     m_piArgsDimsArray[i] = piDimsArray[i];
170                 }
171             }
172         }
173     }
174 }
175
176 types::typed_list* ExpHistory::getArgs()
177 {
178     return m_pArgs;
179 }
180
181 int ExpHistory::getSizeFromArgs()
182 {
183     int iSizeFromArgs = 0;
184
185     if (m_pArgs)
186     {
187         int size;
188         iSizeFromArgs = 1;
189         if (m_piArgsDimsArray == NULL)
190         {
191             computeArgs();
192         }
193
194         size = (int)m_pArgs->size();
195         for (int i = 0; i < size; i++)
196         {
197             iSizeFromArgs *= m_piArgsDimsArray[i];
198         }
199     }
200
201     return iSizeFromArgs;
202 }
203
204 int* ExpHistory::getArgsDimsArray()
205 {
206     if (m_pArgs)
207     {
208         if (m_piArgsDimsArray == NULL)
209         {
210             computeArgs();
211         }
212     }
213
214     return m_piArgsDimsArray;
215 }
216
217 int ExpHistory::getArgsDims()
218 {
219     if (m_pArgs)
220     {
221         if (m_piArgsDimsArray == NULL)
222         {
223             computeArgs();
224         }
225     }
226
227     return m_iArgsDims;
228 }
229
230 bool ExpHistory::needResize()
231 {
232     if (m_pArgs)
233     {
234         int iDims = m_pITCurrent->getAs<types::GenericType>()->getDims();
235
236         if (m_piArgsDimsArray == NULL)
237         {
238             computeArgs();
239         }
240
241         if (m_iArgsDims == 1)
242         {
243             int iSize = m_pITCurrent->getAs<types::GenericType>()->getSize();
244             if (iSize < m_piArgsDimsArray[0])
245             {
246                 return true;
247             }
248         }
249         else
250         {
251             if (iDims < m_iArgsDims)
252             {
253                 return true;
254             }
255
256             int* piDimsArray = m_pITCurrent->getAs<types::GenericType>()->getDimsArray();
257             for (int i = 0; i < m_iArgsDims; i++)
258             {
259                 if (piDimsArray[i] < m_piArgsDimsArray[i])
260                 {
261                     return true;
262                 }
263             }
264         }
265     }
266
267     return false;
268 }
269
270 bool ExpHistory::setCurrent(types::InternalType* _pITCurrent)
271 {
272     if (m_pITCurrent == _pITCurrent)
273     {
274         return false;
275     }
276
277     m_pITCurrent = _pITCurrent;
278     return true;
279 }
280
281 types::InternalType* ExpHistory::getCurrent()
282 {
283     return m_pITCurrent;
284 }
285
286 ExpHistory* ExpHistory::getParent()
287 {
288     return m_pParent;
289 }
290
291 void ExpHistory::setReinsertion()
292 {
293     if (m_pITCurrent != NULL && m_pITCurrent->isHandle() == false)
294     {
295         m_bReinsertMe = true;
296     }
297 }
298
299 void ExpHistory::resetReinsertion()
300 {
301     m_bReinsertMe = false;
302 }
303
304 bool ExpHistory::reinsertMe()
305 {
306     return m_bReinsertMe;
307 }
308
309 int ExpHistory::getWhereReinsert()
310 {
311     return m_iWhere;
312 }
313
314 void ExpHistory::setWhereReinsert(int _iWhere)
315 {
316     m_iWhere = _iWhere;
317 }
318
319 int ExpHistory::getLevel()
320 {
321     return m_iLevel;
322 }
323
324 void ExpHistory::setLevel(int _iLevel)
325 {
326     m_iLevel = _iLevel;
327 }
328
329 void ExpHistory::setCellExp()
330 {
331     m_bCellExp = true;
332 }
333
334 bool ExpHistory::isCellExp()
335 {
336     return m_bCellExp;
337 }