2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2010 - DIGITEO - Antoine ELIAS
5 * Copyright (C) 2012 - 2016 - Scilab Enterprises
7 * This file is hereby licensed under the terms of the GNU GPL v2.0,
8 * pursuant to article 5.3.4 of the CeCILL v.2.1.
9 * This file was originally licensed under the terms of the CeCILL v2.1,
10 * and continues to be available under such terms.
11 * For more information, see the COPYING file which you should have received
12 * along with this program.
16 #include "arrayof.hxx"
19 #include "singlepoly.hxx"
20 #include "singlestruct.hxx"
21 #include "type_traits.hxx"
23 #include "types_tools.hxx"
27 #include "dynlib_ast.h"
33 static int get_max_size(int* _piDims, int _iDims)
41 for (int i = 0 ; i < _iDims ; i++)
49 GenericType* ArrayOf<T>::createEmpty()
51 return createEmptyDouble();
55 void ArrayOf<T>::getIndexes(int _iIndex, int* _piIndexes)
57 getIndexesWithDims(_iIndex, _piIndexes, m_piDims, m_iDims);
61 ArrayOf<T>* ArrayOf<T>::insert(typed_list* _pArgs, InternalType* _pSource)
63 ArrayOf<T>* pIT = checkRef(this, &ArrayOf::insert, _pArgs, _pSource);
70 if (getScalarIndex(this, _pArgs, &index))
72 ArrayOf* pIns = _pSource->getAs<ArrayOf>();
73 int sizeIn = pIns->getSize();
74 //only scalar can be used to ".=" operation
80 T* pRealData = pIns->get();
81 T* pImgData = pIns->getImg();
83 if (isComplex() == false && pIns->isComplex() == false)
85 if (isNativeType() && index < m_iSize)
87 m_pRealData[index] = *pRealData;
92 if (set(index, *pRealData) != NULL)
102 std::vector<int> indexes;
103 std::vector<int> dims;
104 if (getImplicitIndex(this, _pArgs, indexes, dims))
106 if (indexes.size() == 0)
111 ArrayOf* pIns = _pSource->getAs<ArrayOf>();
112 int sizeIn = pIns->getSize();
113 int count = static_cast<int>(indexes.size());
114 //only scalar can be used to ".=" operation
115 if (sizeIn != 1 && count != sizeIn)
120 T* pRealData = pIns->get();
121 T* pImgData = pIns->getImg();
124 if (isComplex() == false && pIns->isComplex() == false)
130 for (int i : indexes)
138 m_pRealData[i] = *pRealData;
143 for (int i : indexes)
145 if (set(i, *pRealData) == NULL)
157 for (int i : indexes)
165 m_pRealData[i] = *pRealData;
171 for (int i : indexes)
173 if (set(i, *pRealData) == NULL)
188 //if status is false, continue to entire process
192 bool bNeedToResize = false;
193 int iDims = (int)_pArgs->size();
194 int iDimsOrigine = m_iDims;
197 int* piMaxDim = new int[iDims];
198 int* piCountDim = new int[iDims];
201 int* piNewDims = NULL;
203 ArrayOf* pSource = _pSource->getAs<ArrayOf>();
205 bool bIsColon = false;
207 //evaluate each argument and replace by appropriate value and compute the count of combinations
208 int iSeqCount = checkIndexesArguments(this, _pArgs, &pArg, piMaxDim, piCountDim);
214 cleanIndexesArguments(_pArgs, &pArg);
218 //only scalar can be used to ".=" operation
219 if (iSeqCount != pSource->getSize() && pSource->isScalar() == false)
224 //remove last dimension at size 1
225 //remove last dimension if are == 1
226 for (int i = (iDims - 1); i >= m_iDims; i--)
228 if (piMaxDim[i] == 1)
231 pArg.back()->killMe();
241 if (iDims >= m_iDims)
243 //all case are good, we can do almost everything
244 //check if resize is needed
247 bNeedToResize = true;
249 else //_iDims == m_iDims
251 for (int i = 0; i < m_iDims; i++)
253 if (m_piDims[i] < piMaxDim[i])
255 bNeedToResize = true;
261 //determine new dimension of the matrix
262 if (bNeedToResize == true)
265 piNewDims = new int[iNewDims];
266 for (int i = 0; i < m_iDims; i++)
268 piNewDims[i] = std::max(piMaxDim[i], m_piDims[i]);
271 int iSource = (pSource->getDims() - 1);
272 bool bPassed = false;
273 int *piSourceDims = pSource->getDimsArray();
275 for (int i = m_iDims; i < iNewDims; ++i)
277 piNewDims[i] = piMaxDim[i];
281 else // _iDims < m_iDims
283 if (isVector() || isScalar() || getSize() == 0) //getSize() == 0, only for [] and {}
285 if (getSize() < piMaxDim[0])
287 bNeedToResize = true;
289 piNewDims = new int[2];
291 if (getCols() == 1 || getSize() == 0)
294 piNewDims[0] = piMaxDim[0];
297 else if (getRows() == 1)
301 piNewDims[1] = piMaxDim[0];
307 //each index before last index must be in range of his dimension
308 //and last given dimension can not be > prod(last dimensions)
309 for (int i = 0; i < iDims - 1; i++)
311 //indexes are always doubles
312 double* pIdx = getDoubleArrayFromDouble(pArg[i]);
313 //InternalType* pVar = pArg[i];
314 //double* pIdx = static_cast<double*>(pVar->getAs<Double>()->get());
315 int iSize = pArg[i]->getAs<ArrayOf>()->getSize();
316 for (int j = 0; j < iSize; j++)
318 if (pIdx[j] > m_piDims[i])
323 cleanIndexesArguments(_pArgs, &pArg);
330 int iMaxLastDim = getVarMaxDim(iDims - 1, iDims);
331 double* pIdx = getDoubleArrayFromDouble(pArg[pArg.size() - 1]);
332 //InternalType* pVar = pArg[pArg.size() - 1];
333 //double* pIdx = static_cast<double*>(pVar->getAs<Double>()->get());
334 int iSize = pArg[pArg.size() - 1]->getAs<GenericType>()->getSize();
335 for (int i = 0; i < iSize; i++)
337 if (pIdx[i] > iMaxLastDim)
342 cleanIndexesArguments(_pArgs, &pArg);
349 //before resize, check input dimension
352 ArrayOf<T>* pTemp = resize(piNewDims, iNewDims);
358 cleanIndexesArguments(_pArgs, &pArg);
364 piNewDims = m_piDims;
369 if (pSource->isComplex() && m_pImgData == NULL)
374 int argSize = static_cast<int>(pArg.size());
375 int* piIndex = new int[argSize];
376 int* piCoord = new int[argSize];
377 int* piViewDims = new int[iDims];
378 memset(piIndex, 0x00, sizeof(int) * argSize);
380 //convert current dimension to view dimension
381 for (int i = 0; i < iDims; i++)
383 piViewDims[i] = getVarMaxDim(i, iDims);
386 T* pRealData = pSource->get();
387 T* pImgData = pSource->getImg();
388 bool bComplex = pSource->isComplex();
390 for (int i = 0; i < iSeqCount; i++)
392 computeTuples(piCountDim, argSize, argSize - 1, piIndex);
395 for (int j = 0; j < argSize; j++)
397 piCoord[j] = getIntValueFromDouble(pArg[j], piIndex[j]) - 1;
398 //InternalType* pVar = pArg[j];
399 //piCoord[j] = static_cast<int>(pVar->getAs<Double>()->get(piIndex[j]) - 1);
400 //std::cout << piCoord[j] << " ";
403 //std::cout << "]" << std::endl;
405 int iPos = getIndexWithDims(piCoord, piViewDims, iDims);
420 cleanIndexesArguments(_pArgs, &pArg);
422 wchar_t szError[bsiz];
423 os_swprintf(szError, bsiz, _W("Invalid index.\n").c_str());
424 throw ast::InternalError(szError);
427 if (pSource->isScalar())
429 //element-wise insertion
430 set(iPos, pRealData[0]);
431 if (pImgData != NULL && bComplex)
433 setImg(iPos, pImgData[0]);
441 for (int j = 0; j < iDimsOrigine; j++)
443 iPas = iPas * m_piDims[j];
446 for (int iPost = iPos; iPost < this->getSize(); iPost += iPas)
448 set(iPost, pRealData[i]);
449 if (pImgData != NULL && bComplex)
451 setImg(iPost, pImgData[i]);
458 set(iPos, pRealData[i]);
459 if (pImgData != NULL && bComplex)
461 setImg(iPos, pImgData[i]);
466 // reset imaginary part
467 if (m_pImgData != NULL && bComplex == false)
488 cleanIndexesArguments(_pArgs, &pArg);
493 template <typename T>
494 GenericType* ArrayOf<T>::insertNew(typed_list* _pArgs)
496 bool bComplex = getImg() != NULL;
498 std::vector<int> dims;
499 if (getArgsDims(_pArgs, dims))
501 InternalType *pOut = NULL;
503 if (dims.size() == 1 && getDims() == 2)
507 dims.insert(dims.begin(), 1);
515 while (dims.size() < 2)
520 pOut = createEmpty((int)dims.size(), dims.data(), bComplex);
521 ArrayOf* pArrayOut = pOut->getAs<ArrayOf>();
522 pArrayOut->fillDefaultValues();
523 ArrayOf* pOut2 = pArrayOut->insert(_pArgs, this);
533 InternalType *pOut = NULL;
535 int iDims = (int)_pArgs->size();
536 int* piMaxDim = new int[iDims];
537 int* piCountDim = new int[iDims];
538 bool bUndefine = false;
539 bool bIsImpli = false;
541 //evaluate each argument and replace by appropriate value and compute the count of combinations
542 int iSeqCount = checkIndexesArguments(NULL, _pArgs, &pArg, piMaxDim, piCountDim);
549 cleanIndexesArguments(_pArgs, &pArg);
550 return createEmptyDouble();
555 iSeqCount = -iSeqCount;
561 //manage : and $ in creation by insertion
562 int *piSourceDims = getDimsArray();
563 int iSourceDims = getDims();
564 int iCompteurNull = 0;
566 for (int i = 0; i < iDims; i++)
575 if ((*_pArgs)[i]->isImplicitList())
582 //if all index are : -> a = x
583 if (iCompteurNull == pArg.size())
588 cleanIndexesArguments(_pArgs, &pArg);
593 if (isVector() && iCompteurNull == 1)
595 piMaxDim[iLastNull] = getSize();
596 pArg[iLastNull] = createDoubleVector(piMaxDim[iLastNull]);
600 //matrix and hypermatrix case
601 if (iCompteurNull < getDims())
606 cleanIndexesArguments(_pArgs, &pArg);
607 //contain bad index, like <= 0, ...
611 //replace ":" by know source dimensions
613 for (int i = 0; i < iDims; ++i)
617 if (iSource < iSourceDims)
619 piMaxDim[i] = piSourceDims[iSource];
620 pArg[i] = createDoubleVector(piMaxDim[i]);
625 //fill dimensions after getDimes() with 1
627 pArg[i] = createDoubleVector(piMaxDim[i]);
634 //remove last dimension at size 1
635 //remove last dimension if are == 1
636 for (int i = (iDims - 1); i >= 2; i--)
638 if (piMaxDim[i] == 1)
641 pArg.back()->killMe();
650 if (checkArgValidity(pArg) == false)
655 cleanIndexesArguments(_pArgs, &pArg);
656 //contain bad index, like <= 0, ...
664 int piRealDim[2] = {piMaxDim[0], 1};
665 pOut = createEmpty(2, piRealDim, bComplex);
670 int piRealDim[2] = {1, piMaxDim[0]};
671 pOut = createEmpty(2, piRealDim, bComplex);
676 pOut = createEmpty(iDims, piMaxDim, bComplex);
679 //fill with null item
680 ArrayOf* pArrayOut = pOut->getAs<ArrayOf>();
681 pArrayOut->fillDefaultValues();
682 //T* pRealData = pArrayOut->get();
685 // int size = pArrayOut->getSize();
686 // T* pImgData = pArrayOut->getImg();
688 // if (isNativeType())
690 // T val = getNullValue();
691 // for (int i = 0; i < size; i++)
693 // pRealData[i] = val;
694 // pImgData[i] = val;
699 // for (int i = 0; i < size; i++)
701 // pArrayOut->deleteData(pRealData[i]);
702 // pRealData[i] = getNullValue();
703 // pArrayOut->deleteData(pImgData[i]);
704 // pImgData[i] = getNullValue();
710 // int size = pArrayOut->getSize();
711 // if (isNativeType())
713 // T val = getNullValue();
714 // for (int i = 0; i < size; i++)
716 // pRealData[i] = val;
721 // for (int i = 0; i < size; i++)
723 // pArrayOut->deleteData(pRealData[i]);
724 // pRealData[i] = getNullValue();
729 if (bIsImpli && (pArrayOut->getSize() != getSize()))
734 cleanIndexesArguments(_pArgs, &pArg);
737 //insert values in new matrix
738 ArrayOf* pOut2 = pArrayOut->insert(&pArg, this);
747 cleanIndexesArguments(_pArgs, &pArg);
752 template <typename T>
753 ArrayOf<T>* ArrayOf<T>::append(int _iRows, int _iCols, InternalType* _poSource)
755 ArrayOf<T>* pIT = checkRef(this, &ArrayOf::append, _iRows, _iCols, _poSource);
761 ArrayOf * pGT = _poSource->getAs<ArrayOf>();
762 int iRows = pGT->getRows();
763 int iCols = pGT->getCols();
765 //insert without resize
766 if (iRows + _iRows > m_iRows || iCols + _iCols > m_iCols)
771 //Update complexity if necessary
772 if (pGT->isComplex())
776 else if (isComplex())
778 pGT->setComplex(true);
781 if (pGT->isComplex())
783 for (int i = 0; i < iRows; i++)
785 for (int j = 0; j < iCols; j++)
787 set(_iRows + i, _iCols + j, pGT->get(i, j));
788 setImg(_iRows + i, _iCols + j, pGT->getImg(i, j));
794 for (int i = 0; i < iRows; i++)
796 for (int j = 0; j < iCols; j++)
798 set(_iRows + i, _iCols + j, pGT->get(i, j));
806 template <typename T>
807 GenericType* ArrayOf<T>::remove(typed_list* _pArgs)
809 ArrayOf<T>* pOut = NULL;
810 int iDims = (int)_pArgs->size();
813 int* piMaxDim = new int[iDims];
814 int* piCountDim = new int[iDims];
816 //evaluate each argument and replace by appropriate value and compute the count of combinations
817 int iSeqCount = checkIndexesArguments(this, _pArgs, &pArg, piMaxDim, piCountDim);
823 cleanIndexesArguments(_pArgs, &pArg);
824 //no Seq, no change but no error.
828 bool* pbFull = new bool[iDims];
829 //coord must represent all values on a dimension
830 for (int i = 0; i < iDims; i++)
833 int iDimToCheck = getVarMaxDim(i, iDims);
834 int iIndexSize = pArg[i]->getAs<GenericType>()->getSize();
836 //we can have index more than once
837 if (iIndexSize >= iDimToCheck)
839 //size is good, now check datas
840 double* pIndexes = getDoubleArrayFromDouble(pArg[i]);
841 for (int j = 0; j < iDimToCheck; j++)
844 for (int k = 0; k < iIndexSize; k++)
846 if ((int)pIndexes[k] == j + 1)
857 //only one dims can be not full/entire
858 bool bNotEntire = false;
860 bool bTooMuchNotEntire = false;
861 for (int i = 0; i < iDims; i++)
863 if (pbFull[i] == false)
865 if (bNotEntire == false)
872 bTooMuchNotEntire = true;
880 if (bTooMuchNotEntire == true)
883 cleanIndexesArguments(_pArgs, &pArg);
888 int iNotEntireSize = pArg[iNotEntire]->getAs<GenericType>()->getSize();
889 double* piNotEntireIndex = getDoubleArrayFromDouble(pArg[iNotEntire]);
890 int iKeepSize = getVarMaxDim(iNotEntire, iDims);
891 bool* pbKeep = new bool[iKeepSize];
893 //fill pbKeep with true value
894 for (int i = 0; i < iKeepSize; i++)
899 for (int i = 0; i < iNotEntireSize; i++)
901 int idx = (int)piNotEntireIndex[i] - 1;
903 //don't care of value out of bounds
911 for (int i = 0; i < iKeepSize; i++)
913 if (pbKeep[i] == true)
920 int* piNewDims = new int[iDims];
921 for (int i = 0; i < iDims; i++)
925 piNewDims[i] = iNewDimSize;
929 piNewDims[i] = getVarMaxDim(i, iDims);
933 //remove last dimension if are == 1
934 int iOrigDims = iDims;
935 for (int i = (iDims - 1); i >= 2; i--)
937 if (piNewDims[i] == 1)
947 if (iNewDimSize == 0)
950 cleanIndexesArguments(_pArgs, &pArg);
952 return createEmpty();
957 //two cases, depends of original matrix/vector
958 if ((*_pArgs)[0]->isColon() == false && m_iDims == 2 && m_piDims[0] == 1 && m_piDims[1] != 1)
960 //special case for row vector
961 int piRealDim[2] = {1, iNewDimSize};
962 pOut = createEmpty(2, piRealDim, m_pImgData != NULL);
963 //in this case we have to care of 2nd dimension
968 int piRealDim[2] = {iNewDimSize, 1};
969 pOut = createEmpty(2, piRealDim, m_pImgData != NULL);
974 int size = getSize();
976 //try to sort piNotEntireIndex
977 std::sort(piNotEntireIndex, piNotEntireIndex + iNotEntireSize);
980 for (int i = 0; i < iNotEntireSize; ++i)
982 int ii = piNotEntireIndex[i] - 1;
983 for (int j = last; j < ii; ++j)
985 pOut->set(iNewPos, get(j));
986 if (m_pImgData != NULL)
988 pOut->setImg(iNewPos, getImg(j));
996 for (int i = last; i < size; ++i)
998 pOut->set(iNewPos, get(i));
999 if (m_pImgData != NULL)
1001 pOut->setImg(iNewPos, getImg(i));
1009 pOut = createEmpty(iDims, piNewDims, m_pImgData != NULL);
1011 //find a way to copy existing data to new variable ...
1013 int* piIndexes = new int[iOrigDims];
1014 int* piViewDims = new int[iOrigDims];
1015 for (int i = 0; i < iOrigDims; i++)
1017 piViewDims[i] = getVarMaxDim(i, iOrigDims);
1020 for (int i = 0; i < getSize(); i++)
1022 bool bByPass = false;
1023 getIndexesWithDims(i, piIndexes, piViewDims, iOrigDims);
1025 //check if piIndexes use removed indexes
1026 for (int j = 0; j < iNotEntireSize; j++)
1028 if ((piNotEntireIndex[j] - 1) == piIndexes[iNotEntire])
1030 //by pass this value
1036 if (bByPass == false)
1039 pOut->set(iNewPos, get(i));
1040 if (m_pImgData != NULL)
1042 pOut->setImg(iNewPos, getImg(i));
1049 delete[] piViewDims;
1055 cleanIndexesArguments(_pArgs, &pArg);
1060 template <typename T>
1061 GenericType* ArrayOf<T>::extract(typed_list* _pArgs)
1063 ArrayOf<T>* pOut = NULL;
1064 int iDims = (int)_pArgs->size();
1068 if (getScalarIndex(this, _pArgs, &index))
1077 return createEmpty();
1080 if (index >= getSize())
1085 int dims[2] = {1, 1};
1086 pOut = createEmpty(2, dims, isComplex());;
1087 pOut->set(0, get(index));
1090 pOut->setImg(0, getImg(index));
1096 std::vector<double> il;
1097 if (getScalarImplicitIndex(this, _pArgs, il))
1099 double start = il[0];
1100 double step = il[1];
1103 bool isForceColVector = il.size() == 4;
1105 //std::cout << start << ":" << step << ":" << end << std::endl;
1106 int size = static_cast<int>((end - start) / step + 1);
1108 if (size <= 0 || m_iSize == 0)
1110 return createEmpty();
1114 if (step > 0 && ((size - 1) * step + start > m_iSize || start < 1) ||
1115 (step < 0 && (start > m_iSize || end < 1)))
1120 bool isRowVector = m_iRows == 1;
1121 isRowVector = isRowVector && !isForceColVector;
1122 int dims[2] = {isRowVector ? 1 : size, isRowVector ? size : 1};
1123 pOut = createEmpty(2, dims, isComplex());
1128 for (int i = 0; i < size; ++i)
1130 int index = static_cast<int>(idx) - 1;
1131 pOut->set(i, get(index));
1132 pOut->setImg(i, getImg(index));
1138 for (int i = 0; i < size; ++i)
1140 pOut->set(i, get(static_cast<int>(idx) - 1));
1147 std::vector<int> indexes;
1148 std::vector<int> dims;
1149 if (getImplicitIndex(this, _pArgs, indexes, dims))
1151 if (indexes.size() == 0)
1153 return createEmpty();
1156 if (dims.size() == 1)
1158 int d[2] = {1, dims[0]};
1159 pOut = createEmpty(2, d, isComplex());
1163 pOut = createEmpty(static_cast<int>(dims.size()), dims.data(), isComplex());
1166 int size = getSize();
1170 for (int & i : indexes)
1172 if (i < 0 || i >= size)
1178 pOut->set(idx, get(i));
1179 pOut->setImg(idx, getImg(i));
1186 for (int & i : indexes)
1188 pOut->set(idx, get(i));
1197 int* piMaxDim = new int[iDims];
1198 int* piCountDim = new int[iDims];
1200 //evaluate each argument and replace by appropriate value and compute the count of combinations
1201 int iSeqCount = checkIndexesArguments(this, _pArgs, &pArg, piMaxDim, piCountDim);
1205 delete[] piCountDim;
1207 cleanIndexesArguments(_pArgs, &pArg);
1208 return createEmpty();
1214 delete[] piCountDim;
1216 cleanIndexesArguments(_pArgs, &pArg);
1220 //a = {};a(1:2, 1:2) -> {}
1224 delete[] piCountDim;
1226 cleanIndexesArguments(_pArgs, &pArg);
1227 return createEmpty();
1230 if (iDims < m_iDims)
1232 for (int i = 0; i < iDims; i++)
1234 int iDimToCheck = 0;
1235 if (i == (iDims - 1))
1237 iDimToCheck = getVarMaxDim(i, iDims);
1241 iDimToCheck = m_piDims[i];
1244 if (piMaxDim[i] > iDimToCheck)
1247 delete[] piCountDim;
1249 cleanIndexesArguments(_pArgs, &pArg);
1256 if (iDims > m_iDims)
1258 for (int i = m_iDims; i < iDims; i++)
1260 if (piMaxDim[i] > 1)
1263 delete[] piCountDim;
1265 cleanIndexesArguments(_pArgs, &pArg);
1272 for (int i = 0; i < m_iDims; i++)
1274 if (piMaxDim[i] > m_piDims[i])
1277 delete[] piCountDim;
1279 cleanIndexesArguments(_pArgs, &pArg);
1280 //exrtact must be in dimension limits
1286 //remove last dimension if are == 1
1287 for (int i = (iDims - 1); i >= 2; i--)
1289 if (piCountDim[i] == 1)
1302 if (piCountDim[0] == 0)
1305 delete[] piCountDim;
1307 cleanIndexesArguments(_pArgs, &pArg);
1308 return createEmpty();
1312 //two cases, depends of original matrix/vector
1313 if ((*_pArgs)[0]->isColon() == false && m_iDims == 2 && m_piDims[1] != 1 && m_piDims[0] == 1)
1315 //special case for row vector
1316 int piRealDim[2] = {1, piCountDim[0]};
1317 pOut = createEmpty(2, piRealDim, m_pImgData != NULL);
1323 //for extraction on scalar
1324 pOut = createEmpty(pArg[0]->getAs<GenericType>()->getDims(), pArg[0]->getAs<GenericType>()->getDimsArray(), m_pImgData != NULL);
1328 int piRealDim[2] = {piCountDim[0], 1};
1329 pOut = createEmpty(2, piRealDim, m_pImgData != NULL);
1337 pOut = createEmpty(iDims, piCountDim, m_pImgData != NULL);
1340 int* piIndex = new int[_pArgs->size()];
1341 int* piCoord = new int[_pArgs->size()];
1342 int* piViewDims = new int[iDims];
1343 memset(piIndex, 0x00, sizeof(int) * _pArgs->size());
1345 for (int i = 0; i < iDims; i++)
1347 piViewDims[i] = getVarMaxDim(i, iDims);
1350 for (int i = 0; i < iSeqCount; i++)
1352 //increment last dimension
1353 computeTuples(piCountDim, (int)_pArgs->size(), (int)_pArgs->size() - 1, piIndex);
1356 for (int j = 0; j < (int)_pArgs->size(); j++)
1358 piCoord[j] = getIntValueFromDouble(pArg[j], piIndex[j]) - 1;
1359 //InternalType* pVar = pArg[i];
1360 //piCoord[j] = static_cast<int>(pVar->getAs<Double>()->get(piIndex[j]) - 1);
1361 //std::cout << piCoord[j] << " ";
1363 // try to access somewhere wrong.
1368 delete[] piViewDims;
1370 delete[] piCountDim;
1373 cleanIndexesArguments(_pArgs, &pArg);
1378 //std::cout << "]" << std::endl;
1381 //put vlaue in the new matrix
1382 if ((int)_pArgs->size() < m_iDims)
1384 //compute index based on viewed matrix
1385 iPos = getIndexWithDims(piCoord, piViewDims, iDims);
1389 //compute vector index
1390 iPos = getIndex(piCoord);
1393 //convert flat dimension to 0
1394 for (int j = 0; j < iDims; j++)
1396 if (piCountDim[j] == 1)
1402 pOut->set(i, get(iPos));
1403 if (m_pImgData != NULL)
1405 pOut->setImg(i, getImg(iPos));
1413 cleanIndexesArguments(_pArgs, &pArg);
1417 delete[] piViewDims;
1419 delete[] piCountDim;
1424 template <typename T>
1425 ArrayOf<T>* ArrayOf<T>::reshape(int* _piDims, int _iDims)
1427 typedef ArrayOf<T>* (ArrayOf<T>::*reshape_t)(int*, int);
1428 ArrayOf<T>* pIT = checkRef(this, (reshape_t)&ArrayOf<T>::reshape, _piDims, _iDims);
1434 int iNewSize = get_max_size(_piDims, _iDims);
1435 if (iNewSize != m_iSize)
1440 for (int i = 0 ; i < _iDims ; i++)
1442 m_piDims[i] = _piDims[i];
1452 for (int i = iDims - 1; i >= 2; --i)
1454 if (m_piDims[i] == 1)
1464 m_iRows = m_piDims[0];
1465 m_iCols = m_piDims[1];
1472 template <typename T>
1473 ArrayOf<T>* ArrayOf<T>::resize(int* _piDims, int _iDims)
1475 typedef ArrayOf<T>* (ArrayOf<T>::*resize_t)(int*, int);
1476 ArrayOf<T>* pIT = checkRef(this, (resize_t)&ArrayOf::resize, _piDims, _iDims);
1482 if (_iDims == m_iDims)
1484 bool bChange = false;
1485 for (int i = 0; i < _iDims; i++)
1487 if (m_piDims[i] != _piDims[i])
1494 if (bChange == false)
1501 //alloc new data array
1502 T* pRealData = NULL;
1506 if (m_pImgData != NULL)
1508 iNewSize = get_max_size(_piDims, _iDims);
1509 if (m_iSizeMax < iNewSize)
1511 //alloc 10% bigger than asked to prevent future resize
1512 int iOldSizeMax = m_iSizeMax;
1513 m_iSizeMax = static_cast<int>(iNewSize * 1.1);
1514 pRealData = allocData(m_iSizeMax);
1515 pImgData = allocData(m_iSizeMax);
1517 //copy values into new one
1518 int* piIndexes = new int[std::max(m_iDims, _iDims)];
1519 memset(piIndexes, 0x00, sizeof(int) * std::max(m_iDims, _iDims));
1520 for (int i = 0; i < _iDims; i++)
1525 int iPreviousNewIdx = 0;
1526 for (int i = 0; i < m_iSize; i++)
1528 getIndexes(i, piIndexes);
1529 int iNewIdx = getIndexWithDims(piIndexes, _piDims, _iDims);
1530 pRealData[iNewIdx] = m_pRealData[i];
1531 pImgData[iNewIdx] = m_pImgData[i];
1532 for (int j = iPreviousNewIdx; j < iNewIdx; ++j)
1534 T pTemp = getNullValue();
1535 pRealData[j] = copyValue(pTemp);
1536 pImgData[j] = copyValue(pTemp);
1537 if (pTemp != pRealData[j])
1543 iPreviousNewIdx = iNewIdx + 1;
1546 // if it's not the first resize,
1547 // fill new data with element of last allocation
1548 if (iPreviousNewIdx < iOldSizeMax)
1550 for (int i = iPreviousNewIdx; i < iOldSizeMax; ++i)
1552 pRealData[i] = m_pRealData[i];
1553 pImgData[i] = m_pImgData[i];
1558 // first resize, iOldSizeMax don't contain the 10%
1559 iOldSizeMax = iPreviousNewIdx;
1562 for (int i = iOldSizeMax; i < m_iSizeMax; ++i)
1564 T pTemp = getNullValue();
1565 pRealData[i] = copyValue(pTemp);
1566 pImgData[i] = copyValue(pTemp);
1567 if (pTemp != pRealData[i])
1575 delete[] m_pRealData;
1576 delete[] m_pImgData;
1577 //replace old array by new one
1578 m_pRealData = pRealData;
1579 m_pImgData = pImgData;
1583 //check if only the last dims change
1584 bool bNonLastDimChange = false;
1585 for (int i = 0; i < (m_iDims - 1); i++)
1587 if (m_piDims[i] != _piDims[i])
1589 bNonLastDimChange = true;
1594 //if vector or if row dimension not change, we don't need to shift data
1595 if (m_iDims != _iDims || (!isVector() && bNonLastDimChange))
1597 //copy values into new one
1598 int* piIndexes = new int[std::max(m_iDims, _iDims)];
1599 memset(piIndexes, 0x00, sizeof(int) * std::max(m_iDims, _iDims));
1600 for (int i = m_iSize - 1; i >= 0; i--)
1602 getIndexes(i, piIndexes);
1603 int iNewIdx = getIndexWithDims(piIndexes, _piDims, _iDims);
1606 T pTemp = m_pRealData[iNewIdx];
1607 m_pRealData[iNewIdx] = m_pRealData[i];
1608 m_pRealData[i] = pTemp;
1610 pTemp = m_pImgData[iNewIdx];
1611 m_pImgData[iNewIdx] = m_pImgData[i];
1612 m_pImgData[i] = pTemp;
1621 iNewSize = get_max_size(_piDims, _iDims);
1622 if (iNewSize > m_iSizeMax)
1624 //alloc 10% bigger than asked to prevent future resize
1625 int iOldSizeMax = m_iSizeMax;
1626 m_iSizeMax = static_cast<int>(iNewSize * 1.1);
1627 pRealData = allocData(m_iSizeMax);
1629 //copy values into new one
1630 int* piIndexes = new int[std::max(m_iDims, _iDims)];
1631 memset(piIndexes, 0x00, sizeof(int) * std::max(m_iDims, _iDims));
1632 for (int i = 0; i < _iDims; i++)
1637 int iPreviousNewIdx = 0;
1638 for (int i = 0; i < m_iSize; i++)
1640 getIndexes(i, piIndexes);
1641 int iNewIdx = getIndexWithDims(piIndexes, _piDims, _iDims);
1642 pRealData[iNewIdx] = m_pRealData[i];
1643 m_pRealData[i] = NULL;
1645 for (int j = iPreviousNewIdx; j < iNewIdx; ++j)
1647 T pTemp = getNullValue();
1648 T pTemp2 = copyValue(pTemp);
1649 pRealData[j] = pTemp2;
1650 if (pTemp != pTemp2)
1656 iPreviousNewIdx = iNewIdx + 1;
1659 //clean section between m_iSize and iOldSizeMax
1660 for (int i = m_iSize; i < iOldSizeMax; ++i)
1662 deleteData(m_pRealData[i]);
1663 m_pRealData[i] = NULL;
1666 //if (iPreviousNewIdx < iOldSizeMax)
1668 // for (int i = iPreviousNewIdx; i < iOldSizeMax; ++i)
1670 // pRealData[i] = m_pRealData[i];
1671 // m_pRealData[i] = NULL;
1676 // iOldSizeMax = iPreviousNewIdx;
1679 //fill exceeded with NullValue
1680 for (int i = iPreviousNewIdx; i < m_iSizeMax; ++i)
1682 T pTemp = getNullValue();
1683 T pTemp2 = copyValue(pTemp);
1684 pRealData[i] = pTemp2;
1685 if (pTemp != pTemp2)
1693 delete[] m_pRealData;
1694 //replace old array by new one
1695 m_pRealData = pRealData;
1699 //check if only the last dims change
1700 bool bNonLastDimChange = false;
1701 for (int i = 0; i < (m_iDims - 1); i++)
1703 if (m_piDims[i] != _piDims[i])
1705 bNonLastDimChange = true;
1710 //if vector or if row dimension not change, we don't need to shift data
1711 if (m_iDims != _iDims || (!isVector() && bNonLastDimChange))
1713 //copy values into new one
1714 int* piIndexes = new int[std::max(m_iDims, _iDims)];
1715 memset(piIndexes, 0x00, sizeof(int) * std::max(m_iDims, _iDims));
1716 for (int i = m_iSize - 1; i >= 0; i--)
1718 getIndexes(i, piIndexes);
1719 int iNewIdx = getIndexWithDims(piIndexes, _piDims, _iDims);
1722 T pTemp = m_pRealData[iNewIdx];
1723 m_pRealData[iNewIdx] = m_pRealData[i];
1724 m_pRealData[i] = pTemp;
1732 if (_iDims != m_iDims)
1734 //int* piDims = new int[_iDims];
1735 for (int i = 0; i < _iDims; i++)
1737 m_piDims[i] = _piDims[i];
1739 //delete[] m_piDims;
1740 //m_piDims = piDims;
1745 for (int i = 0; i < m_iDims; i++)
1747 m_piDims[i] = _piDims[i];
1750 m_iRows = m_piDims[0];
1751 m_iCols = m_piDims[1];
1756 template <typename T>
1757 bool ArrayOf<T>::isTrue()
1759 return type_traits::isTrue<T>(m_iSize, m_pRealData);
1762 template<typename T>
1763 bool ArrayOf<T>::neg(InternalType *& out)
1765 out = new Bool(this->m_iDims, this->m_piDims);
1766 type_traits::neg<T, int>(this->m_iSize, this->m_pRealData, static_cast<Bool *>(out)->get());
1771 template<typename T>
1772 bool ArrayOf<T>::invoke(typed_list & in, optional_list & /*opt*/, int /*_iRetCount*/, typed_list & out, const ast::Exp & e)
1776 out.push_back(this);
1780 InternalType * _out = extract(&in);
1783 std::wostringstream os;
1784 os << _W("Invalid index.\n");
1785 throw ast::InternalError(os.str(), 999, e.getLocation());
1787 out.push_back(_out);
1793 template<typename T>
1794 bool ArrayOf<T>::isInvokable() const
1799 template<typename T>
1800 bool ArrayOf<T>::hasInvokeOption() const
1805 template<typename T>
1806 int ArrayOf<T>::getInvokeNbIn()
1811 template<typename T>
1812 int ArrayOf<T>::getInvokeNbOut()
1818 // used to allow definition of ArrayOf methode in this cpp file.
1819 template class EXTERN_AST ArrayOf < char >;
1820 template class EXTERN_AST ArrayOf < unsigned char >;
1821 template class EXTERN_AST ArrayOf < short >;
1822 template class EXTERN_AST ArrayOf < unsigned short >;
1823 template class EXTERN_AST ArrayOf < int >;
1824 template class EXTERN_AST ArrayOf < unsigned int >;
1825 template class EXTERN_AST ArrayOf < long long >;
1826 template class EXTERN_AST ArrayOf < unsigned long long >;
1827 template class EXTERN_AST ArrayOf < double >;
1828 template class EXTERN_AST ArrayOf < wchar_t* >;
1829 template class EXTERN_AST ArrayOf < SinglePoly* >;
1830 template class EXTERN_AST ArrayOf < SingleStruct* >;
1831 template class EXTERN_AST ArrayOf < InternalType* >; // Cell