int mxGetNumberOfDimensions(const mxArray *ptr) { InternalType *pIT = (InternalType *)ptr; if (pIT == NULL) { return 0; } GenericType *pGT = pIT->getAs<GenericType>(); if (pGT == NULL) { //InternalType but not GenericType, so mono dimension type. return 1; } return pGT->getDims(); }
bool getDimsFromArguments(types::typed_list& in, const std::string& _pstName, int* _iDims, int** _piDims, bool* _alloc) { types::Double* pOut = 0; *_alloc = false; *_iDims = 0; *_piDims = NULL; if (in.size() == 0) { *_iDims = 2; *_piDims = new int[*_iDims]; (*_piDims)[0] = 1; (*_piDims)[1] = 1; *_alloc = true; return true; } else if (in.size() == 1) { *_iDims = 1; // : if (in[0]->isColon()) { *_iDims = -1; return false; } if (in[0]->isArrayOf() == false) { if (in[0]->isSparse()) { Sparse* sp = in[0]->getAs<Sparse>(); *_iDims = sp->getDims(); *_piDims = sp->getDimsArray(); return true; } else if (in[0]->isSparseBool()) { SparseBool* sp = in[0]->getAs<SparseBool>(); *_iDims = sp->getDims(); *_piDims = sp->getDimsArray(); return true; } return false; } GenericType* pIn = in[0]->getAs<GenericType>(); *_iDims = pIn->getDims(); *_piDims = pIn->getDimsArray(); return true; } else { *_iDims = static_cast<int>(in.size()); *_piDims = new int[*_iDims]; *_alloc = true; for (int i = 0; i < *_iDims; i++) { if (in[i]->isArrayOf() == false) { delete[] * _piDims; Scierror(999, _("%s: Wrong type for input argument #%d: A scalar expected.\n"), _pstName.c_str(), i + 1); return false; } types::GenericType* pGTIn = in[i]->getAs<types::GenericType>(); if (pGTIn->isScalar() == false || pGTIn->isComplex()) { delete[] * _piDims; Scierror(999, _("%s: Wrong size for input argument #%d: A scalar expected.\n"), _pstName.c_str(), i + 1); return false; } switch (in[i]->getType()) { case types::InternalType::ScilabDouble: { double dValue = in[i]->getAs<types::Double>()->get(0); if (dValue >= INT_MAX) { delete[] * _piDims; Scierror(999, _("%s: variable size exceeded : less than %d expected.\n"), _pstName.c_str(), INT_MAX); return false; } (*_piDims)[i] = static_cast<int>(dValue); } break; case types::InternalType::ScilabInt8: (*_piDims)[i] = static_cast<int>(in[i]->getAs<types::Int8>()->get()[0]); break; case types::InternalType::ScilabUInt8: (*_piDims)[i] = static_cast<int>(in[i]->getAs<types::UInt8>()->get()[0]); break; case types::InternalType::ScilabInt16: (*_piDims)[i] = static_cast<int>(in[i]->getAs<types::Int16>()->get()[0]); break; case types::InternalType::ScilabUInt16: (*_piDims)[i] = static_cast<int>(in[i]->getAs<types::UInt16>()->get()[0]); break; case types::InternalType::ScilabInt32: (*_piDims)[i] = in[i]->getAs<types::Int32>()->get()[0]; break; case types::InternalType::ScilabUInt32: (*_piDims)[i] = static_cast<int>(in[i]->getAs<types::UInt32>()->get()[0]); break; case types::InternalType::ScilabInt64: { long long llValue = in[i]->getAs<types::Int64>()->get(0); if (llValue >= INT_MAX) { delete[] * _piDims; Scierror(999, _("%s: variable size exceeded : less than %d expected.\n"), _pstName.c_str(), INT_MAX); return false; } (*_piDims)[i] = static_cast<int>(llValue); break; } case types::InternalType::ScilabUInt64: { unsigned long long ullValue = in[i]->getAs<types::UInt64>()->get(0); if (ullValue >= INT_MAX) { delete[] * _piDims; Scierror(999, _("%s: variable size exceeded : less than %d expected.\n"), _pstName.c_str(), INT_MAX); return false; } (*_piDims)[i] = static_cast<int>(ullValue); break; } default: Scierror(999, _("%s: Wrong size for input argument #%d: A scalar expected.\n"), _pstName.c_str(), i + 1); return false; } } return true; } return false; }
/** ** toString to display Structs ** FIXME : Find a better indentation process */ bool Cell::subMatrixToString(std::wostringstream& ostr, int* _piDims, int /*_iDims*/) { int iPrecision = ConfigVariable::getFormatSize(); if (isEmpty()) { ostr << L" {}"; } else { //max len for each column int *piTypeLen = new int[getCols()]; int *piSizeLen = new int[getCols()]; memset(piTypeLen, 0x00, getCols() * sizeof(int)); memset(piSizeLen, 0x00, getCols() * sizeof(int)); for (int j = 0 ; j < getCols() ; j++) { for (int i = 0 ; i < getRows() ; i++) { _piDims[0] = i; _piDims[1] = j; int iPos = getIndex(_piDims); InternalType* pIT = get(iPos); if (pIT->isAssignable()) { //compute number of digits to write dimensions int iTypeLen = 0; if (pIT->isGenericType()) { GenericType* pGT = pIT->getAs<GenericType>(); for (int k = 0 ; k < pGT->getDims() ; k++) { iTypeLen += static_cast<int>(log10(static_cast<double>(pGT->getDimsArray()[k])) + 1); } piSizeLen[j] = std::max(piSizeLen[j], iTypeLen + (pGT->getDims() - 1));//add number of "x" } else { //types non derived from ArrayOf. int iSize = static_cast<int>(log10(static_cast<double>(pIT->getAs<GenericType>()->getRows())) + 1); piSizeLen[j] = std::max(piSizeLen[j], iSize); } } else { //no size so let a white space, size == 1 piSizeLen[j] = std::max(piSizeLen[j], 1); } piTypeLen[j] = std::max(piTypeLen[j], static_cast<int>(pIT->getTypeStr().size())); } } for (int i = 0 ; i < getRows() ; i++) { for (int j = 0 ; j < getCols() ; j++) { _piDims[0] = i; _piDims[1] = j; int iPos = getIndex(_piDims); InternalType* pIT = get(iPos); ostr << L" ["; if (pIT->isAssignable()) { if (pIT->isGenericType()) { //" ixjxkxl type " GenericType* pGT = pIT->getAs<GenericType>(); std::wostringstream ostemp; for (int k = 0 ; k < pGT->getDims() ; k++) { if (k != 0) { ostemp << L"x"; } ostemp << pGT->getDimsArray()[k]; } configureStream(&ostr, piSizeLen[j], iPrecision, ' '); ostr << std::right << ostemp.str(); } else { //" i " configureStream(&ostr, piSizeLen[j], iPrecision, ' '); if (pIT->isList()) { ostr << std::right << pIT->getAs<List>()->getSize(); } else { ostr << std::right << 1; } } } else { configureStream(&ostr, piSizeLen[j], iPrecision, ' '); ostr << L"";//fill with space } ostr << L" "; configureStream(&ostr, piTypeLen[j], iPrecision, ' '); ostr << std::left << pIT->getTypeStr(); ostr << L"]"; } ostr << std::endl; } delete[] piSizeLen; delete[] piTypeLen; } ostr << std::endl; return true; }