X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMEDCoupling%2FMEDCouplingMemArray.cxx;h=2f09e0f6e692f9bf35a7d17fe6475ed867f3acb2;hb=48e298dbf14059e3392eb522cfdb634bfefeaf1b;hp=1e87420cce5ba2f371e7154cd4a135b617b58b1b;hpb=0511285d155a0682ff6dad10ac916ac53f577476;p=tools%2Fmedcoupling.git diff --git a/src/MEDCoupling/MEDCouplingMemArray.cxx b/src/MEDCoupling/MEDCouplingMemArray.cxx index 1e87420cc..2f09e0f6e 100644 --- a/src/MEDCoupling/MEDCouplingMemArray.cxx +++ b/src/MEDCoupling/MEDCouplingMemArray.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D +// Copyright (C) 2007-2013 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -39,7 +39,7 @@ template void DataArrayDouble::findCommonTuplesAlg(const double *bbox, int nbNodes, int limitNodeId, double prec, DataArrayInt *c, DataArrayInt *cI) const { const double *coordsPtr=getConstPointer(); - BBTree myTree(bbox,0,0,nbNodes,prec/10); + BBTreePts myTree(bbox,0,0,nbNodes,prec); std::vector isDone(nbNodes); for(int i=0;i -void DataArrayDouble::FindTupleIdsNearTuplesAlg(const BBTree& myTree, const double *pos, int nbOfTuples, double eps, +void DataArrayDouble::FindTupleIdsNearTuplesAlg(const BBTreePts& myTree, const double *pos, int nbOfTuples, double eps, DataArrayInt *c, DataArrayInt *cI) { for(int i=0;i& compoIds, cons setInfoOnComponent(compoIds[i],other.getInfoOnComponent((int)i).c_str()); } -bool DataArray::areInfoEqualsIfNotWhy(const DataArray& other, std::string& reason) const +bool DataArray::areInfoEqualsIfNotWhy(const DataArray& other, std::string& reason) const throw(INTERP_KERNEL::Exception) { std::ostringstream oss; if(_name!=other._name) @@ -209,13 +209,13 @@ bool DataArray::areInfoEqualsIfNotWhy(const DataArray& other, std::string& reaso * \param [in] other - another instance of DataArray to compare the textual data of. * \return bool - \a true if the textual information is same, \a false else. */ -bool DataArray::areInfoEquals(const DataArray& other) const +bool DataArray::areInfoEquals(const DataArray& other) const throw(INTERP_KERNEL::Exception) { std::string tmp; return areInfoEqualsIfNotWhy(other,tmp); } -void DataArray::reprWithoutNameStream(std::ostream& stream) const +void DataArray::reprWithoutNameStream(std::ostream& stream) const throw(INTERP_KERNEL::Exception) { stream << "Number of components : "<< getNumberOfComponents() << "\n"; stream << "Info of these components : "; @@ -247,7 +247,7 @@ void DataArray::setInfoOnComponents(const std::vector& info) throw( _info_on_compo=info; } -std::vector DataArray::getVarsOnComponent() const +std::vector DataArray::getVarsOnComponent() const throw(INTERP_KERNEL::Exception) { int nbOfCompo=(int)_info_on_compo.size(); std::vector ret(nbOfCompo); @@ -256,7 +256,7 @@ std::vector DataArray::getVarsOnComponent() const return ret; } -std::vector DataArray::getUnitsOnComponent() const +std::vector DataArray::getUnitsOnComponent() const throw(INTERP_KERNEL::Exception) { int nbOfCompo=(int)_info_on_compo.size(); std::vector ret(nbOfCompo); @@ -383,10 +383,10 @@ std::string DataArray::GetUnitFromInfo(const std::string& info) throw(INTERP_KER * Sets information on a component specified by an index. * To know more on format of this information * see \ref MEDCouplingArrayBasicsCompoName "DataArrays infos". + * \warning Don't pass NULL as \a info! * \param [in] i - the index (zero based) of the component of interest. * \param [in] info - the string containing the information. * \throw If \a i is not a valid component index. - * \warning Don't pass NULL as \a info! */ void DataArray::setInfoOnComponent(int i, const char *info) throw(INTERP_KERNEL::Exception) { @@ -417,7 +417,7 @@ void DataArray::checkNbOfComps(int nbOfCompo, const char *msg) const throw(INTER } } -void DataArray::checkNbOfElems(int nbOfElems, const char *msg) const throw(INTERP_KERNEL::Exception) +void DataArray::checkNbOfElems(std::size_t nbOfElems, const char *msg) const throw(INTERP_KERNEL::Exception) { if(getNbOfElems()!=nbOfElems) { @@ -572,7 +572,7 @@ DataArrayDouble *DataArrayDouble::New() * in \ref MEDCouplingArrayBasicsTuplesAndCompo "DataArrays infos" for more information. * \return bool - \a true if the raw data is allocated, \a false else. */ -bool DataArrayDouble::isAllocated() const +bool DataArrayDouble::isAllocated() const throw(INTERP_KERNEL::Exception) { return getConstPointer()!=0; } @@ -589,7 +589,7 @@ void DataArrayDouble::checkAllocated() const throw(INTERP_KERNEL::Exception) std::size_t DataArrayDouble::getHeapMemorySize() const { - std::size_t sz=(std::size_t)_mem.getNbOfElemAllocated(); + std::size_t sz=_mem.getNbOfElemAllocated(); sz*=sizeof(double); return DataArray::getHeapMemorySize()+sz; } @@ -655,9 +655,10 @@ bool DataArrayDouble::empty() const throw(INTERP_KERNEL::Exception) /*! * Returns a full copy of \a this. For more info on copying data arrays see * \ref MEDCouplingArrayBasicsCopyDeep. - * \return DataArrayDouble * - a new instance of DataArrayDouble. + * \return DataArrayDouble * - a new instance of DataArrayDouble. The caller is to + * delete this array using decrRef() as it is no more needed. */ -DataArrayDouble *DataArrayDouble::deepCpy() const +DataArrayDouble *DataArrayDouble::deepCpy() const throw(INTERP_KERNEL::Exception) { return new DataArrayDouble(*this); } @@ -669,7 +670,7 @@ DataArrayDouble *DataArrayDouble::deepCpy() const * \return DataArrayDouble * - either a new instance of DataArrayDouble (if \a dCpy * == \a true) or \a this instance (if \a dCpy == \a false). */ -DataArrayDouble *DataArrayDouble::performCpy(bool dCpy) const +DataArrayDouble *DataArrayDouble::performCpy(bool dCpy) const throw(INTERP_KERNEL::Exception) { if(dCpy) return deepCpy(); @@ -692,10 +693,10 @@ void DataArrayDouble::cpyFrom(const DataArrayDouble& other) throw(INTERP_KERNEL: int nbOfTuples=other.getNumberOfTuples(); int nbOfComp=other.getNumberOfComponents(); allocIfNecessary(nbOfTuples,nbOfComp); - int nbOfElems=nbOfTuples*nbOfComp; + std::size_t nbOfElems=(std::size_t)nbOfTuples*nbOfComp; double *pt=getPointer(); const double *ptI=other.getConstPointer(); - for(int i=0;igetNumberOfComponents() != 1. + * \throw If \a this->getNumberOfComponents() < 1. * \throw If \a this is not allocated. */ void DataArrayDouble::reverse() throw(INTERP_KERNEL::Exception) { checkAllocated(); - if(getNumberOfComponents()!=1) - throw INTERP_KERNEL::Exception("DataArrayDouble::reverse : only supported with 'this' array with ONE component !"); - _mem.reverse(); + _mem.reverse(getNumberOfComponents()); + declareAsNew(); } /*! @@ -995,14 +996,14 @@ bool DataArrayDouble::isMonotonic(bool increasing, double eps) const throw(INTER * DataArrayDouble. This text is shown when a DataArrayDouble is printed in Python. * \return std::string - text describing \a this DataArrayDouble. */ -std::string DataArrayDouble::repr() const +std::string DataArrayDouble::repr() const throw(INTERP_KERNEL::Exception) { std::ostringstream ret; reprStream(ret); return ret.str(); } -std::string DataArrayDouble::reprZip() const +std::string DataArrayDouble::reprZip() const throw(INTERP_KERNEL::Exception) { std::ostringstream ret; reprZipStream(ret); @@ -1019,33 +1020,33 @@ void DataArrayDouble::writeVTK(std::ostream& ofs, int indent, const char *nameIn ofs << std::endl << idt << "\n"; } -void DataArrayDouble::reprStream(std::ostream& stream) const +void DataArrayDouble::reprStream(std::ostream& stream) const throw(INTERP_KERNEL::Exception) { stream << "Name of double array : \"" << _name << "\"\n"; reprWithoutNameStream(stream); } -void DataArrayDouble::reprZipStream(std::ostream& stream) const +void DataArrayDouble::reprZipStream(std::ostream& stream) const throw(INTERP_KERNEL::Exception) { stream << "Name of double array : \"" << _name << "\"\n"; reprZipWithoutNameStream(stream); } -void DataArrayDouble::reprWithoutNameStream(std::ostream& stream) const +void DataArrayDouble::reprWithoutNameStream(std::ostream& stream) const throw(INTERP_KERNEL::Exception) { DataArray::reprWithoutNameStream(stream); stream.precision(17); _mem.repr(getNumberOfComponents(),stream); } -void DataArrayDouble::reprZipWithoutNameStream(std::ostream& stream) const +void DataArrayDouble::reprZipWithoutNameStream(std::ostream& stream) const throw(INTERP_KERNEL::Exception) { DataArray::reprWithoutNameStream(stream); stream.precision(17); _mem.reprZip(getNumberOfComponents(),stream); } -void DataArrayDouble::reprCppStream(const char *varName, std::ostream& stream) const +void DataArrayDouble::reprCppStream(const char *varName, std::ostream& stream) const throw(INTERP_KERNEL::Exception) { int nbTuples=getNumberOfTuples(),nbComp=getNumberOfComponents(); const double *data=getConstPointer(); @@ -1063,7 +1064,75 @@ void DataArrayDouble::reprCppStream(const char *varName, std::ostream& stream) c stream << varName << "->setName(\"" << getName() << "\");" << std::endl; } -bool DataArrayDouble::isEqualIfNotWhy(const DataArrayDouble& other, double prec, std::string& reason) const +/*! + * Method that gives a quick overvien of \a this for python. + */ +void DataArrayDouble::reprQuickOverview(std::ostream& stream) const throw(INTERP_KERNEL::Exception) +{ + static const std::size_t MAX_NB_OF_BYTE_IN_REPR=300; + stream << "DataArrayDouble C++ instance at " << this << ". "; + if(isAllocated()) + { + int nbOfCompo=(int)_info_on_compo.size(); + if(nbOfCompo>=1) + { + int nbOfTuples=getNumberOfTuples(); + stream << "Number of tuples : " << nbOfTuples << ". Number of components : " << nbOfCompo << "." << std::endl; + reprQuickOverviewData(stream,MAX_NB_OF_BYTE_IN_REPR); + } + else + stream << "Number of components : 0."; + } + else + stream << "*** No data allocated ****"; +} + +void DataArrayDouble::reprQuickOverviewData(std::ostream& stream, std::size_t maxNbOfByteInRepr) const throw(INTERP_KERNEL::Exception) +{ + const double *data=begin(); + int nbOfTuples=getNumberOfTuples(); + int nbOfCompo=(int)_info_on_compo.size(); + std::ostringstream oss2; oss2 << "["; + oss2.precision(17); + std::string oss2Str(oss2.str()); + bool isFinished=true; + for(int i=0;i1) + { + oss2 << "("; + for(int j=0;jalloc(getNumberOfTuples(),getNumberOfComponents()); - int nbOfVals=getNbOfElems(); + std::size_t nbOfVals=getNbOfElems(); const double *src=getConstPointer(); int *dest=ret->getPointer(); std::copy(src,src+nbOfVals,dest); @@ -1131,10 +1200,10 @@ DataArrayInt *DataArrayDouble::convertToIntArr() const * arranged in memory. If \a this array holds 2 components of 3 values: * \f$ x_0,x_1,x_2,y_0,y_1,y_2 \f$, then the result array holds these values arranged * as follows: \f$ x_0,y_0,x_1,y_1,x_2,y_2 \f$. + * \warning Do not confuse this method with transpose()! * \return DataArrayDouble * - the new instance of DataArrayDouble that the caller * is to delete using decrRef() as it is no more needed. * \throw If \a this is not allocated. - * \warning Do not confuse this method with transpose()! */ DataArrayDouble *DataArrayDouble::fromNoInterlace() const throw(INTERP_KERNEL::Exception) { @@ -1151,10 +1220,10 @@ DataArrayDouble *DataArrayDouble::fromNoInterlace() const throw(INTERP_KERNEL::E * arranged in memory. If \a this array holds 2 components of 3 values: * \f$ x_0,y_0,x_1,y_1,x_2,y_2 \f$, then the result array holds these values arranged * as follows: \f$ x_0,x_1,x_2,y_0,y_1,y_2 \f$. + * \warning Do not confuse this method with transpose()! * \return DataArrayDouble * - the new instance of DataArrayDouble that the caller * is to delete using decrRef() as it is no more needed. * \throw If \a this is not allocated. - * \warning Do not confuse this method with transpose()! */ DataArrayDouble *DataArrayDouble::toNoInterlace() const throw(INTERP_KERNEL::Exception) { @@ -1175,7 +1244,7 @@ DataArrayDouble *DataArrayDouble::toNoInterlace() const throw(INTERP_KERNEL::Exc * \param [in] old2New - C array of length equal to \a this->getNumberOfTuples() * giving a new position for i-th old value. */ -void DataArrayDouble::renumberInPlace(const int *old2New) +void DataArrayDouble::renumberInPlace(const int *old2New) throw(INTERP_KERNEL::Exception) { checkAllocated(); int nbTuples=getNumberOfTuples(); @@ -1199,7 +1268,7 @@ void DataArrayDouble::renumberInPlace(const int *old2New) * \return DataArrayDouble * - the new instance of DataArrayDouble that the caller * is to delete using decrRef() as it is no more needed. */ -void DataArrayDouble::renumberInPlaceR(const int *new2Old) +void DataArrayDouble::renumberInPlaceR(const int *new2Old) throw(INTERP_KERNEL::Exception) { checkAllocated(); int nbTuples=getNumberOfTuples(); @@ -1225,12 +1294,12 @@ void DataArrayDouble::renumberInPlaceR(const int *new2Old) * is to delete using decrRef() as it is no more needed. * \throw If \a this is not allocated. */ -DataArrayDouble *DataArrayDouble::renumber(const int *old2New) const +DataArrayDouble *DataArrayDouble::renumber(const int *old2New) const throw(INTERP_KERNEL::Exception) { checkAllocated(); int nbTuples=getNumberOfTuples(); int nbOfCompo=getNumberOfComponents(); - DataArrayDouble *ret=DataArrayDouble::New(); + MEDCouplingAutoRefCountObjectPtr ret=DataArrayDouble::New(); ret->alloc(nbTuples,nbOfCompo); ret->copyStringInfoFrom(*this); const double *iptr=getConstPointer(); @@ -1238,7 +1307,7 @@ DataArrayDouble *DataArrayDouble::renumber(const int *old2New) const for(int i=0;icopyStringInfoFrom(*this); - return ret; + return ret.retn(); } /*! @@ -1252,12 +1321,12 @@ DataArrayDouble *DataArrayDouble::renumber(const int *old2New) const * \return DataArrayDouble * - the new instance of DataArrayDouble that the caller * is to delete using decrRef() as it is no more needed. */ -DataArrayDouble *DataArrayDouble::renumberR(const int *new2Old) const +DataArrayDouble *DataArrayDouble::renumberR(const int *new2Old) const throw(INTERP_KERNEL::Exception) { checkAllocated(); int nbTuples=getNumberOfTuples(); int nbOfCompo=getNumberOfComponents(); - DataArrayDouble *ret=DataArrayDouble::New(); + MEDCouplingAutoRefCountObjectPtr ret=DataArrayDouble::New(); ret->alloc(nbTuples,nbOfCompo); ret->copyStringInfoFrom(*this); const double *iptr=getConstPointer(); @@ -1265,7 +1334,7 @@ DataArrayDouble *DataArrayDouble::renumberR(const int *new2Old) const for(int i=0;icopyStringInfoFrom(*this); - return ret; + return ret.retn(); } /*! @@ -1281,12 +1350,12 @@ DataArrayDouble *DataArrayDouble::renumberR(const int *new2Old) const * \return DataArrayDouble * - the new instance of DataArrayDouble that the caller * is to delete using decrRef() as it is no more needed. */ -DataArrayDouble *DataArrayDouble::renumberAndReduce(const int *old2New, int newNbOfTuple) const +DataArrayDouble *DataArrayDouble::renumberAndReduce(const int *old2New, int newNbOfTuple) const throw(INTERP_KERNEL::Exception) { checkAllocated(); int nbTuples=getNumberOfTuples(); int nbOfCompo=getNumberOfComponents(); - DataArrayDouble *ret=DataArrayDouble::New(); + MEDCouplingAutoRefCountObjectPtr ret=DataArrayDouble::New(); ret->alloc(newNbOfTuple,nbOfCompo); const double *iptr=getConstPointer(); double *optr=ret->getPointer(); @@ -1297,7 +1366,7 @@ DataArrayDouble *DataArrayDouble::renumberAndReduce(const int *old2New, int newN std::copy(iptr+i*nbOfCompo,iptr+(i+1)*nbOfCompo,optr+w*nbOfCompo); } ret->copyStringInfoFrom(*this); - return ret; + return ret.retn(); } /*! @@ -1366,7 +1435,7 @@ DataArrayDouble *DataArrayDouble::selectByTupleIdSafe(const int *new2OldBg, cons if(*w>=0 && *wgetNumberOfTuples) !"); + throw INTERP_KERNEL::Exception("DataArrayDouble::selectByTupleIdSafe : some ids has been detected to be out of [0,this->getNumberOfTuples) !"); ret->copyStringInfoFrom(*this); return ret.retn(); } @@ -1384,7 +1453,6 @@ DataArrayDouble *DataArrayDouble::selectByTupleIdSafe(const int *new2OldBg, cons * \param [in] step - index increment to get index of the next tuple to copy. * \return DataArrayDouble * - the new instance of DataArrayDouble that the caller * is to delete using decrRef() as it is no more needed. - * \throw If (\a end2 < \a bg) or (\a step <= 0). * \sa DataArrayDouble::substr. */ DataArrayDouble *DataArrayDouble::selectByTupleId2(int bg, int end2, int step) const throw(INTERP_KERNEL::Exception) @@ -1392,7 +1460,7 @@ DataArrayDouble *DataArrayDouble::selectByTupleId2(int bg, int end2, int step) c checkAllocated(); MEDCouplingAutoRefCountObjectPtr ret=DataArrayDouble::New(); int nbComp=getNumberOfComponents(); - int newNbOfTuples=GetNumberOfItemGivenBES(bg,end2,step,"DataArrayDouble::selectByTupleId2 : "); + int newNbOfTuples=GetNumberOfItemGivenBESRelative(bg,end2,step,"DataArrayDouble::selectByTupleId2 : "); ret->alloc(newNbOfTuples,nbComp); double *pt=ret->getPointer(); const double *srcPt=getConstPointer()+bg*nbComp; @@ -1498,11 +1566,11 @@ DataArrayDouble *DataArrayDouble::substr(int tupleIdBg, int tupleIdEnd) const th else trueEnd=nbt; int nbComp=getNumberOfComponents(); - DataArrayDouble *ret=DataArrayDouble::New(); + MEDCouplingAutoRefCountObjectPtr ret=DataArrayDouble::New(); ret->alloc(trueEnd-tupleIdBg,nbComp); ret->copyStringInfoFrom(*this); std::copy(getConstPointer()+tupleIdBg*nbComp,getConstPointer()+trueEnd*nbComp,ret->getPointer()); - return ret; + return ret.retn(); } /*! @@ -1521,7 +1589,7 @@ DataArrayDouble *DataArrayDouble::substr(int tupleIdBg, int tupleIdEnd) const th DataArrayDouble *DataArrayDouble::changeNbOfComponents(int newNbOfComp, double dftValue) const throw(INTERP_KERNEL::Exception) { checkAllocated(); - DataArrayDouble *ret=DataArrayDouble::New(); + MEDCouplingAutoRefCountObjectPtr ret=DataArrayDouble::New(); ret->alloc(getNumberOfTuples(),newNbOfComp); const double *oldc=getConstPointer(); double *nc=ret->getPointer(); @@ -1540,23 +1608,30 @@ DataArrayDouble *DataArrayDouble::changeNbOfComponents(int newNbOfComp, double d for(int i=0;isetInfoOnComponent(i,getInfoOnComponent(i).c_str()); ret->setName(getName().c_str()); - return ret; + return ret.retn(); } /*! * Changes the number of components within \a this array so that its raw data **does * not** change, instead splitting this data into tuples changes. + * \warning This method erases all (name and unit) component info set before! * \param [in] newNbOfComp - number of components for \a this array to have. * \throw If \a this is not allocated * \throw If getNbOfElems() % \a newNbOfCompo != 0. + * \throw If \a newNbOfCompo is lower than 1. + * \throw If the rearrange method would lead to a number of tuples higher than 2147483647 (maximal capacity of int32 !). * \warning This method erases all (name and unit) component info set before! */ void DataArrayDouble::rearrange(int newNbOfCompo) throw(INTERP_KERNEL::Exception) { checkAllocated(); - int nbOfElems=getNbOfElems(); + if(newNbOfCompo<1) + throw INTERP_KERNEL::Exception("DataArrayDouble::rearrange : input newNbOfCompo must be > 0 !"); + std::size_t nbOfElems=getNbOfElems(); if(nbOfElems%newNbOfCompo!=0) throw INTERP_KERNEL::Exception("DataArrayDouble::rearrange : nbOfElems%newNbOfCompo!=0 !"); + if(nbOfElems/newNbOfCompo>(std::size_t)std::numeric_limits::max()) + throw INTERP_KERNEL::Exception("DataArrayDouble::rearrange : the rearrangement leads to too high number of tuples (> 2147483647) !"); _info_on_compo.clear(); _info_on_compo.resize(newNbOfCompo); declareAsNew(); @@ -1567,9 +1642,9 @@ void DataArrayDouble::rearrange(int newNbOfCompo) throw(INTERP_KERNEL::Exception * of tuples, and inversely its number of tuples to become equal to its number of * components. So that its raw data **does not** change, instead splitting this * data into tuples changes. - * \throw If \a this is not allocated. * \warning This method erases all (name and unit) component info set before! * \warning Do not confuse this method with fromNoInterlace() and toNoInterlace()! + * \throw If \a this is not allocated. * \sa rearrange() */ void DataArrayDouble::transpose() throw(INTERP_KERNEL::Exception) @@ -1664,10 +1739,10 @@ void DataArrayDouble::meldWith(const DataArrayDouble *other) throw(INTERP_KERNEL * * This method is typically used by MEDCouplingPointSet::findCommonNodes() and * MEDCouplingUMesh::mergeNodes(). - * \param [in] prec - minimal absolute distance between two tuples at which they are + * \param [in] prec - minimal absolute distance between two tuples (infinite norm) at which they are * considered not coincident. - * \param [in] limitTupleId - limit tuple id. Tuples with id strictly lower than \a - * limitTupleId are not considered. + * \param [in] limitTupleId - limit tuple id. If all tuples within a group of coincident + * tuples have id strictly lower than \a limitTupleId then they are not returned. * \param [out] comm - the array holding ids (== indices) of coincident tuples. * \a comm->getNumberOfComponents() == 1. * \a comm->getNumberOfTuples() == \a commIndex->back(). @@ -1678,7 +1753,6 @@ void DataArrayDouble::meldWith(const DataArrayDouble *other) throw(INTERP_KERNEL * [ \a commIndex[1], \a commIndex[2] ). \a commIndex->getNumberOfTuples()-1 * gives the number of groups of coincident tuples. * \throw If \a this is not allocated. - * \throw If \a this and \a other arrays have different number of tuples. * \throw If the number of components is not in [1,2,3]. * * \ref cpp_mcdataarraydouble_findcommontuples "Here is a C++ example". @@ -1695,19 +1769,17 @@ void DataArrayDouble::findCommonTuples(double prec, int limitTupleId, DataArrayI int nbOfTuples=getNumberOfTuples(); // - MEDCouplingAutoRefCountObjectPtr bbox=computeBBoxPerTuple(prec); - // MEDCouplingAutoRefCountObjectPtr c(DataArrayInt::New()),cI(DataArrayInt::New()); c->alloc(0,1); cI->pushBackSilent(0); switch(nbOfCompo) { case 3: - findCommonTuplesAlg<3>(bbox->getConstPointer(),nbOfTuples,limitTupleId,prec,c,cI); + findCommonTuplesAlg<3>(begin(),nbOfTuples,limitTupleId,prec,c,cI); break; case 2: - findCommonTuplesAlg<2>(bbox->getConstPointer(),nbOfTuples,limitTupleId,prec,c,cI); + findCommonTuplesAlg<2>(begin(),nbOfTuples,limitTupleId,prec,c,cI); break; case 1: - findCommonTuplesAlg<1>(bbox->getConstPointer(),nbOfTuples,limitTupleId,prec,c,cI); + findCommonTuplesAlg<1>(begin(),nbOfTuples,limitTupleId,prec,c,cI); break; default: throw INTERP_KERNEL::Exception("DataArrayDouble::findCommonTuples : nb of components managed are 1,2 and 3 ! not implemented for other number of components !"); @@ -1840,8 +1912,8 @@ DataArrayInt *DataArrayDouble::findClosestTupleId(const DataArrayDouble *other) * that coincident tuples are excluded. * \param [in] prec - minimal absolute distance between two tuples at which they are * considered not coincident. - * \param [in] limitTupleId - limit tuple id. Tuples with id strictly lower than \a - * limiTupleId are not considered and thus not excluded. + * \param [in] limitTupleId - limit tuple id. If all tuples within a group of coincident + * tuples have id strictly lower than \a limitTupleId then they are not excluded. * \return DataArrayDouble * - the new instance of DataArrayDouble that the caller * is to delete using decrRef() as it is no more needed. * \throw If \a this is not allocated. @@ -1862,7 +1934,6 @@ DataArrayDouble *DataArrayDouble::getDifferentValues(double prec, int limitTuple /*! * Copy all components in a specified order from another DataArrayDouble. - * The specified components become the first ones in \a this array. * Both numerical and textual data is copied. The number of tuples in \a this and * the other array can be different. * \param [in] a - the array to copy data from. @@ -1938,7 +2009,7 @@ void DataArrayDouble::setPartOfValues1(const DataArrayDouble *a, int bgTuples, i DataArray::CheckValueInRangeEx(nbOfTuples,bgTuples,endTuples,"invalid tuple value"); DataArray::CheckValueInRangeEx(nbComp,bgComp,endComp,"invalid component value"); bool assignTech=true; - if(a->getNbOfElems()==newNbOfTuples*newNbOfComp) + if(a->getNbOfElems()==(std::size_t)newNbOfTuples*newNbOfComp) { if(strictCompoCompare) a->checkNbOfTuplesAndComp(newNbOfTuples,newNbOfComp,msg); @@ -2055,7 +2126,7 @@ void DataArrayDouble::setPartOfValues2(const DataArrayDouble *a, const int *bgTu int newNbOfTuples=(int)std::distance(bgTuples,endTuples); int newNbOfComp=(int)std::distance(bgComp,endComp); bool assignTech=true; - if(a->getNbOfElems()==newNbOfTuples*newNbOfComp) + if(a->getNbOfElems()==(std::size_t)newNbOfTuples*newNbOfComp) { if(strictCompoCompare) a->checkNbOfTuplesAndComp(newNbOfTuples,newNbOfComp,msg); @@ -2074,7 +2145,7 @@ void DataArrayDouble::setPartOfValues2(const DataArrayDouble *a, const int *bgTu DataArray::CheckValueInRange(nbOfTuples,*w,"invalid tuple id"); for(const int *z=bgComp;z!=endComp;z++,srcPt++) { - pt[(*w)*nbComp+(*z)]=*srcPt; + pt[(std::size_t)(*w)*nbComp+(*z)]=*srcPt; } } } @@ -2086,7 +2157,7 @@ void DataArrayDouble::setPartOfValues2(const DataArrayDouble *a, const int *bgTu DataArray::CheckValueInRange(nbOfTuples,*w,"invalid tuple id"); for(const int *z=bgComp;z!=endComp;z++,srcPt2++) { - pt[(*w)*nbComp+(*z)]=*srcPt2; + pt[(std::size_t)(*w)*nbComp+(*z)]=*srcPt2; } } } @@ -2124,7 +2195,7 @@ void DataArrayDouble::setPartOfValuesSimple2(double a, const int *bgTuples, cons for(const int *z=bgComp;z!=endComp;z++) { DataArray::CheckValueInRange(nbOfTuples,*w,"invalid tuple id"); - pt[(*w)*nbComp+(*z)]=a; + pt[(std::size_t)(*w)*nbComp+(*z)]=a; } } @@ -2185,7 +2256,7 @@ void DataArrayDouble::setPartOfValues3(const DataArrayDouble *a, const int *bgTu DataArray::CheckValueInRangeEx(nbComp,bgComp,endComp,"invalid component value"); int newNbOfTuples=(int)std::distance(bgTuples,endTuples); bool assignTech=true; - if(a->getNbOfElems()==newNbOfTuples*newNbOfComp) + if(a->getNbOfElems()==(std::size_t)newNbOfTuples*newNbOfComp) { if(strictCompoCompare) a->checkNbOfTuplesAndComp(newNbOfTuples,newNbOfComp,msg); @@ -2203,7 +2274,7 @@ void DataArrayDouble::setPartOfValues3(const DataArrayDouble *a, const int *bgTu for(int j=0;jgetNbOfElems()==newNbOfTuples*newNbOfComp) + if(a->getNbOfElems()==(std::size_t)newNbOfTuples*newNbOfComp) { if(strictCompoCompare) a->checkNbOfTuplesAndComp(newNbOfTuples,newNbOfComp,msg); @@ -2546,7 +2617,7 @@ double DataArrayDouble::getIJSafe(int tupleId, int compoId) const throw(INTERP_K std::ostringstream oss; oss << "DataArrayDouble::getIJSafe : request for compoId " << compoId << " should be in [0," << getNumberOfComponents() << ") !"; throw INTERP_KERNEL::Exception(oss.str().c_str()); } - return _mem[tupleId*((int)_info_on_compo.size())+compoId]; + return _mem[tupleId*_info_on_compo.size()+compoId]; } /*! @@ -2591,17 +2662,17 @@ void DataArrayDouble::SetArrayIn(DataArrayDouble *newArray, DataArrayDouble* &ar * \param [in] nbOfTuple - new number of tuples in \a this. * \param [in] nbOfCompo - new number of components in \a this. */ -void DataArrayDouble::useArray(const double *array, bool ownership, DeallocType type, int nbOfTuple, int nbOfCompo) +void DataArrayDouble::useArray(const double *array, bool ownership, DeallocType type, int nbOfTuple, int nbOfCompo) throw(INTERP_KERNEL::Exception) { _info_on_compo.resize(nbOfCompo); - _mem.useArray(array,ownership,type,nbOfTuple*nbOfCompo); + _mem.useArray(array,ownership,type,(std::size_t)nbOfTuple*nbOfCompo); declareAsNew(); } -void DataArrayDouble::useExternalArrayWithRWAccess(const double *array, int nbOfTuple, int nbOfCompo) +void DataArrayDouble::useExternalArrayWithRWAccess(const double *array, int nbOfTuple, int nbOfCompo) throw(INTERP_KERNEL::Exception) { _info_on_compo.resize(nbOfCompo); - _mem.useExternalArrayWithRWAccess(array,nbOfTuple*nbOfCompo); + _mem.useExternalArrayWithRWAccess(array,(std::size_t)nbOfTuple*nbOfCompo); declareAsNew(); } @@ -2613,7 +2684,7 @@ void DataArrayDouble::useExternalArrayWithRWAccess(const double *array, int nbOf void DataArrayDouble::checkNoNullValues() const throw(INTERP_KERNEL::Exception) { const double *tmp=getConstPointer(); - int nbOfElems=getNbOfElems(); + std::size_t nbOfElems=getNbOfElems(); const double *where=std::find(tmp,tmp+nbOfElems,0.); if(where!=tmp+nbOfElems) throw INTERP_KERNEL::Exception("A value 0.0 have been detected !"); @@ -2692,7 +2763,7 @@ DataArrayDouble *DataArrayDouble::computeBBoxPerTuple(double epsilon)const throw * Two tuples are considered equal if the euclidian distance between the two tuples is lower than \a eps. * * \param [in] other a DataArrayDouble having same number of components than \a this. - * \param [in] eps absolute precision representing euclidian distance between 2 tuples behind which 2 tuples are considered equal. + * \param [in] eps absolute precision representing distance (using infinite norm) between 2 tuples behind which 2 tuples are considered equal. * \param [out] c will contain the set of tuple ids in \a this that are equal to to the tuple ids in \a other contiguously. * \a cI allows to extract information in \a c. * \param [out] cI is an indirection array that allows to extract the data contained in \a c. @@ -2710,7 +2781,6 @@ void DataArrayDouble::computeTupleIdsNearTuples(const DataArrayDouble *other, do if(!other) throw INTERP_KERNEL::Exception("DataArrayDouble::computeTupleIdsNearTuples : input pointer other is null !"); checkAllocated(); - MEDCouplingAutoRefCountObjectPtr bbox=computeBBoxPerTuple(eps); other->checkAllocated(); int nbOfCompo=getNumberOfComponents(); int otherNbOfCompo=other->getNumberOfComponents(); @@ -2722,19 +2792,19 @@ void DataArrayDouble::computeTupleIdsNearTuples(const DataArrayDouble *other, do { case 3: { - BBTree<3,int> myTree(bbox->getConstPointer(),0,0,getNumberOfTuples(),eps/10); + BBTreePts<3,int> myTree(begin(),0,0,getNumberOfTuples(),eps); FindTupleIdsNearTuplesAlg<3>(myTree,other->getConstPointer(),nbOfTuplesOther,eps,cArr,cIArr); break; } case 2: { - BBTree<2,int> myTree(bbox->getConstPointer(),0,0,getNumberOfTuples(),eps/10); + BBTreePts<2,int> myTree(begin(),0,0,getNumberOfTuples(),eps); FindTupleIdsNearTuplesAlg<2>(myTree,other->getConstPointer(),nbOfTuplesOther,eps,cArr,cIArr); break; } case 1: { - BBTree<1,int> myTree(bbox->getConstPointer(),0,0,getNumberOfTuples(),eps/10); + BBTreePts<1,int> myTree(begin(),0,0,getNumberOfTuples(),eps); FindTupleIdsNearTuplesAlg<1>(myTree,other->getConstPointer(),nbOfTuplesOther,eps,cArr,cIArr); break; } @@ -2899,9 +2969,9 @@ double DataArrayDouble::norm2() const throw(INTERP_KERNEL::Exception) { checkAllocated(); double ret=0.; - int nbOfElems=getNbOfElems(); + std::size_t nbOfElems=getNbOfElems(); const double *pt=getConstPointer(); - for(int i=0;iret) @@ -3512,7 +3582,7 @@ void DataArrayDouble::abs() throw(INTERP_KERNEL::Exception) { checkAllocated(); double *ptr=getPointer(); - int nbOfElems=getNbOfElems(); + std::size_t nbOfElems=getNbOfElems(); std::transform(ptr,ptr+nbOfElems,ptr,std::ptr_fun(fabs)); declareAsNew(); } @@ -3547,8 +3617,8 @@ void DataArrayDouble::applyLin(double a, double b) throw(INTERP_KERNEL::Exceptio { checkAllocated(); double *ptr=getPointer(); - int nbOfElems=getNbOfElems(); - for(int i=0;istd::numeric_limits::min()) { @@ -3605,6 +3675,66 @@ DataArrayDouble *DataArrayDouble::negate() const throw(INTERP_KERNEL::Exception) return newArr; } +/*! + * Modify all elements of \a this array, so that + * an element _x_ becomes val ^ x . Contrary to DataArrayInt::applyPow + * all values in \a this have to be >= 0 if val is \b not integer. + * \param [in] val - the value used to apply pow on all array elements. + * \throw If \a this is not allocated. + * \warning If an exception is thrown because of presence of 0 element in \a this + * array and \a val is \b not integer, all elements processed before detection of the zero element remain + * modified. + */ +void DataArrayDouble::applyPow(double val) throw(INTERP_KERNEL::Exception) +{ + checkAllocated(); + double *ptr=getPointer(); + std::size_t nbOfElems=getNbOfElems(); + int val2=(int)val; + bool isInt=((double)val2)==val; + if(!isInt) + { + for(std::size_t i=0;i=0) + *ptr=pow(*ptr,val); + else + { + std::ostringstream oss; oss << "DataArrayDouble::applyPow (double) : At elem # " << i << " value is " << *ptr << " ! must be >=0. !"; + throw INTERP_KERNEL::Exception(oss.str().c_str()); + } + } + } + else + { + for(std::size_t i=0;i= 0 !"); + double *ptr=getPointer(); + std::size_t nbOfElems=getNbOfElems(); + for(std::size_t i=0;igetNumberOfComponents() != 1 - * - * \ref cpp_mcdataarraydouble_getidsinrange "Here is a C++ example". + * \throw If \a this->getNumberOfComponents() != 1. * + * \ref cpp_mcdataarraydouble_getidsinrange "Here is a C++ example".
* \ref py_mcdataarraydouble_getidsinrange "Here is a Python example". */ DataArrayInt *DataArrayDouble::getIdsInRange(double vmin, double vmax) const throw(INTERP_KERNEL::Exception) @@ -3917,15 +4046,12 @@ DataArrayInt *DataArrayDouble::getIdsInRange(double vmin, double vmax) const thr if(getNumberOfComponents()!=1) throw INTERP_KERNEL::Exception("DataArrayDouble::getIdsInRange : this must have exactly one component !"); const double *cptr=getConstPointer(); - std::vector res; + MEDCouplingAutoRefCountObjectPtr ret=DataArrayInt::New(); ret->alloc(0,1); int nbOfTuples=getNumberOfTuples(); for(int i=0;i=vmin && *cptr<=vmax) - res.push_back(i); - DataArrayInt *ret=DataArrayInt::New(); - ret->alloc((int)res.size(),1); - std::copy(res.begin(),res.end(),ret->getPointer()); - return ret; + ret->pushBackSilent(i); + return ret.retn(); } /*! @@ -3979,13 +4105,13 @@ DataArrayDouble *DataArrayDouble::Aggregate(const std::vectorgetNumberOfTuples(); } - DataArrayDouble *ret=DataArrayDouble::New(); + MEDCouplingAutoRefCountObjectPtr ret=DataArrayDouble::New(); ret->alloc(nbt,nbOfComp); double *pt=ret->getPointer(); for(it=a.begin();it!=a.end();it++) pt=std::copy((*it)->getConstPointer(),(*it)->getConstPointer()+(*it)->getNbOfElems(),pt); ret->copyStringInfoFrom(*(a[0])); - return ret; + return ret.retn(); } /*! @@ -4528,7 +4654,7 @@ void DataArrayDouble::substractEqual(const DataArrayDouble *other) throw(INTERP_ * valid cases. * 1. The arrays have same number of tuples and components. Then each value of * the result array (_a_) is a product of the corresponding values of \a a1 and - * \a a2, i.e.: _a_ [ i, j ] = _a1_ [ i, j ] * _a2_ [ i, j ]. + * \a a2, i.e. _a_ [ i, j ] = _a1_ [ i, j ] * _a2_ [ i, j ]. * 2. The arrays have same number of tuples and one array, say _a2_, has one * component. Then * _a_ [ i, j ] = _a1_ [ i, j ] * _a2_ [ i, 0 ]. @@ -4622,12 +4748,12 @@ DataArrayDouble *DataArrayDouble::Multiply(const DataArrayDouble *a1, const Data * Multiply values of another DataArrayDouble to values of \a this one. There are 3 * valid cases. * 1. The arrays have same number of tuples and components. Then each value of - * \a other array is multiplied to the corresponding value of \a this array, i.e.: - * _a_ [ i, j ] *= _other_ [ i, j ]. + * \a other array is multiplied to the corresponding value of \a this array, i.e. + * _this_ [ i, j ] *= _other_ [ i, j ]. * 2. The arrays have same number of tuples and \a other array has one component. Then - * _a_ [ i, j ] *= _other_ [ i, 0 ]. + * _this_ [ i, j ] *= _other_ [ i, 0 ]. * 3. The arrays have same number of components and \a other array has one tuple. Then - * _a_ [ i, j ] *= _a2_ [ 0, j ]. + * _this_ [ i, j ] *= _a2_ [ 0, j ]. * * \param [in] other - an array to multiply to \a this one. * \throw If \a other is NULL. @@ -4694,6 +4820,7 @@ void DataArrayDouble::multiplyEqual(const DataArrayDouble *other) throw(INTERP_K * * Info on components is copied either from the first array (in the first case) or from * the array with maximal number of elements (getNbOfElems()). + * \warning No check of division by zero is performed! * \param [in] a1 - a numerator array. * \param [in] a2 - a denominator array. * \return DataArrayDouble * - the new instance of DataArrayDouble. @@ -4703,7 +4830,6 @@ void DataArrayDouble::multiplyEqual(const DataArrayDouble *other) throw(INTERP_K * \throw If \a a1->getNumberOfTuples() != \a a2->getNumberOfTuples() and * \a a1->getNumberOfComponents() != \a a2->getNumberOfComponents() and * none of them has number of tuples or components equal to 1. - * \warning No check of division by zero is performed! */ DataArrayDouble *DataArrayDouble::Divide(const DataArrayDouble *a1, const DataArrayDouble *a2) throw(INTERP_KERNEL::Exception) { @@ -4771,12 +4897,12 @@ DataArrayDouble *DataArrayDouble::Divide(const DataArrayDouble *a1, const DataAr * 3. The arrays have same number of components and \a other array has one tuple. Then * _a_ [ i, j ] /= _a2_ [ 0, j ]. * + * \warning No check of division by zero is performed! * \param [in] other - an array to divide \a this one by. * \throw If \a other is NULL. * \throw If \a this->getNumberOfTuples() != \a other->getNumberOfTuples() and * \a this->getNumberOfComponents() != \a other->getNumberOfComponents() and * \a other has number of both tuples and components not equal to 1. - * \warning No check of division by zero is performed! */ void DataArrayDouble::divideEqual(const DataArrayDouble *other) throw(INTERP_KERNEL::Exception) { @@ -4822,6 +4948,86 @@ void DataArrayDouble::divideEqual(const DataArrayDouble *other) throw(INTERP_KER declareAsNew(); } +/*! + * Returns a new DataArrayDouble that is the result of pow of two given arrays. There are 3 + * valid cases. + * + * \param [in] a1 - an array to pow up. + * \param [in] a2 - another array to sum up. + * \return DataArrayDouble * - the new instance of DataArrayDouble. + * The caller is to delete this result array using decrRef() as it is no more + * needed. + * \throw If either \a a1 or \a a2 is NULL. + * \throw If \a a1->getNumberOfTuples() != \a a2->getNumberOfTuples() + * \throw If \a a1->getNumberOfComponents() != 1 or \a a2->getNumberOfComponents() != 1. + * \throw If there is a negative value in \a a1. + */ +DataArrayDouble *DataArrayDouble::Pow(const DataArrayDouble *a1, const DataArrayDouble *a2) throw(INTERP_KERNEL::Exception) +{ + if(!a1 || !a2) + throw INTERP_KERNEL::Exception("DataArrayDouble::Pow : at least one of input instances is null !"); + int nbOfTuple=a1->getNumberOfTuples(); + int nbOfTuple2=a2->getNumberOfTuples(); + int nbOfComp=a1->getNumberOfComponents(); + int nbOfComp2=a2->getNumberOfComponents(); + if(nbOfTuple!=nbOfTuple2) + throw INTERP_KERNEL::Exception("DataArrayDouble::Pow : number of tuples mismatches !"); + if(nbOfComp!=1 || nbOfComp2!=1) + throw INTERP_KERNEL::Exception("DataArrayDouble::Pow : number of components of both arrays must be equal to 1 !"); + MEDCouplingAutoRefCountObjectPtr ret=DataArrayDouble::New(); ret->alloc(nbOfTuple,1); + const double *ptr1(a1->begin()),*ptr2(a2->begin()); + double *ptr=ret->getPointer(); + for(int i=0;i=0) + { + *ptr=pow(*ptr1,*ptr2); + } + else + { + std::ostringstream oss; oss << "DataArrayDouble::Pow : on tuple #" << i << " of a1 value is < 0 (" << *ptr1 << ") !"; + throw INTERP_KERNEL::Exception(oss.str().c_str()); + } + } + return ret.retn(); +} + +/*! + * Apply pow on values of another DataArrayDouble to values of \a this one. + * + * \param [in] other - an array to pow to \a this one. + * \throw If \a other is NULL. + * \throw If \a this->getNumberOfTuples() != \a other->getNumberOfTuples() + * \throw If \a this->getNumberOfComponents() != 1 or \a other->getNumberOfComponents() != 1 + * \throw If there is a negative value in \a this. + */ +void DataArrayDouble::powEqual(const DataArrayDouble *other) throw(INTERP_KERNEL::Exception) +{ + if(!other) + throw INTERP_KERNEL::Exception("DataArrayDouble::powEqual : input instance is null !"); + int nbOfTuple=getNumberOfTuples(); + int nbOfTuple2=other->getNumberOfTuples(); + int nbOfComp=getNumberOfComponents(); + int nbOfComp2=other->getNumberOfComponents(); + if(nbOfTuple!=nbOfTuple2) + throw INTERP_KERNEL::Exception("DataArrayDouble::powEqual : number of tuples mismatches !"); + if(nbOfComp!=1 || nbOfComp2!=1) + throw INTERP_KERNEL::Exception("DataArrayDouble::powEqual : number of components of both arrays must be equal to 1 !"); + double *ptr=getPointer(); + const double *ptrc=other->begin(); + for(int i=0;i=0) + *ptr=pow(*ptr,*ptrc); + else + { + std::ostringstream oss; oss << "DataArrayDouble::powEqual : on tuple #" << i << " of this value is < 0 (" << *ptr << ") !"; + throw INTERP_KERNEL::Exception(oss.str().c_str()); + } + } + declareAsNew(); +} + /*! * Useless method for end user. Only for MPI/Corba/File serialsation for multi arrays class. * Server side. @@ -4912,7 +5118,7 @@ DataArrayDoubleIterator::~DataArrayDoubleIterator() _da->decrRef(); } -DataArrayDoubleTuple *DataArrayDoubleIterator::nextt() +DataArrayDoubleTuple *DataArrayDoubleIterator::nextt() throw(INTERP_KERNEL::Exception) { if(_tuple_id<_nb_tuple) { @@ -4930,7 +5136,7 @@ DataArrayDoubleTuple::DataArrayDoubleTuple(double *pt, int nbOfComp):_pt(pt),_nb } -std::string DataArrayDoubleTuple::repr() const +std::string DataArrayDoubleTuple::repr() const throw(INTERP_KERNEL::Exception) { std::ostringstream oss; oss.precision(17); oss << "("; for(int i=0;i<_nb_of_compo-1;i++) @@ -4982,7 +5188,7 @@ DataArrayInt *DataArrayInt::New() * in \ref MEDCouplingArrayBasicsTuplesAndCompo "DataArrays infos" for more information. * \return bool - \a true if the raw data is allocated, \a false else. */ -bool DataArrayInt::isAllocated() const +bool DataArrayInt::isAllocated() const throw(INTERP_KERNEL::Exception) { return getConstPointer()!=0; } @@ -4999,7 +5205,7 @@ void DataArrayInt::checkAllocated() const throw(INTERP_KERNEL::Exception) std::size_t DataArrayInt::getHeapMemorySize() const { - std::size_t sz=(std::size_t)_mem.getNbOfElemAllocated(); + std::size_t sz=_mem.getNbOfElemAllocated(); sz*=sizeof(int); return DataArray::getHeapMemorySize()+sz; } @@ -5060,14 +5266,14 @@ int DataArrayInt::intValue() const throw(INTERP_KERNEL::Exception) int DataArrayInt::getHashCode() const throw(INTERP_KERNEL::Exception) { checkAllocated(); - int nbOfElems=getNbOfElems(); + std::size_t nbOfElems=getNbOfElems(); int ret=nbOfElems*65536; int delta=3; if(nbOfElems>48) delta=nbOfElems/8; int ret0=0; const int *pt=begin(); - for(int i=0;i\n"; } -void DataArrayInt::reprStream(std::ostream& stream) const +void DataArrayInt::reprStream(std::ostream& stream) const throw(INTERP_KERNEL::Exception) { stream << "Name of int array : \"" << _name << "\"\n"; reprWithoutNameStream(stream); } -void DataArrayInt::reprZipStream(std::ostream& stream) const +void DataArrayInt::reprZipStream(std::ostream& stream) const throw(INTERP_KERNEL::Exception) { stream << "Name of int array : \"" << _name << "\"\n"; reprZipWithoutNameStream(stream); } -void DataArrayInt::reprWithoutNameStream(std::ostream& stream) const +void DataArrayInt::reprWithoutNameStream(std::ostream& stream) const throw(INTERP_KERNEL::Exception) { DataArray::reprWithoutNameStream(stream); _mem.repr(getNumberOfComponents(),stream); } -void DataArrayInt::reprZipWithoutNameStream(std::ostream& stream) const +void DataArrayInt::reprZipWithoutNameStream(std::ostream& stream) const throw(INTERP_KERNEL::Exception) { DataArray::reprWithoutNameStream(stream); _mem.reprZip(getNumberOfComponents(),stream); } -void DataArrayInt::reprCppStream(const char *varName, std::ostream& stream) const +void DataArrayInt::reprCppStream(const char *varName, std::ostream& stream) const throw(INTERP_KERNEL::Exception) { int nbTuples=getNumberOfTuples(),nbComp=getNumberOfComponents(); const int *data=getConstPointer(); @@ -5373,6 +5579,64 @@ void DataArrayInt::reprCppStream(const char *varName, std::ostream& stream) cons stream << varName << "->setName(\"" << getName() << "\");" << std::endl; } +/*! + * Method that gives a quick overvien of \a this for python. + */ +void DataArrayInt::reprQuickOverview(std::ostream& stream) const throw(INTERP_KERNEL::Exception) +{ + static const std::size_t MAX_NB_OF_BYTE_IN_REPR=300; + stream << "DataArrayInt C++ instance at " << this << ". "; + if(isAllocated()) + { + int nbOfCompo=(int)_info_on_compo.size(); + if(nbOfCompo>=1) + { + int nbOfTuples=getNumberOfTuples(); + stream << "Number of tuples : " << nbOfTuples << ". Number of components : " << nbOfCompo << "." << std::endl; + reprQuickOverviewData(stream,MAX_NB_OF_BYTE_IN_REPR); + } + else + stream << "Number of components : 0."; + } + else + stream << "*** No data allocated ****"; +} + +void DataArrayInt::reprQuickOverviewData(std::ostream& stream, std::size_t maxNbOfByteInRepr) const throw(INTERP_KERNEL::Exception) +{ + const int *data=begin(); + int nbOfTuples=getNumberOfTuples(); + int nbOfCompo=(int)_info_on_compo.size(); + std::ostringstream oss2; oss2 << "["; + std::string oss2Str(oss2.str()); + bool isFinished=true; + for(int i=0;i1) + { + oss2 << "("; + for(int j=0;jgetNumberOfComponents() != 1. * \throw If \a arrEnd - arrBg < 2. * \throw If any value of \a this is not less than \a arrEnd[-1]. - * \warning The values contained in \a arrBg should be sorted ascendently. No - * check of this is be done. If not, the result is not warranted. - * */ void DataArrayInt::splitByValueRange(const int *arrBg, const int *arrEnd, DataArrayInt *& castArr, DataArrayInt *& rankInsideCast, DataArrayInt *& castsPresent) const throw(INTERP_KERNEL::Exception) @@ -5559,9 +5822,8 @@ DataArrayInt *DataArrayInt::transformWithIndArrR(const int *indArrBg, const int * The caller is to delete this result array using decrRef() as it is no more * needed. * - * \ref cpp_mcdataarrayint_invertarrayo2n2n2o "Here is a C++ example". - * - * \ref py_mcdataarrayint_invertarrayo2n2n2o "Here is a Python example". + * \ref cpp_mcdataarrayint_invertarrayo2n2n2o "Here is a C++ example".
+ * \ref py_mcdataarrayint_invertarrayo2n2n2o "Here is a Python example". */ DataArrayInt *DataArrayInt::invertArrayO2N2N2O(int newNbOfElem) const { @@ -5621,7 +5883,15 @@ DataArrayInt *DataArrayInt::invertArrayN2O2O2N(int oldNbOfElem) const return ret.retn(); } -bool DataArrayInt::isEqualIfNotWhy(const DataArrayInt& other, std::string& reason) const +/*! + * Equivalent to DataArrayInt::isEqual except that if false the reason of + * mismatch is given. + * + * \param [in] other the instance to be compared with \a this + * \param [out] reason In case of inequality returns the reason. + * \sa DataArrayInt::isEqual + */ +bool DataArrayInt::isEqualIfNotWhy(const DataArrayInt& other, std::string& reason) const throw(INTERP_KERNEL::Exception) { if(!areInfoEqualsIfNotWhy(other,reason)) return false; @@ -5634,7 +5904,7 @@ bool DataArrayInt::isEqualIfNotWhy(const DataArrayInt& other, std::string& reaso * \param [in] other - an instance of DataArrayInt to compare with \a this one. * \return bool - \a true if the two arrays are equal, \a false else. */ -bool DataArrayInt::isEqual(const DataArrayInt& other) const +bool DataArrayInt::isEqual(const DataArrayInt& other) const throw(INTERP_KERNEL::Exception) { std::string tmp; return isEqualIfNotWhy(other,tmp); @@ -5646,7 +5916,7 @@ bool DataArrayInt::isEqual(const DataArrayInt& other) const * \param [in] other - an instance of DataArrayInt to compare with \a this one. * \return bool - \a true if the values of two arrays are equal, \a false else. */ -bool DataArrayInt::isEqualWithoutConsideringStr(const DataArrayInt& other) const +bool DataArrayInt::isEqualWithoutConsideringStr(const DataArrayInt& other) const throw(INTERP_KERNEL::Exception) { std::string tmp; return _mem.isEqual(other._mem,0,tmp); @@ -5680,19 +5950,19 @@ void DataArrayInt::sort(bool asc) throw(INTERP_KERNEL::Exception) if(getNumberOfComponents()!=1) throw INTERP_KERNEL::Exception("DataArrayInt::sort : only supported with 'this' array with ONE component !"); _mem.sort(asc); + declareAsNew(); } /*! * Reverse the array values. - * \throw If \a this->getNumberOfComponents() != 1. + * \throw If \a this->getNumberOfComponents() < 1. * \throw If \a this is not allocated. */ void DataArrayInt::reverse() throw(INTERP_KERNEL::Exception) { checkAllocated(); - if(getNumberOfComponents()!=1) - throw INTERP_KERNEL::Exception("DataArrayInt::reverse : only supported with 'this' array with ONE component !"); - _mem.reverse(); + _mem.reverse(getNumberOfComponents()); + declareAsNew(); } /*! @@ -5867,14 +6137,14 @@ DataArrayInt *DataArrayInt::buildPermutationArr(const DataArrayInt& other) const * \param [in] nbOfTuple - new number of tuples in \a this. * \param [in] nbOfCompo - new number of components in \a this. */ -void DataArrayInt::useArray(const int *array, bool ownership, DeallocType type, int nbOfTuple, int nbOfCompo) +void DataArrayInt::useArray(const int *array, bool ownership, DeallocType type, int nbOfTuple, int nbOfCompo) throw(INTERP_KERNEL::Exception) { _info_on_compo.resize(nbOfCompo); _mem.useArray(array,ownership,type,nbOfTuple*nbOfCompo); declareAsNew(); } -void DataArrayInt::useExternalArrayWithRWAccess(const int *array, int nbOfTuple, int nbOfCompo) +void DataArrayInt::useExternalArrayWithRWAccess(const int *array, int nbOfTuple, int nbOfCompo) throw(INTERP_KERNEL::Exception) { _info_on_compo.resize(nbOfCompo); _mem.useExternalArrayWithRWAccess(array,nbOfTuple*nbOfCompo); @@ -5886,10 +6156,10 @@ void DataArrayInt::useExternalArrayWithRWAccess(const int *array, int nbOfTuple, * arranged in memory. If \a this array holds 2 components of 3 values: * \f$ x_0,x_1,x_2,y_0,y_1,y_2 \f$, then the result array holds these values arranged * as follows: \f$ x_0,y_0,x_1,y_1,x_2,y_2 \f$. + * \warning Do not confuse this method with transpose()! * \return DataArrayInt * - the new instance of DataArrayInt that the caller * is to delete using decrRef() as it is no more needed. * \throw If \a this is not allocated. - * \warning Do not confuse this method with transpose()! */ DataArrayInt *DataArrayInt::fromNoInterlace() const throw(INTERP_KERNEL::Exception) { @@ -5907,10 +6177,10 @@ DataArrayInt *DataArrayInt::fromNoInterlace() const throw(INTERP_KERNEL::Excepti * arranged in memory. If \a this array holds 2 components of 3 values: * \f$ x_0,y_0,x_1,y_1,x_2,y_2 \f$, then the result array holds these values arranged * as follows: \f$ x_0,x_1,x_2,y_0,y_1,y_2 \f$. + * \warning Do not confuse this method with transpose()! * \return DataArrayInt * - the new instance of DataArrayInt that the caller * is to delete using decrRef() as it is no more needed. * \throw If \a this is not allocated. - * \warning Do not confuse this method with transpose()! */ DataArrayInt *DataArrayInt::toNoInterlace() const throw(INTERP_KERNEL::Exception) { @@ -5932,7 +6202,7 @@ DataArrayInt *DataArrayInt::toNoInterlace() const throw(INTERP_KERNEL::Exception * \param [in] old2New - C array of length equal to \a this->getNumberOfTuples() * giving a new position for i-th old value. */ -void DataArrayInt::renumberInPlace(const int *old2New) +void DataArrayInt::renumberInPlace(const int *old2New) throw(INTERP_KERNEL::Exception) { checkAllocated(); int nbTuples=getNumberOfTuples(); @@ -5956,7 +6226,7 @@ void DataArrayInt::renumberInPlace(const int *old2New) * \return DataArrayInt * - the new instance of DataArrayInt that the caller * is to delete using decrRef() as it is no more needed. */ -void DataArrayInt::renumberInPlaceR(const int *new2Old) +void DataArrayInt::renumberInPlaceR(const int *new2Old) throw(INTERP_KERNEL::Exception) { checkAllocated(); int nbTuples=getNumberOfTuples(); @@ -5982,12 +6252,12 @@ void DataArrayInt::renumberInPlaceR(const int *new2Old) * is to delete using decrRef() as it is no more needed. * \throw If \a this is not allocated. */ -DataArrayInt *DataArrayInt::renumber(const int *old2New) const +DataArrayInt *DataArrayInt::renumber(const int *old2New) const throw(INTERP_KERNEL::Exception) { checkAllocated(); int nbTuples=getNumberOfTuples(); int nbOfCompo=getNumberOfComponents(); - DataArrayInt *ret=DataArrayInt::New(); + MEDCouplingAutoRefCountObjectPtr ret=DataArrayInt::New(); ret->alloc(nbTuples,nbOfCompo); ret->copyStringInfoFrom(*this); const int *iptr=getConstPointer(); @@ -5995,7 +6265,7 @@ DataArrayInt *DataArrayInt::renumber(const int *old2New) const for(int i=0;icopyStringInfoFrom(*this); - return ret; + return ret.retn(); } /*! @@ -6009,12 +6279,12 @@ DataArrayInt *DataArrayInt::renumber(const int *old2New) const * \return DataArrayInt * - the new instance of DataArrayInt that the caller * is to delete using decrRef() as it is no more needed. */ -DataArrayInt *DataArrayInt::renumberR(const int *new2Old) const +DataArrayInt *DataArrayInt::renumberR(const int *new2Old) const throw(INTERP_KERNEL::Exception) { checkAllocated(); int nbTuples=getNumberOfTuples(); int nbOfCompo=getNumberOfComponents(); - DataArrayInt *ret=DataArrayInt::New(); + MEDCouplingAutoRefCountObjectPtr ret=DataArrayInt::New(); ret->alloc(nbTuples,nbOfCompo); ret->copyStringInfoFrom(*this); const int *iptr=getConstPointer(); @@ -6022,7 +6292,7 @@ DataArrayInt *DataArrayInt::renumberR(const int *new2Old) const for(int i=0;icopyStringInfoFrom(*this); - return ret; + return ret.retn(); } /*! @@ -6038,12 +6308,12 @@ DataArrayInt *DataArrayInt::renumberR(const int *new2Old) const * \return DataArrayInt * - the new instance of DataArrayInt that the caller * is to delete using decrRef() as it is no more needed. */ -DataArrayInt *DataArrayInt::renumberAndReduce(const int *old2New, int newNbOfTuple) const +DataArrayInt *DataArrayInt::renumberAndReduce(const int *old2New, int newNbOfTuple) const throw(INTERP_KERNEL::Exception) { checkAllocated(); int nbTuples=getNumberOfTuples(); int nbOfCompo=getNumberOfComponents(); - DataArrayInt *ret=DataArrayInt::New(); + MEDCouplingAutoRefCountObjectPtr ret=DataArrayInt::New(); ret->alloc(newNbOfTuple,nbOfCompo); const int *iptr=getConstPointer(); int *optr=ret->getPointer(); @@ -6054,7 +6324,7 @@ DataArrayInt *DataArrayInt::renumberAndReduce(const int *old2New, int newNbOfTup std::copy(iptr+i*nbOfCompo,iptr+(i+1)*nbOfCompo,optr+w*nbOfCompo); } ret->copyStringInfoFrom(*this); - return ret; + return ret.retn(); } /*! @@ -6141,7 +6411,6 @@ DataArrayInt *DataArrayInt::selectByTupleIdSafe(const int *new2OldBg, const int * \param [in] step - index increment to get index of the next tuple to copy. * \return DataArrayInt * - the new instance of DataArrayInt that the caller * is to delete using decrRef() as it is no more needed. - * \throw If (\a end2 < \a bg) or (\a step <= 0). * \sa DataArrayInt::substr. */ DataArrayInt *DataArrayInt::selectByTupleId2(int bg, int end2, int step) const throw(INTERP_KERNEL::Exception) @@ -6149,7 +6418,7 @@ DataArrayInt *DataArrayInt::selectByTupleId2(int bg, int end2, int step) const t checkAllocated(); MEDCouplingAutoRefCountObjectPtr ret=DataArrayInt::New(); int nbComp=getNumberOfComponents(); - int newNbOfTuples=GetNumberOfItemGivenBES(bg,end2,step,"DataArrayInt::selectByTupleId2 : "); + int newNbOfTuples=GetNumberOfItemGivenBESRelative(bg,end2,step,"DataArrayInt::selectByTupleId2 : "); ret->alloc(newNbOfTuples,nbComp); int *pt=ret->getPointer(); const int *srcPt=getConstPointer()+bg*nbComp; @@ -6492,7 +6761,7 @@ DataArrayDouble *DataArrayInt::convertToDblArr() const checkAllocated(); DataArrayDouble *ret=DataArrayDouble::New(); ret->alloc(getNumberOfTuples(),getNumberOfComponents()); - int nbOfVals=getNbOfElems(); + std::size_t nbOfVals=getNbOfElems(); const int *src=getConstPointer(); double *dest=ret->getPointer(); std::copy(src,src+nbOfVals,dest); @@ -6532,27 +6801,34 @@ DataArrayInt *DataArrayInt::substr(int tupleIdBg, int tupleIdEnd) const throw(IN else trueEnd=nbt; int nbComp=getNumberOfComponents(); - DataArrayInt *ret=DataArrayInt::New(); + MEDCouplingAutoRefCountObjectPtr ret=DataArrayInt::New(); ret->alloc(trueEnd-tupleIdBg,nbComp); ret->copyStringInfoFrom(*this); std::copy(getConstPointer()+tupleIdBg*nbComp,getConstPointer()+trueEnd*nbComp,ret->getPointer()); - return ret; + return ret.retn(); } /*! * Changes the number of components within \a this array so that its raw data **does * not** change, instead splitting this data into tuples changes. + * \warning This method erases all (name and unit) component info set before! * \param [in] newNbOfComp - number of components for \a this array to have. * \throw If \a this is not allocated * \throw If getNbOfElems() % \a newNbOfCompo != 0. + * \throw If \a newNbOfCompo is lower than 1. + * \throw If the rearrange method would lead to a number of tuples higher than 2147483647 (maximal capacity of int32 !). * \warning This method erases all (name and unit) component info set before! */ void DataArrayInt::rearrange(int newNbOfCompo) throw(INTERP_KERNEL::Exception) { checkAllocated(); - int nbOfElems=getNbOfElems(); + if(newNbOfCompo<1) + throw INTERP_KERNEL::Exception("DataArrayInt::rearrange : input newNbOfCompo must be > 0 !"); + std::size_t nbOfElems=getNbOfElems(); if(nbOfElems%newNbOfCompo!=0) throw INTERP_KERNEL::Exception("DataArrayInt::rearrange : nbOfElems%newNbOfCompo!=0 !"); + if(nbOfElems/newNbOfCompo>(std::size_t)std::numeric_limits::max()) + throw INTERP_KERNEL::Exception("DataArrayInt::rearrange : the rearrangement leads to too high number of tuples (> 2147483647) !"); _info_on_compo.clear(); _info_on_compo.resize(newNbOfCompo); declareAsNew(); @@ -6563,9 +6839,9 @@ void DataArrayInt::rearrange(int newNbOfCompo) throw(INTERP_KERNEL::Exception) * of tuples, and inversely its number of tuples to become equal to its number of * components. So that its raw data **does not** change, instead splitting this * data into tuples changes. - * \throw If \a this is not allocated. * \warning This method erases all (name and unit) component info set before! * \warning Do not confuse this method with fromNoInterlace() and toNoInterlace()! + * \throw If \a this is not allocated. * \sa rearrange() */ void DataArrayInt::transpose() throw(INTERP_KERNEL::Exception) @@ -6591,7 +6867,7 @@ void DataArrayInt::transpose() throw(INTERP_KERNEL::Exception) DataArrayInt *DataArrayInt::changeNbOfComponents(int newNbOfComp, int dftValue) const throw(INTERP_KERNEL::Exception) { checkAllocated(); - DataArrayInt *ret=DataArrayInt::New(); + MEDCouplingAutoRefCountObjectPtr ret=DataArrayInt::New(); ret->alloc(getNumberOfTuples(),newNbOfComp); const int *oldc=getConstPointer(); int *nc=ret->getPointer(); @@ -6610,7 +6886,7 @@ DataArrayInt *DataArrayInt::changeNbOfComponents(int newNbOfComp, int dftValue) for(int i=0;isetInfoOnComponent(i,getInfoOnComponent(i).c_str()); ret->setName(getName().c_str()); - return ret; + return ret.retn(); } /*! @@ -6622,7 +6898,7 @@ DataArrayInt *DataArrayInt::changeNbOfComponents(int newNbOfComp, int dftValue) void DataArrayInt::reAlloc(int nbOfTuples) throw(INTERP_KERNEL::Exception) { checkAllocated(); - _mem.reAlloc(getNumberOfComponents()*nbOfTuples); + _mem.reAlloc(getNumberOfComponents()*(std::size_t)nbOfTuples); declareAsNew(); } @@ -6779,7 +7055,7 @@ void DataArrayInt::setPartOfValues1(const DataArrayInt *a, int bgTuples, int end DataArray::CheckValueInRangeEx(nbOfTuples,bgTuples,endTuples,"invalid tuple value"); DataArray::CheckValueInRangeEx(nbComp,bgComp,endComp,"invalid component value"); bool assignTech=true; - if(a->getNbOfElems()==newNbOfTuples*newNbOfComp) + if(a->getNbOfElems()==(std::size_t)newNbOfTuples*newNbOfComp) { if(strictCompoCompare) a->checkNbOfTuplesAndComp(newNbOfTuples,newNbOfComp,msg); @@ -6897,7 +7173,7 @@ void DataArrayInt::setPartOfValues2(const DataArrayInt *a, const int *bgTuples, int newNbOfTuples=(int)std::distance(bgTuples,endTuples); int newNbOfComp=(int)std::distance(bgComp,endComp); bool assignTech=true; - if(a->getNbOfElems()==newNbOfTuples*newNbOfComp) + if(a->getNbOfElems()==(std::size_t)newNbOfTuples*newNbOfComp) { if(strictCompoCompare) a->checkNbOfTuplesAndComp(newNbOfTuples,newNbOfComp,msg); @@ -6916,7 +7192,7 @@ void DataArrayInt::setPartOfValues2(const DataArrayInt *a, const int *bgTuples, DataArray::CheckValueInRange(nbOfTuples,*w,"invalid tuple id"); for(const int *z=bgComp;z!=endComp;z++,srcPt++) { - pt[(*w)*nbComp+(*z)]=*srcPt; + pt[(std::size_t)(*w)*nbComp+(*z)]=*srcPt; } } } @@ -6928,7 +7204,7 @@ void DataArrayInt::setPartOfValues2(const DataArrayInt *a, const int *bgTuples, DataArray::CheckValueInRange(nbOfTuples,*w,"invalid tuple id"); for(const int *z=bgComp;z!=endComp;z++,srcPt2++) { - pt[(*w)*nbComp+(*z)]=*srcPt2; + pt[(std::size_t)(*w)*nbComp+(*z)]=*srcPt2; } } } @@ -6966,7 +7242,7 @@ void DataArrayInt::setPartOfValuesSimple2(int a, const int *bgTuples, const int for(const int *z=bgComp;z!=endComp;z++) { DataArray::CheckValueInRange(nbOfTuples,*w,"invalid tuple id"); - pt[(*w)*nbComp+(*z)]=a; + pt[(std::size_t)(*w)*nbComp+(*z)]=a; } } @@ -7027,7 +7303,7 @@ void DataArrayInt::setPartOfValues3(const DataArrayInt *a, const int *bgTuples, DataArray::CheckValueInRangeEx(nbComp,bgComp,endComp,"invalid component value"); int newNbOfTuples=(int)std::distance(bgTuples,endTuples); bool assignTech=true; - if(a->getNbOfElems()==newNbOfTuples*newNbOfComp) + if(a->getNbOfElems()==(std::size_t)newNbOfTuples*newNbOfComp) { if(strictCompoCompare) a->checkNbOfTuplesAndComp(newNbOfTuples,newNbOfComp,msg); @@ -7045,7 +7321,7 @@ void DataArrayInt::setPartOfValues3(const DataArrayInt *a, const int *bgTuples, for(int j=0;jgetNbOfElems()==newNbOfTuples*newNbOfComp) + if(a->getNbOfElems()==(std::size_t)newNbOfTuples*newNbOfComp) { if(strictCompoCompare) a->checkNbOfTuplesAndComp(newNbOfTuples,newNbOfComp,msg); @@ -7350,7 +7626,7 @@ int DataArrayInt::getIJSafe(int tupleId, int compoId) const throw(INTERP_KERNEL: std::ostringstream oss; oss << "DataArrayInt::getIJSafe : request for compoId " << compoId << " should be in [0," << getNumberOfComponents() << ") !"; throw INTERP_KERNEL::Exception(oss.str().c_str()); } - return _mem[tupleId*((int)_info_on_compo.size())+compoId]; + return _mem[tupleId*_info_on_compo.size()+compoId]; } /*! @@ -7389,7 +7665,7 @@ void DataArrayInt::SetArrayIn(DataArrayInt *newArray, DataArrayInt* &arrayToSet) } } -DataArrayIntIterator *DataArrayInt::iterator() +DataArrayIntIterator *DataArrayInt::iterator() throw(INTERP_KERNEL::Exception) { return new DataArrayIntIterator(this); } @@ -7543,7 +7819,7 @@ int DataArrayInt::locateTuple(const std::vector& tupl) const throw(INTERP_K throw INTERP_KERNEL::Exception(oss.str().c_str()); } const int *cptr=getConstPointer(); - int nbOfVals=getNbOfElems(); + std::size_t nbOfVals=getNbOfElems(); for(const int *work=cptr;work!=cptr+nbOfVals;) { work=std::search(work,cptr+nbOfVals,tupl.begin(),tupl.end()); @@ -7571,7 +7847,7 @@ int DataArrayInt::search(const std::vector& vals) const throw(INTERP_KERNEL if(nbOfCompo!=1) throw INTERP_KERNEL::Exception("DataArrayInt::search : works only for DataArrayInt instance with one component !"); const int *cptr=getConstPointer(); - int nbOfVals=getNbOfElems(); + std::size_t nbOfVals=getNbOfElems(); const int *loc=std::search(cptr,cptr+nbOfVals,vals.begin(),vals.end()); if(loc!=cptr+nbOfVals) return std::distance(cptr,loc); @@ -7751,13 +8027,13 @@ DataArrayInt *DataArrayInt::Aggregate(const std::vector& a throw INTERP_KERNEL::Exception("DataArrayInt::Aggregate : Nb of components mismatch for array aggregation !"); nbt+=(*it)->getNumberOfTuples(); } - DataArrayInt *ret=DataArrayInt::New(); + MEDCouplingAutoRefCountObjectPtr ret=DataArrayInt::New(); ret->alloc(nbt,nbOfComp); int *pt=ret->getPointer(); for(it=a.begin();it!=a.end();it++) pt=std::copy((*it)->getConstPointer(),(*it)->getConstPointer()+(*it)->getNbOfElems(),pt); ret->copyStringInfoFrom(*(a[0])); - return ret; + return ret.retn(); } /*! @@ -7836,7 +8112,7 @@ void DataArrayInt::abs() throw(INTERP_KERNEL::Exception) { checkAllocated(); int *ptr=getPointer(); - int nbOfElems=getNbOfElems(); + std::size_t nbOfElems=getNbOfElems(); std::transform(ptr,ptr+nbOfElems,ptr,std::ptr_fun(std::abs)); declareAsNew(); } @@ -7871,8 +8147,8 @@ void DataArrayInt::applyLin(int a, int b) throw(INTERP_KERNEL::Exception) { checkAllocated(); int *ptr=getPointer(); - int nbOfElems=getNbOfElems(); - for(int i=0;i(),val)); declareAsNew(); } @@ -7960,7 +8236,7 @@ void DataArrayInt::applyModulus(int val) throw(INTERP_KERNEL::Exception) throw INTERP_KERNEL::Exception("DataArrayInt::applyDivideBy : Trying to operate modulus on value <= 0 !"); checkAllocated(); int *ptr=getPointer(); - int nbOfElems=getNbOfElems(); + std::size_t nbOfElems=getNbOfElems(); std::transform(ptr,ptr+nbOfElems,ptr,std::bind2nd(std::modulus(),val)); declareAsNew(); } @@ -7980,33 +8256,30 @@ DataArrayInt *DataArrayInt::getIdsInRange(int vmin, int vmax) const throw(INTERP if(getNumberOfComponents()!=1) throw INTERP_KERNEL::Exception("DataArrayInt::getIdsInRange : this must have exactly one component !"); const int *cptr=getConstPointer(); - std::vector res; + MEDCouplingAutoRefCountObjectPtr ret=DataArrayInt::New(); ret->alloc(0,1); int nbOfTuples=getNumberOfTuples(); for(int i=0;i=vmin && *cptralloc((int)res.size(),1); - std::copy(res.begin(),res.end(),ret->getPointer()); - return ret; + ret->pushBackSilent(i); + return ret.retn(); } /*! * Modify all elements of \a this array, so that * an element _x_ becomes val % x . - * \param [in] val - the divident used to modify array elements. - * \throw If \a this is not allocated. - * \throw If there is an element equal to or less than 0 in \a this array. * \warning If an exception is thrown because of presence of an element <= 0 in \a this * array, all elements processed before detection of the zero element remain * modified. + * \param [in] val - the divident used to modify array elements. + * \throw If \a this is not allocated. + * \throw If there is an element equal to or less than 0 in \a this array. */ void DataArrayInt::applyRModulus(int val) throw(INTERP_KERNEL::Exception) { checkAllocated(); int *ptr=getPointer(); - int nbOfElems=getNbOfElems(); - for(int i=0;i0) { @@ -8022,6 +8295,69 @@ void DataArrayInt::applyRModulus(int val) throw(INTERP_KERNEL::Exception) declareAsNew(); } +/*! + * Modify all elements of \a this array, so that + * an element _x_ becomes val ^ x . + * \param [in] val - the value used to apply pow on all array elements. + * \throw If \a this is not allocated. + * \throw If \a val < 0. + */ +void DataArrayInt::applyPow(int val) throw(INTERP_KERNEL::Exception) +{ + checkAllocated(); + if(val<0) + throw INTERP_KERNEL::Exception("DataArrayInt::applyPow : input pow in < 0 !"); + int *ptr=getPointer(); + std::size_t nbOfElems=getNbOfElems(); + if(val==0) + { + std::fill(ptr,ptr+nbOfElems,1.); + return ; + } + for(std::size_t i=0;i=0) + { + int tmp=1; + for(int j=0;j<*ptr;j++) + tmp*=val; + *ptr=tmp; + } + else + { + std::ostringstream oss; oss << "DataArrayInt::applyRPow : presence of negative value in tuple #" << i/getNumberOfComponents() << " component #" << i%getNumberOfComponents(); + oss << " !"; + throw INTERP_KERNEL::Exception(oss.str().c_str()); + } + } + declareAsNew(); +} + /*! * Returns a new DataArrayInt by aggregating two given arrays, so that (1) the number * of components in the result array is a sum of the number of components of given arrays @@ -8139,12 +8475,12 @@ DataArrayInt *DataArrayInt::MakePartition(const std::vector::const_iterator iter=groups2.begin();iter!=groups2.end();iter++) { const int *ptr=(*iter)->getConstPointer(); - int nbOfElem=(*iter)->getNbOfElems(); + std::size_t nbOfElem=(*iter)->getNbOfElems(); int sfid=fid; for(int j=0;j=0 && ptr[i] tmp; const int *ptr=(*iter)->getConstPointer(); - int nbOfElem=(*iter)->getNbOfElems(); + std::size_t nbOfElem=(*iter)->getNbOfElems(); for(const int *p=ptr;p!=ptr+nbOfElem;p++) tmp.insert(retPtr[*p]); fidsOfGroups[grId].insert(fidsOfGroups[grId].end(),tmp.begin(),tmp.end()); @@ -8539,6 +8875,60 @@ void DataArrayInt::computeOffsets2() throw(INTERP_KERNEL::Exception) declareAsNew(); } +/*! + * Returns two new DataArrayInt instances whose contents is computed from that of \a this and \a listOfIds arrays as follows. + * \a this is expected to be an offset format ( as returned by DataArrayInt::computeOffsets2 ) that is to say with one component + * and ** sorted strictly increasingly **. \a listOfIds is expected to be sorted ascendingly (not strictly needed for \a listOfIds). + * This methods searches in \a this, considered as a set of contiguous \c this->getNumberOfComponents() ranges, all ids in \a listOfIds + * filling completely one of the ranges in \a this. + * + * \param [in] listOfIds a list of ids that has to be sorted ascendingly. + * \param [out] rangeIdsFetched the range ids fetched + * \param [out] idsInInputListThatFetch contains the list of ids in \a listOfIds that are \b fully included in a range in \a this. So + * \a idsInInputListThatFetch is a part of input \a listOfIds. + * + * \sa DataArrayInt::computeOffsets2 + * + * \b Example:
+ * - \a this : [0,3,7,9,15,18] + * - \a listOfIds contains [0,1,2,3,7,8,15,16,17] + * - \a rangeIdsFetched result array: [0,2,4] + * - \a idsInInputListThatFetch result array: [0,1,2,7,8,15,16,17] + * In this example id 3 in input \a listOfIds is alone so it do not appear in output \a idsInInputListThatFetch. + *
+ */ +void DataArrayInt::searchRangesInListOfIds(const DataArrayInt *listOfIds, DataArrayInt *& rangeIdsFetched, DataArrayInt *& idsInInputListThatFetch) const throw(INTERP_KERNEL::Exception) +{ + if(!listOfIds) + throw INTERP_KERNEL::Exception("DataArrayInt::searchRangesInListOfIds : input list of ids is null !"); + listOfIds->checkAllocated(); checkAllocated(); + if(listOfIds->getNumberOfComponents()!=1) + throw INTERP_KERNEL::Exception("DataArrayInt::searchRangesInListOfIds : input list of ids must have exactly one component !"); + if(getNumberOfComponents()!=1) + throw INTERP_KERNEL::Exception("DataArrayInt::searchRangesInListOfIds : this must have exactly one component !"); + MEDCouplingAutoRefCountObjectPtr ret0=DataArrayInt::New(); ret0->alloc(0,1); + MEDCouplingAutoRefCountObjectPtr ret1=DataArrayInt::New(); ret1->alloc(0,1); + const int *tupEnd(listOfIds->end()),*offBg(begin()),*offEnd(end()-1); + const int *tupPtr(listOfIds->begin()),*offPtr(offBg); + while(tupPtr!=tupEnd && offPtr!=offEnd) + { + if(*tupPtr==*offPtr) + { + int i=offPtr[0]; + while(ipushBackSilent((int)std::distance(offBg,offPtr)); + ret1->pushBackValsSilent(tupPtr-(offPtr[1]-offPtr[0]),tupPtr); + offPtr++; + } + } + else + { if(*tupPtr<*offPtr) tupPtr++; else offPtr++; } + } + rangeIdsFetched=ret0.retn(); + idsInInputListThatFetch=ret1.retn(); +} /*! * Returns a new DataArrayInt whose contents is computed from that of \a this and \a @@ -9252,6 +9642,7 @@ void DataArrayInt::multiplyEqual(const DataArrayInt *other) throw(INTERP_KERNEL: * * Info on components is copied either from the first array (in the first case) or from * the array with maximal number of elements (getNbOfElems()). + * \warning No check of division by zero is performed! * \param [in] a1 - a numerator array. * \param [in] a2 - a denominator array. * \return DataArrayInt * - the new instance of DataArrayInt. @@ -9261,7 +9652,6 @@ void DataArrayInt::multiplyEqual(const DataArrayInt *other) throw(INTERP_KERNEL: * \throw If \a a1->getNumberOfTuples() != \a a2->getNumberOfTuples() and * \a a1->getNumberOfComponents() != \a a2->getNumberOfComponents() and * none of them has number of tuples or components equal to 1. - * \warning No check of division by zero is performed! */ DataArrayInt *DataArrayInt::Divide(const DataArrayInt *a1, const DataArrayInt *a2) throw(INTERP_KERNEL::Exception) { @@ -9329,12 +9719,12 @@ DataArrayInt *DataArrayInt::Divide(const DataArrayInt *a1, const DataArrayInt *a * 3. The arrays have same number of components and \a other array has one tuple. Then * _a_ [ i, j ] /= _a2_ [ 0, j ]. * + * \warning No check of division by zero is performed! * \param [in] other - an array to divide \a this one by. * \throw If \a other is NULL. * \throw If \a this->getNumberOfTuples() != \a other->getNumberOfTuples() and * \a this->getNumberOfComponents() != \a other->getNumberOfComponents() and * \a other has number of both tuples and components not equal to 1. - * \warning No check of division by zero is performed! */ void DataArrayInt::divideEqual(const DataArrayInt *other) throw(INTERP_KERNEL::Exception) { @@ -9395,6 +9785,7 @@ void DataArrayInt::divideEqual(const DataArrayInt *other) throw(INTERP_KERNEL::E * * Info on components is copied either from the first array (in the first case) or from * the array with maximal number of elements (getNbOfElems()). + * \warning No check of division by zero is performed! * \param [in] a1 - a dividend array. * \param [in] a2 - a divisor array. * \return DataArrayInt * - the new instance of DataArrayInt. @@ -9404,7 +9795,6 @@ void DataArrayInt::divideEqual(const DataArrayInt *other) throw(INTERP_KERNEL::E * \throw If \a a1->getNumberOfTuples() != \a a2->getNumberOfTuples() and * \a a1->getNumberOfComponents() != \a a2->getNumberOfComponents() and * none of them has number of tuples or components equal to 1. - * \warning No check of division by zero is performed! */ DataArrayInt *DataArrayInt::Modulus(const DataArrayInt *a1, const DataArrayInt *a2) throw(INTERP_KERNEL::Exception) { @@ -9472,12 +9862,12 @@ DataArrayInt *DataArrayInt::Modulus(const DataArrayInt *a1, const DataArrayInt * * 3. The arrays have same number of components and \a other array has one tuple. Then * _a_ [ i, j ] %= _a2_ [ 0, j ]. * + * \warning No check of division by zero is performed! * \param [in] other - a divisor array. * \throw If \a other is NULL. * \throw If \a this->getNumberOfTuples() != \a other->getNumberOfTuples() and * \a this->getNumberOfComponents() != \a other->getNumberOfComponents() and * \a other has number of both tuples and components not equal to 1. - * \warning No check of division by zero is performed! */ void DataArrayInt::modulusEqual(const DataArrayInt *other) throw(INTERP_KERNEL::Exception) { @@ -9522,6 +9912,94 @@ void DataArrayInt::modulusEqual(const DataArrayInt *other) throw(INTERP_KERNEL:: declareAsNew(); } +/*! + * Returns a new DataArrayInt that is the result of pow of two given arrays. There are 3 + * valid cases. + * + * \param [in] a1 - an array to pow up. + * \param [in] a2 - another array to sum up. + * \return DataArrayInt * - the new instance of DataArrayInt. + * The caller is to delete this result array using decrRef() as it is no more + * needed. + * \throw If either \a a1 or \a a2 is NULL. + * \throw If \a a1->getNumberOfTuples() != \a a2->getNumberOfTuples() + * \throw If \a a1->getNumberOfComponents() != 1 or \a a2->getNumberOfComponents() != 1. + * \throw If there is a negative value in \a a2. + */ +DataArrayInt *DataArrayInt::Pow(const DataArrayInt *a1, const DataArrayInt *a2) throw(INTERP_KERNEL::Exception) +{ + if(!a1 || !a2) + throw INTERP_KERNEL::Exception("DataArrayInt::Pow : at least one of input instances is null !"); + int nbOfTuple=a1->getNumberOfTuples(); + int nbOfTuple2=a2->getNumberOfTuples(); + int nbOfComp=a1->getNumberOfComponents(); + int nbOfComp2=a2->getNumberOfComponents(); + if(nbOfTuple!=nbOfTuple2) + throw INTERP_KERNEL::Exception("DataArrayInt::Pow : number of tuples mismatches !"); + if(nbOfComp!=1 || nbOfComp2!=1) + throw INTERP_KERNEL::Exception("DataArrayInt::Pow : number of components of both arrays must be equal to 1 !"); + MEDCouplingAutoRefCountObjectPtr ret=DataArrayInt::New(); ret->alloc(nbOfTuple,1); + const int *ptr1(a1->begin()),*ptr2(a2->begin()); + int *ptr=ret->getPointer(); + for(int i=0;i=0) + { + int tmp=1; + for(int j=0;j<*ptr2;j++) + tmp*=*ptr1; + *ptr=tmp; + } + else + { + std::ostringstream oss; oss << "DataArrayInt::Pow : on tuple #" << i << " of a2 value is < 0 (" << *ptr2 << ") !"; + throw INTERP_KERNEL::Exception(oss.str().c_str()); + } + } + return ret.retn(); +} + +/*! + * Apply pow on values of another DataArrayInt to values of \a this one. + * + * \param [in] other - an array to pow to \a this one. + * \throw If \a other is NULL. + * \throw If \a this->getNumberOfTuples() != \a other->getNumberOfTuples() + * \throw If \a this->getNumberOfComponents() != 1 or \a other->getNumberOfComponents() != 1 + * \throw If there is a negative value in \a other. + */ +void DataArrayInt::powEqual(const DataArrayInt *other) throw(INTERP_KERNEL::Exception) +{ + if(!other) + throw INTERP_KERNEL::Exception("DataArrayInt::powEqual : input instance is null !"); + int nbOfTuple=getNumberOfTuples(); + int nbOfTuple2=other->getNumberOfTuples(); + int nbOfComp=getNumberOfComponents(); + int nbOfComp2=other->getNumberOfComponents(); + if(nbOfTuple!=nbOfTuple2) + throw INTERP_KERNEL::Exception("DataArrayInt::powEqual : number of tuples mismatches !"); + if(nbOfComp!=1 || nbOfComp2!=1) + throw INTERP_KERNEL::Exception("DataArrayInt::powEqual : number of components of both arrays must be equal to 1 !"); + int *ptr=getPointer(); + const int *ptrc=other->begin(); + for(int i=0;i=0) + { + int tmp=1; + for(int j=0;j<*ptrc;j++) + tmp*=*ptr; + *ptr=tmp; + } + else + { + std::ostringstream oss; oss << "DataArrayInt::powEqual : on tuple #" << i << " of other value is < 0 (" << *ptrc << ") !"; + throw INTERP_KERNEL::Exception(oss.str().c_str()); + } + } + declareAsNew(); +} + /*! * Returns a C array which is a renumbering map in "Old to New" mode for the input array. * This map, if applied to \a start array, would make it sorted. For example, if @@ -9679,7 +10157,7 @@ DataArrayIntIterator::~DataArrayIntIterator() _da->decrRef(); } -DataArrayIntTuple *DataArrayIntIterator::nextt() +DataArrayIntTuple *DataArrayIntIterator::nextt() throw(INTERP_KERNEL::Exception) { if(_tuple_id<_nb_tuple) { @@ -9696,7 +10174,7 @@ DataArrayIntTuple::DataArrayIntTuple(int *pt, int nbOfComp):_pt(pt),_nb_of_compo { } -std::string DataArrayIntTuple::repr() const +std::string DataArrayIntTuple::repr() const throw(INTERP_KERNEL::Exception) { std::ostringstream oss; oss << "("; for(int i=0;i<_nb_of_compo-1;i++)