insert in struct corrected.
[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), m_pExpOwner(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), m_pExpOwner(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), m_pExpOwner(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     m_pExpOwner(false)
48 {
49 }
50
51 ExpHistory::~ExpHistory()
52 {
53     if (m_pExpOwner)
54     {
55         delete m_pExp;
56     }
57
58     if (m_piArgsDimsArray)
59     {
60         delete[] m_piArgsDimsArray;
61     }
62
63     if (m_pArgs && m_pArgsOwner)
64     {
65         types::typed_list::iterator iter = m_pArgs->begin();
66         for (; iter != m_pArgs->end(); ++iter)
67         {
68             (*iter)->killMe();
69         }
70
71         delete m_pArgs;
72         m_pArgs = NULL;
73     }
74 }
75
76 /**
77 ** Accessor (public)
78 */
79
80 void ExpHistory::setExp(ast::SimpleVar* _pExp)
81 {
82     m_pExp = _pExp;
83 }
84
85 ast::SimpleVar* ExpHistory::getExp()
86 {
87     return m_pExp;
88 }
89
90 std::wstring ExpHistory::getExpAsString()
91 {
92     std::wstring wcsExp = L"";
93     if (m_pExp)
94     {
95         wcsExp = m_pExp->name_get().name_get();
96     }
97
98     return wcsExp;
99 }
100
101 void ExpHistory::setArgs(types::typed_list* _pArgs)
102 {
103     if (m_pArgs && m_pArgsOwner)
104     {
105         delete m_pArgs;
106     }
107     m_pArgs = _pArgs;
108     m_pArgsOwner = true;
109 }
110
111 void ExpHistory::setArgsOwner(bool owner)
112 {
113     m_pArgsOwner = owner;
114 }
115
116 void ExpHistory::setExpOwner(bool owner)
117 {
118     m_pExpOwner = owner;
119 }
120
121 void ExpHistory::computeArgs()
122 {
123     if (m_pArgs)
124     {
125         m_iArgsDims = (int)m_pArgs->size();
126
127         // compute indexes
128         m_piArgsDimsArray  = new int[m_iArgsDims];
129
130         types::typed_list* pNewArgs = new types::typed_list();
131         int iCount = types::checkIndexesArguments(m_pITCurrent, m_pArgs, pNewArgs, m_piArgsDimsArray, NULL);
132
133         // Delete pArgs only if i'm the owner
134         // else it will be deleted by the expHistory
135         // which are the flag m_pArgsOwner = true
136         if (m_pArgsOwner)
137         {
138             delete m_pArgs;
139         }
140
141         m_pArgs = pNewArgs;
142         m_pArgsOwner = true;
143
144         int* piDimsArray = m_pITCurrent->getAs<types::GenericType>()->getDimsArray();
145         if (m_iArgsDims == 1)
146         {
147             if (m_pITCurrent->getAs<types::GenericType>()->getDims() == 2)
148             {
149                 if ( piDimsArray[1] == 1 ||
150                         piDimsArray[0] == 0 && piDimsArray[1] == 0)
151                 {
152                     int iTemp = m_piArgsDimsArray[0];
153                     delete[] m_piArgsDimsArray;
154                     m_piArgsDimsArray = new int[2];
155                     m_iArgsDims = 2;
156                     m_piArgsDimsArray[0] = iTemp;
157                     m_piArgsDimsArray[1] = 1;
158                 }
159                 else if (piDimsArray[0] == 1)
160                 {
161                     int iTemp = m_piArgsDimsArray[0];
162                     delete[] m_piArgsDimsArray;
163                     m_piArgsDimsArray = new int[2];
164                     m_iArgsDims = 2;
165                     m_piArgsDimsArray[0] = 1;
166                     m_piArgsDimsArray[1] = iTemp;
167                 }
168             }
169         }
170         else
171         {
172             const int size = std::min(m_iArgsDims, m_pITCurrent->getAs<types::GenericType>()->getDims());
173             for (int i = 0; i < size; i++)
174             {
175                 if (piDimsArray[i] > m_piArgsDimsArray[i])
176                 {
177                     m_piArgsDimsArray[i] = piDimsArray[i];
178                 }
179             }
180         }
181     }
182 }
183
184 types::typed_list* ExpHistory::getArgs()
185 {
186     return m_pArgs;
187 }
188
189 int ExpHistory::getSizeFromArgs()
190 {
191     int iSizeFromArgs = 0;
192
193     if (m_pArgs)
194     {
195         int size;
196         iSizeFromArgs = 1;
197         if (m_piArgsDimsArray == NULL)
198         {
199             computeArgs();
200         }
201
202         size = (int)m_pArgs->size();
203         for (int i = 0; i < size; i++)
204         {
205             iSizeFromArgs *= m_piArgsDimsArray[i];
206         }
207     }
208
209     return iSizeFromArgs;
210 }
211
212 int* ExpHistory::getArgsDimsArray()
213 {
214     if (m_pArgs)
215     {
216         if (m_piArgsDimsArray == NULL)
217         {
218             computeArgs();
219         }
220     }
221
222     return m_piArgsDimsArray;
223 }
224
225 int ExpHistory::getArgsDims()
226 {
227     if (m_pArgs)
228     {
229         if (m_piArgsDimsArray == NULL)
230         {
231             computeArgs();
232         }
233     }
234
235     return m_iArgsDims;
236 }
237
238 bool ExpHistory::needResize()
239 {
240     if (m_pArgs)
241     {
242         int iDims = m_pITCurrent->getAs<types::GenericType>()->getDims();
243
244         if (m_piArgsDimsArray == NULL)
245         {
246             computeArgs();
247         }
248
249         if (m_iArgsDims == 1)
250         {
251             int iSize = m_pITCurrent->getAs<types::GenericType>()->getSize();
252             if (iSize < m_piArgsDimsArray[0])
253             {
254                 return true;
255             }
256         }
257         else
258         {
259             if (iDims < m_iArgsDims)
260             {
261                 return true;
262             }
263
264             int* piDimsArray = m_pITCurrent->getAs<types::GenericType>()->getDimsArray();
265             for (int i = 0; i < m_iArgsDims; i++)
266             {
267                 if (piDimsArray[i] < m_piArgsDimsArray[i])
268                 {
269                     return true;
270                 }
271             }
272         }
273     }
274
275     return false;
276 }
277
278 bool ExpHistory::setCurrent(types::InternalType* _pITCurrent)
279 {
280     if (m_pITCurrent == _pITCurrent)
281     {
282         return false;
283     }
284
285     m_pITCurrent = _pITCurrent;
286     return true;
287 }
288
289 types::InternalType* ExpHistory::getCurrent()
290 {
291     return m_pITCurrent;
292 }
293
294 ExpHistory* ExpHistory::getParent()
295 {
296     return m_pParent;
297 }
298
299 void ExpHistory::setReinsertion()
300 {
301     if (m_pITCurrent != NULL && m_pITCurrent->isHandle() == false)
302     {
303         m_bReinsertMe = true;
304     }
305 }
306
307 void ExpHistory::resetReinsertion()
308 {
309     m_bReinsertMe = false;
310 }
311
312 bool ExpHistory::reinsertMe()
313 {
314     return m_bReinsertMe;
315 }
316
317 int ExpHistory::getWhereReinsert()
318 {
319     return m_iWhere;
320 }
321
322 void ExpHistory::setWhereReinsert(int _iWhere)
323 {
324     m_iWhere = _iWhere;
325 }
326
327 int ExpHistory::getLevel()
328 {
329     return m_iLevel;
330 }
331
332 void ExpHistory::setLevel(int _iLevel)
333 {
334     m_iLevel = _iLevel;
335 }
336
337 void ExpHistory::setCellExp()
338 {
339     m_bCellExp = true;
340 }
341
342 bool ExpHistory::isCellExp()
343 {
344     return m_bCellExp;
345 }