X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMEDCoupling%2FMEDCouplingMemArrayChar.cxx;h=590423fdb2bd6b22bac590cdc9ce7bf5df8a447e;hb=69fd460430f4507abe451a07ff684688c3ae15e8;hp=e3da0c9591ea60e8820a2678e5ac7070fc99f235;hpb=56fddf07c0b7170f79791d38e2b909a8a5b0b872;p=tools%2Fmedcoupling.git diff --git a/src/MEDCoupling/MEDCouplingMemArrayChar.cxx b/src/MEDCoupling/MEDCouplingMemArrayChar.cxx index e3da0c959..590423fdb 100644 --- a/src/MEDCoupling/MEDCouplingMemArrayChar.cxx +++ b/src/MEDCoupling/MEDCouplingMemArrayChar.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2015 CEA/DEN, EDF R&D +// Copyright (C) 2007-2016 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 @@ -19,7 +19,7 @@ // Author : Anthony Geay (CEA/DEN) #include "MEDCouplingMemArray.txx" -#include "MEDCouplingAutoRefCountObjectPtr.hxx" +#include "MCAuto.hxx" #include #include @@ -28,43 +28,10 @@ #include #include -using namespace ParaMEDMEM; +using namespace MEDCoupling; -/*! - * Checks if raw data is allocated. Read more on the raw data - * in \ref MEDCouplingArrayBasicsTuplesAndCompo "DataArrays infos" for more information. - * \return bool - \a true if the raw data is allocated, \a false else. - */ -bool DataArrayChar::isAllocated() const -{ - return getConstPointer()!=0; -} - -/*! - * Checks if raw data is allocated and throws an exception if it is not the case. - * \throw If the raw data is not allocated. - */ -void DataArrayChar::checkAllocated() const -{ - if(!isAllocated()) - throw INTERP_KERNEL::Exception("DataArrayChar::checkAllocated : Array is defined but not allocated ! Call alloc or setValues method first !"); -} - -/*! - * This method desallocated \a this without modification of informations relative to the components. - * After call of this method, DataArrayChar::isAllocated will return false. - * If \a this is already not allocated, \a this is let unchanged. - */ -void DataArrayChar::desallocate() -{ - _mem.destroy(); -} - -std::size_t DataArrayChar::getHeapMemorySizeWithoutChildren() const -{ - std::size_t sz(_mem.getNbOfElemAllocated()); - return DataArray::getHeapMemorySizeWithoutChildren()+sz; -} +template class MEDCoupling::MemArray; +template class MEDCoupling::DataArrayTemplate; /*! * Returns an integer value characterizing \a this array, which is useful for a quick @@ -87,165 +54,6 @@ int DataArrayChar::getHashCode() const return ret+ret0; } -/*! - * Checks the number of tuples. - * \return bool - \a true if getNumberOfTuples() == 0, \a false else. - * \throw If \a this is not allocated. - */ -bool DataArrayChar::empty() const -{ - checkAllocated(); - return getNumberOfTuples()==0; -} - -/*! - * Copies all the data from another DataArrayChar. For more info see - * \ref MEDCouplingArrayBasicsCopyDeepAssign. - * \param [in] other - another instance of DataArrayChar to copy data from. - * \throw If the \a other is not allocated. - */ -void DataArrayChar::cpyFrom(const DataArrayChar& other) -{ - other.checkAllocated(); - int nbOfTuples=other.getNumberOfTuples(); - int nbOfComp=other.getNumberOfComponents(); - allocIfNecessary(nbOfTuples,nbOfComp); - std::size_t nbOfElems=(std::size_t)nbOfTuples*nbOfComp; - char *pt=getPointer(); - const char *ptI=other.getConstPointer(); - for(std::size_t i=0;igetNumberOfComponents() < 1. - * \throw If \a this is not allocated. - */ -void DataArrayChar::reverse() -{ - checkAllocated(); - _mem.reverse(getNumberOfComponents()); - declareAsNew(); -} - /*! * Assign zero to all values in \a this array. To know more on filling arrays see * \ref MEDCouplingArrayFill. @@ -304,22 +100,7 @@ void DataArrayChar::reverse() */ void DataArrayChar::fillWithZero() { - checkAllocated(); - _mem.fillWithValue(0); - declareAsNew(); -} - -/*! - * Assign \a val to all values in \a this array. To know more on filling arrays see - * \ref MEDCouplingArrayFill. - * \param [in] val - the value to fill with. - * \throw If \a this is not allocated. - */ -void DataArrayChar::fillWithValue(char val) -{ - checkAllocated(); - _mem.fillWithValue(val); - declareAsNew(); + fillWithValue(0); } /*! @@ -341,22 +122,6 @@ std::string DataArrayChar::reprZip() const return ret.str(); } -/*! - * Changes number of tuples in the array. If the new number of tuples is smaller - * than the current number the array is truncated, otherwise the array is extended. - * \param [in] nbOfTuples - new number of tuples. - * \throw If \a this is not allocated. - * \throw If \a nbOfTuples is negative. - */ -void DataArrayChar::reAlloc(int nbOfTuples) -{ - if(nbOfTuples<0) - throw INTERP_KERNEL::Exception("DataArrayChar::reAlloc : input new number of tuples should be >=0 !"); - checkAllocated(); - _mem.reAlloc(getNumberOfComponents()*(std::size_t)nbOfTuples); - declareAsNew(); -} - /*! * Creates a new DataArrayInt and assigns all (textual and numerical) data of \a this * array to the new one. @@ -375,229 +140,6 @@ DataArrayInt *DataArrayChar::convertToIntArr() const return ret; } -/*! - * Permutes values of \a this array as required by \a old2New array. The values are - * permuted so that \c new[ \a old2New[ i ]] = \c old[ i ]. Number of tuples remains - * the same as in \this one. - * If a permutation reduction is needed, substr() or selectByTupleId() should be used. - * For more info on renumbering see \ref MEDCouplingArrayRenumbering. - * \param [in] old2New - C array of length equal to \a this->getNumberOfTuples() - * giving a new position for i-th old value. - */ -void DataArrayChar::renumberInPlace(const int *old2New) -{ - checkAllocated(); - int nbTuples=getNumberOfTuples(); - int nbOfCompo=getNumberOfComponents(); - char *tmp=new char[nbTuples*nbOfCompo]; - const char *iptr=getConstPointer(); - for(int i=0;igetNumberOfTuples() - * giving a previous position of i-th new value. - */ -void DataArrayChar::renumberInPlaceR(const int *new2Old) -{ - checkAllocated(); - int nbTuples=getNumberOfTuples(); - int nbOfCompo=getNumberOfComponents(); - char *tmp=new char[nbTuples*nbOfCompo]; - const char *iptr=getConstPointer(); - for(int i=0;igetNumberOfTuples() - * giving a new position for i-th old value. - * \return DataArrayChar * - the new instance of DataArrayChar that the caller - * is to delete using decrRef() as it is no more needed. - * \throw If \a this is not allocated. - */ -DataArrayChar *DataArrayChar::renumber(const int *old2New) const -{ - checkAllocated(); - int nbTuples=getNumberOfTuples(); - int nbOfCompo=getNumberOfComponents(); - MEDCouplingAutoRefCountObjectPtr ret=buildEmptySpecializedDAChar(); - ret->alloc(nbTuples,nbOfCompo); - ret->copyStringInfoFrom(*this); - const char *iptr=getConstPointer(); - char *optr=ret->getPointer(); - for(int i=0;icopyStringInfoFrom(*this); - return ret.retn(); -} - -/*! - * Returns a copy of \a this array with values permuted as required by \a new2Old array. - * The values are permuted so that \c new[ i ] = \c old[ \a new2Old[ i ]]. Number of - * tuples in the result array remains the same as in \this one. - * If a permutation reduction is needed, substr() or selectByTupleId() should be used. - * For more info on renumbering see \ref MEDCouplingArrayRenumbering. - * \param [in] new2Old - C array of length equal to \a this->getNumberOfTuples() - * giving a previous position of i-th new value. - * \return DataArrayChar * - the new instance of DataArrayChar that the caller - * is to delete using decrRef() as it is no more needed. - */ -DataArrayChar *DataArrayChar::renumberR(const int *new2Old) const -{ - checkAllocated(); - int nbTuples=getNumberOfTuples(); - int nbOfCompo=getNumberOfComponents(); - MEDCouplingAutoRefCountObjectPtr ret=buildEmptySpecializedDAChar(); - ret->alloc(nbTuples,nbOfCompo); - ret->copyStringInfoFrom(*this); - const char *iptr=getConstPointer(); - char *optr=ret->getPointer(); - for(int i=0;icopyStringInfoFrom(*this); - return ret.retn(); -} - -/*! - * Returns a shorten and permuted copy of \a this array. The new DataArrayChar is - * of size \a newNbOfTuple and it's values are permuted as required by \a old2New array. - * The values are permuted so that \c new[ \a old2New[ i ]] = \c old[ i ] for all - * \a old2New[ i ] >= 0. In other words every i-th tuple in \a this array, for which - * \a old2New[ i ] is negative, is missing from the result array. - * For more info on renumbering see \ref MEDCouplingArrayRenumbering. - * \param [in] old2New - C array of length equal to \a this->getNumberOfTuples() - * giving a new position for i-th old tuple and giving negative position for - * for i-th old tuple that should be omitted. - * \return DataArrayChar * - the new instance of DataArrayChar that the caller - * is to delete using decrRef() as it is no more needed. - */ -DataArrayChar *DataArrayChar::renumberAndReduce(const int *old2New, int newNbOfTuple) const -{ - checkAllocated(); - int nbTuples=getNumberOfTuples(); - int nbOfCompo=getNumberOfComponents(); - MEDCouplingAutoRefCountObjectPtr ret=buildEmptySpecializedDAChar(); - ret->alloc(newNbOfTuple,nbOfCompo); - const char *iptr=getConstPointer(); - char *optr=ret->getPointer(); - for(int i=0;i=0) - std::copy(iptr+i*nbOfCompo,iptr+(i+1)*nbOfCompo,optr+w*nbOfCompo); - } - ret->copyStringInfoFrom(*this); - return ret.retn(); -} - -/*! - * Returns a shorten and permuted copy of \a this array. The new DataArrayChar is - * of size \a new2OldEnd - \a new2OldBg and it's values are permuted as required by - * \a new2OldBg array. - * The values are permuted so that \c new[ i ] = \c old[ \a new2OldBg[ i ]]. - * This method is equivalent to renumberAndReduce() except that convention in input is - * \c new2old and \b not \c old2new. - * For more info on renumbering see \ref MEDCouplingArrayRenumbering. - * \param [in] new2OldBg - pointer to the beginning of a permutation array that gives a - * tuple index in \a this array to fill the i-th tuple in the new array. - * \param [in] new2OldEnd - specifies the end of the permutation array that starts at - * \a new2OldBg, so that pointer to a tuple index (\a pi) varies as this: - * \a new2OldBg <= \a pi < \a new2OldEnd. - * \return DataArrayChar * - the new instance of DataArrayChar that the caller - * is to delete using decrRef() as it is no more needed. - */ -DataArrayChar *DataArrayChar::selectByTupleId(const int *new2OldBg, const int *new2OldEnd) const -{ - return selectByTupleIdSafe(new2OldBg,new2OldEnd); -} - -/*! - * Returns a shorten and permuted copy of \a this array. The new DataArrayChar is - * of size \a new2OldEnd - \a new2OldBg and it's values are permuted as required by - * \a new2OldBg array. - * The values are permuted so that \c new[ i ] = \c old[ \a new2OldBg[ i ]]. - * This method is equivalent to renumberAndReduce() except that convention in input is - * \c new2old and \b not \c old2new. - * This method is equivalent to selectByTupleId() except that it prevents coping data - * from behind the end of \a this array. - * For more info on renumbering see \ref MEDCouplingArrayRenumbering. - * \param [in] new2OldBg - pointer to the beginning of a permutation array that gives a - * tuple index in \a this array to fill the i-th tuple in the new array. - * \param [in] new2OldEnd - specifies the end of the permutation array that starts at - * \a new2OldBg, so that pointer to a tuple index (\a pi) varies as this: - * \a new2OldBg <= \a pi < \a new2OldEnd. - * \return DataArrayChar * - the new instance of DataArrayChar that the caller - * is to delete using decrRef() as it is no more needed. - * \throw If \a new2OldEnd - \a new2OldBg > \a this->getNumberOfTuples(). - */ -DataArrayChar *DataArrayChar::selectByTupleIdSafe(const int *new2OldBg, const int *new2OldEnd) const -{ - checkAllocated(); - MEDCouplingAutoRefCountObjectPtr ret=buildEmptySpecializedDAChar(); - int nbComp=getNumberOfComponents(); - int oldNbOfTuples=getNumberOfTuples(); - ret->alloc((int)std::distance(new2OldBg,new2OldEnd),nbComp); - ret->copyStringInfoFrom(*this); - char *pt=ret->getPointer(); - const char *srcPt=getConstPointer(); - int i=0; - for(const int *w=new2OldBg;w!=new2OldEnd;w++,i++) - if(*w>=0 && *wgetNumberOfTuples) !"); - ret->copyStringInfoFrom(*this); - return ret.retn(); -} - -/*! - * Returns a shorten copy of \a this array. The new DataArrayChar contains every - * (\a bg + \c i * \a step)-th tuple of \a this array located before the \a end2-th - * tuple. Indices of the selected tuples are the same as ones returned by the Python - * command \c range( \a bg, \a end2, \a step ). - * This method is equivalent to selectByTupleIdSafe() except that the input array is - * not constructed explicitly. - * For more info on renumbering see \ref MEDCouplingArrayRenumbering. - * \param [in] bg - index of the first tuple to copy from \a this array. - * \param [in] end2 - index of the tuple before which the tuples to copy are located. - * \param [in] step - index increment to get index of the next tuple to copy. - * \return DataArrayChar * - the new instance of DataArrayChar 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 DataArrayChar::substr. - */ -DataArrayChar *DataArrayChar::selectByTupleId2(int bg, int end2, int step) const -{ - checkAllocated(); - MEDCouplingAutoRefCountObjectPtr ret=buildEmptySpecializedDAChar(); - int nbComp=getNumberOfComponents(); - int newNbOfTuples=GetNumberOfItemGivenBESRelative(bg,end2,step,"DataArrayInt::selectByTupleId2 : "); - ret->alloc(newNbOfTuples,nbComp); - char *pt=ret->getPointer(); - const char *srcPt=getConstPointer()+bg*nbComp; - for(int i=0;icopyStringInfoFrom(*this); - return ret.retn(); -} - /*! * Checks if all values in \a this array are equal to \a val. * \param [in] val - value to check equality of array values to. @@ -619,144 +161,6 @@ bool DataArrayChar::isUniform(char val) const return true; } -/*! - * Changes the number of components within \a this array so that its raw data **does - * not** change, instead splitting this data into tuples changes. - * \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 DataArrayChar::rearrange(int newNbOfCompo) -{ - checkAllocated(); - if(newNbOfCompo<1) - throw INTERP_KERNEL::Exception("DataArrayChar::rearrange : input newNbOfCompo must be > 0 !"); - std::size_t nbOfElems=getNbOfElems(); - if(nbOfElems%newNbOfCompo!=0) - throw INTERP_KERNEL::Exception("DataArrayChar::rearrange : nbOfElems%newNbOfCompo!=0 !"); - if(nbOfElems/newNbOfCompo>(std::size_t)std::numeric_limits::max()) - throw INTERP_KERNEL::Exception("DataArrayChar::rearrange : the rearrangement leads to too high number of tuples (> 2147483647) !"); - _info_on_compo.clear(); - _info_on_compo.resize(newNbOfCompo); - declareAsNew(); -} - -/*! - * Returns a shorten copy of \a this array. The new DataArrayChar contains all - * tuples starting from the \a tupleIdBg-th tuple and including all tuples located before - * the \a tupleIdEnd-th one. This methods has a similar behavior as std::string::substr(). - * This method is a specialization of selectByTupleId2(). - * \param [in] tupleIdBg - index of the first tuple to copy from \a this array. - * \param [in] tupleIdEnd - index of the tuple before which the tuples to copy are located. - * If \a tupleIdEnd == -1, all the tuples till the end of \a this array are copied. - * \return DataArrayChar * - the new instance of DataArrayChar that the caller - * is to delete using decrRef() as it is no more needed. - * \throw If \a tupleIdBg < 0. - * \throw If \a tupleIdBg > \a this->getNumberOfTuples(). - \throw If \a tupleIdEnd != -1 && \a tupleIdEnd < \a this->getNumberOfTuples(). - * \sa DataArrayChar::selectByTupleId2 - */ -DataArrayChar *DataArrayChar::substr(int tupleIdBg, int tupleIdEnd) const -{ - checkAllocated(); - int nbt=getNumberOfTuples(); - if(tupleIdBg<0) - throw INTERP_KERNEL::Exception("DataArrayChar::substr : The tupleIdBg parameter must be greater than 0 !"); - if(tupleIdBg>nbt) - throw INTERP_KERNEL::Exception("DataArrayChar::substr : The tupleIdBg parameter is greater than number of tuples !"); - int trueEnd=tupleIdEnd; - if(tupleIdEnd!=-1) - { - if(tupleIdEnd>nbt) - throw INTERP_KERNEL::Exception("DataArrayChar::substr : The tupleIdBg parameter is greater or equal than number of tuples !"); - } - else - trueEnd=nbt; - int nbComp=getNumberOfComponents(); - MEDCouplingAutoRefCountObjectPtr ret=buildEmptySpecializedDAChar(); - ret->alloc(trueEnd-tupleIdBg,nbComp); - ret->copyStringInfoFrom(*this); - std::copy(getConstPointer()+tupleIdBg*nbComp,getConstPointer()+trueEnd*nbComp,ret->getPointer()); - return ret.retn(); -} - -/*! - * Returns a shorten or extended copy of \a this array. If \a newNbOfComp is less - * than \a this->getNumberOfComponents() then the result array is shorten as each tuple - * is truncated to have \a newNbOfComp components, keeping first components. If \a - * newNbOfComp is more than \a this->getNumberOfComponents() then the result array is - * expanded as each tuple is populated with \a dftValue to have \a newNbOfComp - * components. - * \param [in] newNbOfComp - number of components for the new array to have. - * \param [in] dftValue - value assigned to new values added to the new array. - * \return DataArrayChar * - the new instance of DataArrayChar that the caller - * is to delete using decrRef() as it is no more needed. - * \throw If \a this is not allocated. - */ -DataArrayChar *DataArrayChar::changeNbOfComponents(int newNbOfComp, char dftValue) const -{ - checkAllocated(); - MEDCouplingAutoRefCountObjectPtr ret=buildEmptySpecializedDAChar(); - ret->alloc(getNumberOfTuples(),newNbOfComp); - const char *oldc=getConstPointer(); - char *nc=ret->getPointer(); - int nbOfTuples=getNumberOfTuples(); - int oldNbOfComp=getNumberOfComponents(); - int dim=std::min(oldNbOfComp,newNbOfComp); - for(int i=0;isetName(getName()); - for(int i=0;isetInfoOnComponent(i,getInfoOnComponent(i)); - ret->setName(getName()); - return ret.retn(); -} - -/*! - * Returns a copy of \a this array composed of selected components. - * The new DataArrayChar has the same number of tuples but includes components - * specified by \a compoIds parameter. So that getNbOfElems() of the result array - * can be either less, same or more than \a this->getNbOfElems(). - * \param [in] compoIds - sequence of zero based indices of components to include - * into the new array. - * \return DataArrayChar * - the new instance of DataArrayChar that the caller - * is to delete using decrRef() as it is no more needed. - * \throw If \a this is not allocated. - * \throw If a component index (\a i) is not valid: - * \a i < 0 || \a i >= \a this->getNumberOfComponents(). - * - * \if ENABLE_EXAMPLES - * \ref py_mcdataarrayint_keepselectedcomponents "Here is a Python example". - * \endif - */ -DataArrayChar *DataArrayChar::keepSelectedComponents(const std::vector& compoIds) const -{ - checkAllocated(); - MEDCouplingAutoRefCountObjectPtr ret(buildEmptySpecializedDAChar()); - int newNbOfCompo=(int)compoIds.size(); - int oldNbOfCompo=getNumberOfComponents(); - for(std::vector::const_iterator it=compoIds.begin();it!=compoIds.end();it++) - DataArray::CheckValueInRange(oldNbOfCompo,(*it),"keepSelectedComponents invalid requested component"); - int nbOfTuples=getNumberOfTuples(); - ret->alloc(nbOfTuples,newNbOfCompo); - ret->copyPartOfStringInfoFrom(*this,compoIds); - const char *oldc=getConstPointer(); - char *nc=ret->getPointer(); - for(int i=0;igetNumberOfComponents() - * must be equal to the number of columns to assign to, else an - * exception is thrown; if \a false, then it is only required that \a - * a->getNbOfElems() equals to number of values to assign to (this condition - * must be respected even if \a strictCompoCompare is \a true). The number of - * values to assign to is given by following Python expression: - * \a nbTargetValues = - * \c len(\c range(\a bgTuples,\a endTuples,\a stepTuples)) * - * \c len(\c range(\a bgComp,\a endComp,\a stepComp)). - * \throw If \a a is NULL. - * \throw If \a a is not allocated. - * \throw If \a this is not allocated. - * \throw If parameters specifying tuples and components to assign to do not give a - * non-empty range of increasing indices. - * \throw If \a a->getNbOfElems() != \a nbTargetValues. - * \throw If \a strictCompoCompare == \a true && \a a->getNumberOfComponents() != - * \c len(\c range(\a bgComp,\a endComp,\a stepComp)). - * - * \if ENABLE_EXAMPLES - * \ref py_mcdataarrayint_setpartofvalues1 "Here is a Python example". - * \endif - */ -void DataArrayChar::setPartOfValues1(const DataArrayChar *a, int bgTuples, int endTuples, int stepTuples, int bgComp, int endComp, int stepComp, bool strictCompoCompare) -{ - if(!a) - throw INTERP_KERNEL::Exception("DataArrayChar::setPartOfValues1 : DataArrayChar pointer in input is NULL !"); - const char msg[]="DataArrayChar::setPartOfValues1"; - checkAllocated(); - a->checkAllocated(); - int newNbOfTuples=DataArray::GetNumberOfItemGivenBES(bgTuples,endTuples,stepTuples,msg); - int newNbOfComp=DataArray::GetNumberOfItemGivenBES(bgComp,endComp,stepComp,msg); - int nbComp=getNumberOfComponents(); - int nbOfTuples=getNumberOfTuples(); - DataArray::CheckValueInRangeEx(nbOfTuples,bgTuples,endTuples,"invalid tuple value"); - DataArray::CheckValueInRangeEx(nbComp,bgComp,endComp,"invalid component value"); - bool assignTech=true; - if(a->getNbOfElems()==(std::size_t)newNbOfTuples*newNbOfComp) - { - if(strictCompoCompare) - a->checkNbOfTuplesAndComp(newNbOfTuples,newNbOfComp,msg); - } - else - { - a->checkNbOfTuplesAndComp(1,newNbOfComp,msg); - assignTech=false; - } - char *pt=getPointer()+bgTuples*nbComp+bgComp; - const char *srcPt=a->getConstPointer(); - if(assignTech) - { - for(int i=0;igetNbOfElems() equals to number of values to assign to, then every value - * of \a a is assigned to its own location within \a this array. - * - If \a a includes one tuple, then all values of \a a are assigned to the specified - * components of every specified tuple of \a this array. In this mode it is required - * that \a a->getNumberOfComponents() equals to the number of specified components. - * - * \param [in] a - the array to copy values from. - * \param [in] bgTuples - pointer to an array of tuple indices of \a this array to - * assign values of \a a to. - * \param [in] endTuples - specifies the end of the array \a bgTuples, so that - * pointer to a tuple index (pi) varies as this: - * \a bgTuples <= \a pi < \a endTuples. - * \param [in] bgComp - pointer to an array of component indices of \a this array to - * assign values of \a a to. - * \param [in] endComp - specifies the end of the array \a bgTuples, so that - * pointer to a component index (pi) varies as this: - * \a bgComp <= \a pi < \a endComp. - * \param [in] strictCompoCompare - this parameter is checked only if the - * *mode of usage* is the first; if it is \a true (default), - * then \a a->getNumberOfComponents() must be equal - * to the number of specified columns, else this is not required. - * \throw If \a a is NULL. - * \throw If \a a is not allocated. - * \throw If \a this is not allocated. - * \throw If any index of tuple/component given by bgTuples / bgComp is - * out of a valid range for \a this array. - * \throw In the first *mode of usage*, if strictCompoCompare == true and - * if a->getNumberOfComponents() != (endComp - bgComp) . - * \throw In the second *mode of usage*, if \a a->getNumberOfTuples() != 1 or - * a->getNumberOfComponents() != (endComp - bgComp). - * - * \if ENABLE_EXAMPLES - * \ref py_mcdataarrayint_setpartofvalues2 "Here is a Python example". - * \endif - */ -void DataArrayChar::setPartOfValues2(const DataArrayChar *a, const int *bgTuples, const int *endTuples, const int *bgComp, const int *endComp, bool strictCompoCompare) -{ - if(!a) - throw INTERP_KERNEL::Exception("DataArrayChar::setPartOfValues2 : DataArrayChar pointer in input is NULL !"); - const char msg[]="DataArrayChar::setPartOfValues2"; - checkAllocated(); - a->checkAllocated(); - int nbComp=getNumberOfComponents(); - int nbOfTuples=getNumberOfTuples(); - for(const int *z=bgComp;z!=endComp;z++) - DataArray::CheckValueInRange(nbComp,*z,"invalid component id"); - int newNbOfTuples=(int)std::distance(bgTuples,endTuples); - int newNbOfComp=(int)std::distance(bgComp,endComp); - bool assignTech=true; - if(a->getNbOfElems()==(std::size_t)newNbOfTuples*newNbOfComp) - { - if(strictCompoCompare) - a->checkNbOfTuplesAndComp(newNbOfTuples,newNbOfComp,msg); - } - else - { - a->checkNbOfTuplesAndComp(1,newNbOfComp,msg); - assignTech=false; - } - char *pt=getPointer(); - const char *srcPt=a->getConstPointer(); - if(assignTech) - { - for(const int *w=bgTuples;w!=endTuples;w++) - { - DataArray::CheckValueInRange(nbOfTuples,*w,"invalid tuple id"); - for(const int *z=bgComp;z!=endComp;z++,srcPt++) - { - pt[(std::size_t)(*w)*nbComp+(*z)]=*srcPt; - } - } - } - else - { - for(const int *w=bgTuples;w!=endTuples;w++) - { - const char *srcPt2=srcPt; - DataArray::CheckValueInRange(nbOfTuples,*w,"invalid tuple id"); - for(const int *z=bgComp;z!=endComp;z++,srcPt2++) - { - pt[(std::size_t)(*w)*nbComp+(*z)]=*srcPt2; - } - } - } -} - -/*! - * Assign a given value to values at specified tuples and components of \a this array. - * The tuples and components to assign to are defined by C arrays of indices. - * \param [in] a - the value to assign. - * \param [in] bgTuples - pointer to an array of tuple indices of \a this array to - * assign \a a to. - * \param [in] endTuples - specifies the end of the array \a bgTuples, so that - * pointer to a tuple index (\a pi) varies as this: - * \a bgTuples <= \a pi < \a endTuples. - * \param [in] bgComp - pointer to an array of component indices of \a this array to - * assign \a a to. - * \param [in] endComp - specifies the end of the array \a bgTuples, so that - * pointer to a component index (\a pi) varies as this: - * \a bgComp <= \a pi < \a endComp. - * \throw If \a this is not allocated. - * \throw If any index of tuple/component given by bgTuples / bgComp is - * out of a valid range for \a this array. - * - * \if ENABLE_EXAMPLES - * \ref py_mcdataarrayint_setpartofvaluessimple2 "Here is a Python example". - * \endif - */ -void DataArrayChar::setPartOfValuesSimple2(char a, const int *bgTuples, const int *endTuples, const int *bgComp, const int *endComp) -{ - checkAllocated(); - int nbComp=getNumberOfComponents(); - int nbOfTuples=getNumberOfTuples(); - for(const int *z=bgComp;z!=endComp;z++) - DataArray::CheckValueInRange(nbComp,*z,"invalid component id"); - char *pt=getPointer(); - for(const int *w=bgTuples;w!=endTuples;w++) - for(const int *z=bgComp;z!=endComp;z++) - { - DataArray::CheckValueInRange(nbOfTuples,*w,"invalid tuple id"); - pt[(std::size_t)(*w)*nbComp+(*z)]=a; - } -} - -/*! - * Copy all values from another DataArrayChar (\a a) into specified tuples and - * components of \a this array. Textual data is not copied. - * The tuples to assign to are defined by a C array of indices. - * The components to assign to are defined by three values similar to parameters of - * the Python function \c range(\c start,\c stop,\c step). - * There are two *modes of usage*: - * - If \a a->getNbOfElems() equals to number of values to assign to, then every value - * of \a a is assigned to its own location within \a this array. - * - If \a a includes one tuple, then all values of \a a are assigned to the specified - * components of every specified tuple of \a this array. In this mode it is required - * that \a a->getNumberOfComponents() equals to the number of specified components. - * - * \param [in] a - the array to copy values from. - * \param [in] bgTuples - pointer to an array of tuple indices of \a this array to - * assign values of \a a to. - * \param [in] endTuples - specifies the end of the array \a bgTuples, so that - * pointer to a tuple index (pi) varies as this: - * \a bgTuples <= \a pi < \a endTuples. - * \param [in] bgComp - index of the first component of \a this array to assign to. - * \param [in] endComp - index of the component before which the components to assign - * to are located. - * \param [in] stepComp - index increment to get index of the next component to assign to. - * \param [in] strictCompoCompare - this parameter is checked only in the first - * *mode of usage*; if \a strictCompoCompare is \a true (default), - * then \a a->getNumberOfComponents() must be equal - * to the number of specified columns, else this is not required. - * \throw If \a a is NULL. - * \throw If \a a is not allocated. - * \throw If \a this is not allocated. - * \throw If any index of tuple given by \a bgTuples is out of a valid range for - * \a this array. - * \throw In the first *mode of usage*, if strictCompoCompare == true and - * if a->getNumberOfComponents() is unequal to the number of components - * defined by (bgComp,endComp,stepComp). - * \throw In the second *mode of usage*, if \a a->getNumberOfTuples() != 1 or - * a->getNumberOfComponents() is unequal to the number of components - * defined by (bgComp,endComp,stepComp). - * \throw If parameters specifying components to assign to, do not give a - * non-empty range of increasing indices or indices are out of a valid range - * for \this array. - * - * \if ENABLE_EXAMPLES - * \ref py_mcdataarrayint_setpartofvalues3 "Here is a Python example". - * \endif - */ -void DataArrayChar::setPartOfValues3(const DataArrayChar *a, const int *bgTuples, const int *endTuples, int bgComp, int endComp, int stepComp, bool strictCompoCompare) -{ - if(!a) - throw INTERP_KERNEL::Exception("DataArrayChar::setPartOfValues3 : DataArrayChar pointer in input is NULL !"); - const char msg[]="DataArrayChar::setPartOfValues3"; - checkAllocated(); - a->checkAllocated(); - int newNbOfComp=DataArray::GetNumberOfItemGivenBES(bgComp,endComp,stepComp,msg); - int nbComp=getNumberOfComponents(); - int nbOfTuples=getNumberOfTuples(); - DataArray::CheckValueInRangeEx(nbComp,bgComp,endComp,"invalid component value"); - int newNbOfTuples=(int)std::distance(bgTuples,endTuples); - bool assignTech=true; - if(a->getNbOfElems()==(std::size_t)newNbOfTuples*newNbOfComp) - { - if(strictCompoCompare) - a->checkNbOfTuplesAndComp(newNbOfTuples,newNbOfComp,msg); - } - else - { - a->checkNbOfTuplesAndComp(1,newNbOfComp,msg); - assignTech=false; - } - char *pt=getPointer()+bgComp; - const char *srcPt=a->getConstPointer(); - if(assignTech) - { - for(const int *w=bgTuples;w!=endTuples;w++) - for(int j=0;j(pi) varies as this: - * \a bgTuples <= \a pi < \a endTuples. - * \param [in] bgComp - index of the first component of \a this array to assign to. - * \param [in] endComp - index of the component before which the components to assign - * to are located. - * \param [in] stepComp - index increment to get index of the next component to assign to. - * \throw If \a this is not allocated. - * \throw If any index of tuple given by \a bgTuples is out of a valid range for - * \a this array. - * \throw If parameters specifying components to assign to, do not give a - * non-empty range of increasing indices or indices are out of a valid range - * for \this array. - * - * \if ENABLE_EXAMPLES - * \ref py_mcdataarrayint_setpartofvaluessimple3 "Here is a Python example". - * \endif - */ -void DataArrayChar::setPartOfValuesSimple3(char a, const int *bgTuples, const int *endTuples, int bgComp, int endComp, int stepComp) -{ - const char msg[]="DataArrayChar::setPartOfValuesSimple3"; - checkAllocated(); - int newNbOfComp=DataArray::GetNumberOfItemGivenBES(bgComp,endComp,stepComp,msg); - int nbComp=getNumberOfComponents(); - int nbOfTuples=getNumberOfTuples(); - DataArray::CheckValueInRangeEx(nbComp,bgComp,endComp,"invalid component value"); - char *pt=getPointer()+bgComp; - for(const int *w=bgTuples;w!=endTuples;w++) - for(int j=0;jcheckAllocated(); - int newNbOfTuples=DataArray::GetNumberOfItemGivenBES(bgTuples,endTuples,stepTuples,msg); - int newNbOfComp=(int)std::distance(bgComp,endComp); - int nbComp=getNumberOfComponents(); - for(const int *z=bgComp;z!=endComp;z++) - DataArray::CheckValueInRange(nbComp,*z,"invalid component id"); - int nbOfTuples=getNumberOfTuples(); - DataArray::CheckValueInRangeEx(nbOfTuples,bgTuples,endTuples,"invalid tuple value"); - bool assignTech=true; - if(a->getNbOfElems()==(std::size_t)newNbOfTuples*newNbOfComp) - { - if(strictCompoCompare) - a->checkNbOfTuplesAndComp(newNbOfTuples,newNbOfComp,msg); - } - else - { - a->checkNbOfTuplesAndComp(1,newNbOfComp,msg); - assignTech=false; - } - const char *srcPt=a->getConstPointer(); - char *pt=getPointer()+bgTuples*nbComp; - if(assignTech) - { - for(int i=0;ithis->getNumberOfComponents() != a->getNumberOfComponents(). - * \throw If \a tuplesSelec->getNumberOfComponents() != 2. - * \throw If any tuple index given by \a tuplesSelec is out of a valid range for - * the corresponding (\a this or \a a) array. - */ -void DataArrayChar::setPartOfValuesAdv(const DataArrayChar *a, const DataArrayChar *tuplesSelec) -{ - if(!a || !tuplesSelec) - throw INTERP_KERNEL::Exception("DataArrayChar::setPartOfValuesAdv : DataArrayChar pointer in input is NULL !"); - checkAllocated(); - a->checkAllocated(); - tuplesSelec->checkAllocated(); - int nbOfComp=getNumberOfComponents(); - if(nbOfComp!=a->getNumberOfComponents()) - throw INTERP_KERNEL::Exception("DataArrayChar::setPartOfValuesAdv : This and a do not have the same number of components !"); - if(tuplesSelec->getNumberOfComponents()!=2) - throw INTERP_KERNEL::Exception("DataArrayChar::setPartOfValuesAdv : Expecting to have a tuple selector DataArrayChar instance with exactly 2 components !"); - int thisNt=getNumberOfTuples(); - int aNt=a->getNumberOfTuples(); - char *valsToSet=getPointer(); - const char *valsSrc=a->getConstPointer(); - for(const char *tuple=tuplesSelec->begin();tuple!=tuplesSelec->end();tuple+=2) - { - if(tuple[1]>=0 && tuple[1]=0 && tuple[0]begin(),tuple)/2; - oss << " of 'tuplesSelec' request of tuple id #" << tuple[0] << " in 'this' ! It should be in [0," << thisNt << ") !"; - throw INTERP_KERNEL::Exception(oss.str().c_str()); - } - } - else - { - std::ostringstream oss; oss << "DataArrayChar::setPartOfValuesAdv : Tuple #" << std::distance(tuplesSelec->begin(),tuple)/2; - oss << " of 'tuplesSelec' request of tuple id #" << tuple[1] << " in 'a' ! It should be in [0," << aNt << ") !"; - throw INTERP_KERNEL::Exception(oss.str().c_str()); - } - } -} - -/*! - * Copy some tuples from another DataArrayChar (\a aBase) into contiguous tuples - * of \a this array. Textual data is not copied. Both arrays must have equal number of - * components. - * The tuples to assign to are defined by index of the first tuple, and - * their number is defined by \a tuplesSelec->getNumberOfTuples(). - * The tuples to copy are defined by values of a DataArrayChar. - * All components of selected tuples are copied. - * \param [in] tupleIdStart - index of the first tuple of \a this array to assign - * values to. - * \param [in] aBase - the array to copy values from. - * \param [in] tuplesSelec - the array specifying tuples of \a aBase to copy. - * \throw If \a this is not allocated. - * \throw If \a aBase is NULL. - * \throw If \a aBase is not allocated. - * \throw If \a tuplesSelec is NULL. - * \throw If \a tuplesSelec is not allocated. - * \throw If this->getNumberOfComponents() != aBase->getNumberOfComponents(). - * \throw If \a tuplesSelec->getNumberOfComponents() != 1. - * \throw If tupleIdStart + tuplesSelec->getNumberOfTuples() > this->getNumberOfTuples(). - * \throw If any tuple index given by \a tuplesSelec is out of a valid range for - * \a aBase array. - */ -void DataArrayChar::setContigPartOfSelectedValues(int tupleIdStart, const DataArray *aBase, const DataArrayInt *tuplesSelec) -{ - if(!aBase || !tuplesSelec) - throw INTERP_KERNEL::Exception("DataArrayChar::setContigPartOfSelectedValues : input DataArray is NULL !"); - const DataArrayChar *a=dynamic_cast(aBase); - if(!a) - throw INTERP_KERNEL::Exception("DataArrayChar::setContigPartOfSelectedValues : input DataArray aBase is not a DataArrayChar !"); - checkAllocated(); - a->checkAllocated(); - tuplesSelec->checkAllocated(); - int nbOfComp=getNumberOfComponents(); - if(nbOfComp!=a->getNumberOfComponents()) - throw INTERP_KERNEL::Exception("DataArrayChar::setContigPartOfSelectedValues : This and a do not have the same number of components !"); - if(tuplesSelec->getNumberOfComponents()!=1) - throw INTERP_KERNEL::Exception("DataArrayChar::setContigPartOfSelectedValues : Expecting to have a tuple selector DataArrayChar instance with exactly 1 component !"); - int thisNt=getNumberOfTuples(); - int aNt=a->getNumberOfTuples(); - int nbOfTupleToWrite=tuplesSelec->getNumberOfTuples(); - char *valsToSet=getPointer()+tupleIdStart*nbOfComp; - if(tupleIdStart+nbOfTupleToWrite>thisNt) - throw INTERP_KERNEL::Exception("DataArrayChar::setContigPartOfSelectedValues : invalid number range of values to write !"); - const char *valsSrc=a->getConstPointer(); - for(const int *tuple=tuplesSelec->begin();tuple!=tuplesSelec->end();tuple++,valsToSet+=nbOfComp) - { - if(*tuple>=0 && *tuplebegin(),tuple); - oss << " of 'tuplesSelec' request of tuple id #" << *tuple << " in 'a' ! It should be in [0," << aNt << ") !"; - throw INTERP_KERNEL::Exception(oss.str().c_str()); - } - } -} - -/*! - * Copy some tuples from another DataArrayChar (\a aBase) into contiguous tuples - * of \a this array. Textual data is not copied. Both arrays must have equal number of - * components. - * The tuples to copy are defined by three values similar to parameters of - * the Python function \c range(\c start,\c stop,\c step). - * The tuples to assign to are defined by index of the first tuple, and - * their number is defined by number of tuples to copy. - * All components of selected tuples are copied. - * \param [in] tupleIdStart - index of the first tuple of \a this array to assign - * values to. - * \param [in] aBase - the array to copy values from. - * \param [in] bg - index of the first tuple to copy of the array \a aBase. - * \param [in] end2 - index of the tuple of \a aBase before which the tuples to copy - * are located. - * \param [in] step - index increment to get index of the next tuple to copy. - * \throw If \a this is not allocated. - * \throw If \a aBase is NULL. - * \throw If \a aBase is not allocated. - * \throw If this->getNumberOfComponents() != aBase->getNumberOfComponents(). - * \throw If tupleIdStart + len(range(bg,end2,step)) > this->getNumberOfTuples(). - * \throw If parameters specifying tuples to copy, do not give a - * non-empty range of increasing indices or indices are out of a valid range - * for the array \a aBase. - */ -void DataArrayChar::setContigPartOfSelectedValues2(int tupleIdStart, const DataArray *aBase, int bg, int end2, int step) -{ - if(!aBase) - throw INTERP_KERNEL::Exception("DataArrayChar::setContigPartOfSelectedValues2 : input DataArray is NULL !"); - const DataArrayChar *a=dynamic_cast(aBase); - if(!a) - throw INTERP_KERNEL::Exception("DataArrayChar::setContigPartOfSelectedValues2 : input DataArray aBase is not a DataArrayChar !"); - checkAllocated(); - a->checkAllocated(); - int nbOfComp=getNumberOfComponents(); - const char msg[]="DataArrayChar::setContigPartOfSelectedValues2"; - int nbOfTupleToWrite=DataArray::GetNumberOfItemGivenBES(bg,end2,step,msg); - if(nbOfComp!=a->getNumberOfComponents()) - throw INTERP_KERNEL::Exception("DataArrayChar::setContigPartOfSelectedValues2 : This and a do not have the same number of components !"); - int thisNt=getNumberOfTuples(); - int aNt=a->getNumberOfTuples(); - char *valsToSet=getPointer()+tupleIdStart*nbOfComp; - if(tupleIdStart+nbOfTupleToWrite>thisNt) - throw INTERP_KERNEL::Exception("DataArrayChar::setContigPartOfSelectedValues2 : invalid number range of values to write !"); - if(end2>aNt) - throw INTERP_KERNEL::Exception("DataArrayChar::setContigPartOfSelectedValues2 : invalid range of values to read !"); - const char *valsSrc=a->getConstPointer()+bg*nbOfComp; - for(int i=0;i \a this->getNumberOfTuples(). - * \throw If \a this is not allocated. - */ -DataArray *DataArrayChar::selectByTupleRanges(const std::vector >& ranges) const -{ - checkAllocated(); - int nbOfComp=getNumberOfComponents(); - int nbOfTuplesThis=getNumberOfTuples(); - if(ranges.empty()) - { - MEDCouplingAutoRefCountObjectPtr ret=buildEmptySpecializedDAChar(); - ret->alloc(0,nbOfComp); - ret->copyStringInfoFrom(*this); - return ret.retn(); - } - int ref=ranges.front().first; - int nbOfTuples=0; - bool isIncreasing=true; - for(std::vector >::const_iterator it=ranges.begin();it!=ranges.end();it++) - { - if((*it).first<=(*it).second) - { - if((*it).first>=0 && (*it).second<=nbOfTuplesThis) - { - nbOfTuples+=(*it).second-(*it).first; - if(isIncreasing) - isIncreasing=ref<=(*it).first; - ref=(*it).second; - } - else - { - std::ostringstream oss; oss << "DataArrayChar::selectByTupleRanges : on range #" << std::distance(ranges.begin(),it); - oss << " (" << (*it).first << "," << (*it).second << ") is greater than number of tuples of this :" << nbOfTuples << " !"; - throw INTERP_KERNEL::Exception(oss.str().c_str()); - } - } - else - { - std::ostringstream oss; oss << "DataArrayChar::selectByTupleRanges : on range #" << std::distance(ranges.begin(),it); - oss << " (" << (*it).first << "," << (*it).second << ") end is before begin !"; - throw INTERP_KERNEL::Exception(oss.str().c_str()); - } - } - if(isIncreasing && nbOfTuplesThis==nbOfTuples) - return deepCpy(); - MEDCouplingAutoRefCountObjectPtr ret=buildEmptySpecializedDAChar(); - ret->alloc(nbOfTuples,nbOfComp); - ret->copyStringInfoFrom(*this); - const char *src=getConstPointer(); - char *work=ret->getPointer(); - for(std::vector >::const_iterator it=ranges.begin();it!=ranges.end();it++) - work=std::copy(src+(*it).first*nbOfComp,src+(*it).second*nbOfComp,work); - return ret.retn(); -} - -/*! - * Returns a value located at specified tuple and component. - * This method is equivalent to DataArrayChar::getIJ() except that validity of - * parameters is checked. So this method is safe but expensive if used to go through - * all values of \a this. - * \param [in] tupleId - index of tuple of interest. - * \param [in] compoId - index of component of interest. - * \return char - value located by \a tupleId and \a compoId. - * \throw If \a this is not allocated. - * \throw If condition ( 0 <= tupleId < this->getNumberOfTuples() ) is violated. - * \throw If condition ( 0 <= compoId < this->getNumberOfComponents() ) is violated. - */ -char DataArrayChar::getIJSafe(int tupleId, int compoId) const -{ - checkAllocated(); - if(tupleId<0 || tupleId>=getNumberOfTuples()) - { - std::ostringstream oss; oss << "DataArrayChar::getIJSafe : request for tupleId " << tupleId << " should be in [0," << getNumberOfTuples() << ") !"; - throw INTERP_KERNEL::Exception(oss.str().c_str()); - } - if(compoId<0 || compoId>=getNumberOfComponents()) - { - std::ostringstream oss; oss << "DataArrayChar::getIJSafe : request for compoId " << compoId << " should be in [0," << getNumberOfComponents() << ") !"; - throw INTERP_KERNEL::Exception(oss.str().c_str()); - } - return _mem[tupleId*_info_on_compo.size()+compoId]; -} - -/*! - * Returns the first value of \a this. - * \return char - the last value of \a this array. - * \throw If \a this is not allocated. - * \throw If \a this->getNumberOfComponents() != 1. - * \throw If \a this->getNumberOfTuples() < 1. - */ -char DataArrayChar::front() const -{ - checkAllocated(); - if(getNumberOfComponents()!=1) - throw INTERP_KERNEL::Exception("DataArrayChar::front : number of components not equal to one !"); - int nbOfTuples=getNumberOfTuples(); - if(nbOfTuples<1) - throw INTERP_KERNEL::Exception("DataArrayChar::front : number of tuples must be >= 1 !"); - return *(getConstPointer()); -} - -/*! - * Returns the last value of \a this. - * \return char - the last value of \a this array. - * \throw If \a this is not allocated. - * \throw If \a this->getNumberOfComponents() != 1. - * \throw If \a this->getNumberOfTuples() < 1. - */ -char DataArrayChar::back() const -{ - checkAllocated(); - if(getNumberOfComponents()!=1) - throw INTERP_KERNEL::Exception("DataArrayChar::back : number of components not equal to one !"); - int nbOfTuples=getNumberOfTuples(); - if(nbOfTuples<1) - throw INTERP_KERNEL::Exception("DataArrayChar::back : number of tuples must be >= 1 !"); - return *(getConstPointer()+nbOfTuples-1); -} - /*! * Creates a new DataArrayChar containing IDs (indices) of tuples holding value equal to a * given one. @@ -1551,13 +211,13 @@ char DataArrayChar::back() const * \throw If \a this is not allocated. * \throw If \a this->getNumberOfComponents() != 1. */ -DataArrayInt *DataArrayChar::getIdsEqual(char val) const +DataArrayInt *DataArrayChar::findIdsEqual(char val) const { checkAllocated(); if(getNumberOfComponents()!=1) - throw INTERP_KERNEL::Exception("DataArrayChar::getIdsEqual : the array must have only one component, you can call 'rearrange' method before !"); + throw INTERP_KERNEL::Exception("DataArrayChar::findIdsEqual : the array must have only one component, you can call 'rearrange' method before !"); const char *cptr=getConstPointer(); - MEDCouplingAutoRefCountObjectPtr ret(DataArrayInt::New()); ret->alloc(0,1); + MCAuto ret(DataArrayInt::New()); ret->alloc(0,1); int nbOfTuples=getNumberOfTuples(); for(int i=0;igetNumberOfComponents() != 1. */ -DataArrayInt *DataArrayChar::getIdsNotEqual(char val) const +DataArrayInt *DataArrayChar::findIdsNotEqual(char val) const { checkAllocated(); if(getNumberOfComponents()!=1) - throw INTERP_KERNEL::Exception("DataArrayChar::getIdsNotEqual : the array must have only one component, you can call 'rearrange' method before !"); + throw INTERP_KERNEL::Exception("DataArrayChar::findIdsNotEqual : the array must have only one component, you can call 'rearrange' method before !"); const char *cptr=getConstPointer(); - MEDCouplingAutoRefCountObjectPtr ret(DataArrayInt::New()); ret->alloc(0,1); + MCAuto ret(DataArrayInt::New()); ret->alloc(0,1); int nbOfTuples=getNumberOfTuples(); for(int i=0;i& vals) const +int DataArrayChar::findIdSequence(const std::vector& vals) const { checkAllocated(); int nbOfCompo=getNumberOfComponents(); if(nbOfCompo!=1) - throw INTERP_KERNEL::Exception("DataArrayChar::search : works only for DataArrayChar instance with one component !"); + throw INTERP_KERNEL::Exception("DataArrayChar::findIdSequence : works only for DataArrayChar instance with one component !"); const char *cptr=getConstPointer(); std::size_t nbOfVals=getNbOfElems(); const char *loc=std::search(cptr,cptr+nbOfVals,vals.begin(),vals.end()); @@ -1609,7 +269,7 @@ int DataArrayChar::search(const std::vector& vals) const } /*! - * This method is an extension of DataArrayChar::locateValue method because this method works for DataArrayChar with + * This method is an extension of DataArrayChar::findIdFirstEqual method because this method works for DataArrayChar with * any number of components excepted 0 (an INTERP_KERNEL::Exception is thrown in this case). * This method searches in \b this is there is a tuple that matched the input parameter \b tupl. * If any the tuple id is returned. If not -1 is returned. @@ -1618,17 +278,17 @@ int DataArrayChar::search(const std::vector& vals) const * the input vector. An INTERP_KERNEL::Exception is thrown too if \b this is not allocated. * * \return tuple id where \b tupl is. -1 if no such tuple exists in \b this. - * \sa DataArrayChar::search. + * \sa DataArrayChar::findIdSequence. */ -int DataArrayChar::locateTuple(const std::vector& tupl) const +int DataArrayChar::findIdFirstEqualTuple(const std::vector& tupl) const { checkAllocated(); int nbOfCompo=getNumberOfComponents(); if(nbOfCompo==0) - throw INTERP_KERNEL::Exception("DataArrayChar::locateTuple : 0 components in 'this' !"); + throw INTERP_KERNEL::Exception("DataArrayChar::findIdFirstEqualTuple : 0 components in 'this' !"); if(nbOfCompo!=(int)tupl.size()) { - std::ostringstream oss; oss << "DataArrayChar::locateTuple : 'this' contains " << nbOfCompo << " components and searching for a tuple of length " << tupl.size() << " !"; + std::ostringstream oss; oss << "DataArrayChar::findIdFirstEqualTuple : 'this' contains " << nbOfCompo << " components and searching for a tuple of length " << tupl.size() << " !"; throw INTERP_KERNEL::Exception(oss.str().c_str()); } const char *cptr=getConstPointer(); @@ -1653,11 +313,11 @@ int DataArrayChar::locateTuple(const std::vector& tupl) const * This method searches in \b this is there is a tuple that matched the input parameter \b tupl. * This method throws an INTERP_KERNEL::Exception if the number of components in \b this mismatches with the size of * the input vector. An INTERP_KERNEL::Exception is thrown too if \b this is not allocated. - * \sa DataArrayChar::locateTuple + * \sa DataArrayChar::findIdFirstEqualTuple */ bool DataArrayChar::presenceOfTuple(const std::vector& tupl) const { - return locateTuple(tupl)!=-1; + return findIdFirstEqualTuple(tupl)!=-1; } /*! @@ -1666,22 +326,22 @@ bool DataArrayChar::presenceOfTuple(const std::vector& tupl) const * \return bool - \a true in case if \a value is present within \a this array. * \throw If \a this is not allocated. * \throw If \a this->getNumberOfComponents() != 1. - * \sa locateValue() + * \sa findIdFirstEqual() */ bool DataArrayChar::presenceOfValue(char value) const { - return locateValue(value)!=-1; + return findIdFirstEqual(value)!=-1; } /*! * This method expects to be called when number of components of this is equal to one. * This method returns true if it exists a tuple so that the value is contained in \b vals. * If not any tuple contains one of the values contained in 'vals' false is returned. - * \sa DataArrayChar::locateValue + * \sa DataArrayChar::findIdFirstEqual */ bool DataArrayChar::presenceOfValue(const std::vector& vals) const { - return locateValue(vals)!=-1; + return findIdFirstEqual(vals)!=-1; } /*! @@ -1690,7 +350,7 @@ bool DataArrayChar::presenceOfValue(const std::vector& vals) const * If not any tuple contains \b value -1 is returned. * \sa DataArrayChar::presenceOfValue */ -int DataArrayChar::locateValue(char value) const +int DataArrayChar::findIdFirstEqual(char value) const { checkAllocated(); if(getNumberOfComponents()!=1) @@ -1709,7 +369,7 @@ int DataArrayChar::locateValue(char value) const * If not any tuple contains one of the values contained in 'vals' false is returned. * \sa DataArrayChar::presenceOfValue */ -int DataArrayChar::locateValue(const std::vector& vals) const +int DataArrayChar::findIdFirstEqual(const std::vector& vals) const { checkAllocated(); if(getNumberOfComponents()!=1) @@ -1723,74 +383,6 @@ int DataArrayChar::locateValue(const std::vector& vals) const return -1; } -/*! - * Returns the maximal value and its location within \a this one-dimensional array. - * \param [out] tupleId - index of the tuple holding the maximal value. - * \return char - the maximal value among all values of \a this array. - * \throw If \a this->getNumberOfComponents() != 1 - * \throw If \a this->getNumberOfTuples() < 1 - */ -char DataArrayChar::getMaxValue(int& tupleId) const -{ - checkAllocated(); - if(getNumberOfComponents()!=1) - throw INTERP_KERNEL::Exception("DataArrayChar::getMaxValue : must be applied on DataArrayChar with only one component !"); - int nbOfTuples=getNumberOfTuples(); - if(nbOfTuples<=0) - throw INTERP_KERNEL::Exception("DataArrayChar::getMaxValue : array exists but number of tuples must be > 0 !"); - const char *vals=getConstPointer(); - const char *loc=std::max_element(vals,vals+nbOfTuples); - tupleId=(int)std::distance(vals,loc); - return *loc; -} - -/*! - * Returns the maximal value within \a this array that is allowed to have more than - * one component. - * \return char - the maximal value among all values of \a this array. - * \throw If \a this is not allocated. - */ -char DataArrayChar::getMaxValueInArray() const -{ - checkAllocated(); - const char *loc=std::max_element(begin(),end()); - return *loc; -} - -/*! - * Returns the minimal value and its location within \a this one-dimensional array. - * \param [out] tupleId - index of the tuple holding the minimal value. - * \return char - the minimal value among all values of \a this array. - * \throw If \a this->getNumberOfComponents() != 1 - * \throw If \a this->getNumberOfTuples() < 1 - */ -char DataArrayChar::getMinValue(int& tupleId) const -{ - checkAllocated(); - if(getNumberOfComponents()!=1) - throw INTERP_KERNEL::Exception("DataArrayChar::getMaxValue : must be applied on DataArrayChar with only one component !"); - int nbOfTuples=getNumberOfTuples(); - if(nbOfTuples<=0) - throw INTERP_KERNEL::Exception("DataArrayChar::getMaxValue : array exists but number of tuples must be > 0 !"); - const char *vals=getConstPointer(); - const char *loc=std::min_element(vals,vals+nbOfTuples); - tupleId=(int)std::distance(vals,loc); - return *loc; -} - -/*! - * Returns the minimal value within \a this array that is allowed to have more than - * one component. - * \return char - the minimal value among all values of \a this array. - * \throw If \a this is not allocated. - */ -char DataArrayChar::getMinValueInArray() const -{ - checkAllocated(); - const char *loc=std::min_element(begin(),end()); - return *loc; -} - /*! * This method works only on data array with one component. * This method returns a newly allocated array storing stored ascendantly tuple ids in \b this so that @@ -1800,13 +392,13 @@ char DataArrayChar::getMinValueInArray() const * \param [in] vmax end of range. This value is \b not included in range. * \return a newly allocated data array that the caller should deal with. */ -DataArrayInt *DataArrayChar::getIdsInRange(char vmin, char vmax) const +DataArrayInt *DataArrayChar::findIdsInRange(char vmin, char vmax) const { checkAllocated(); if(getNumberOfComponents()!=1) - throw INTERP_KERNEL::Exception("DataArrayChar::getIdsInRange : this must have exactly one component !"); + throw INTERP_KERNEL::Exception("DataArrayChar::findIdsInRange : this must have exactly one component !"); const char *cptr=getConstPointer(); - MEDCouplingAutoRefCountObjectPtr ret=DataArrayInt::New(); ret->alloc(0,1); + MCAuto ret=DataArrayInt::New(); ret->alloc(0,1); int nbOfTuples=getNumberOfTuples(); for(int i=0;i=vmin && *cptr throw INTERP_KERNEL::Exception("DataArrayChar::Aggregate : Nb of components mismatch for array aggregation !"); nbt+=(*it)->getNumberOfTuples(); } - MEDCouplingAutoRefCountObjectPtr ret=a[0]->buildEmptySpecializedDAChar(); + MCAuto ret=a[0]->buildEmptySpecializedDAChar(); ret->alloc(nbt,nbOfComp); char *pt=ret->getPointer(); for(it=a.begin();it!=a.end();it++) @@ -1957,32 +549,6 @@ DataArrayChar *DataArrayChar::Meld(const std::vector& arr return ret; } -/*! - * Sets a C array to be used as raw data of \a this. The previously set info - * of components is retained and re-sized. - * For more info see \ref MEDCouplingArraySteps1. - * \param [in] array - the C array to be used as raw data of \a this. - * \param [in] ownership - if \a true, \a array will be deallocated at destruction of \a this. - * \param [in] type - specifies how to deallocate \a array. If \a type == ParaMEDMEM::CPP_DEALLOC, - * \c delete [] \c array; will be called. If \a type == ParaMEDMEM::C_DEALLOC, - * \c free(\c array ) will be called. - * \param [in] nbOfTuple - new number of tuples in \a this. - * \param [in] nbOfCompo - new number of components in \a this. - */ -void DataArrayChar::useArray(const char *array, bool ownership, DeallocType type, int nbOfTuple, int nbOfCompo) -{ - _info_on_compo.resize(nbOfCompo); - _mem.useArray(array,ownership,type,(std::size_t)nbOfTuple*nbOfCompo); - declareAsNew(); -} - -void DataArrayChar::useExternalArrayWithRWAccess(const char *array, int nbOfTuple, int nbOfCompo) -{ - _info_on_compo.resize(nbOfCompo); - _mem.useExternalArrayWithRWAccess(array,(std::size_t)nbOfTuple*nbOfCompo); - declareAsNew(); -} - /*! * Returns a new instance of DataArrayByte. The caller is to delete this array * using decrRef() as it is no more needed. @@ -2002,7 +568,7 @@ DataArrayByteIterator *DataArrayByte::iterator() * \ref MEDCouplingArrayBasicsCopyDeep. * \return DataArrayByte * - a new instance of DataArrayByte. */ -DataArrayByte *DataArrayByte::deepCpy() const +DataArrayByte *DataArrayByte::deepCopy() const { return new DataArrayByte(*this); } @@ -2014,10 +580,10 @@ DataArrayByte *DataArrayByte::deepCpy() const * \return DataArrayByte * - either a new instance of DataArrayByte (if \a dCpy * == \a true) or \a this instance (if \a dCpy == \a false). */ -DataArrayByte *DataArrayByte::performCpy(bool dCpy) const +DataArrayByte *DataArrayByte::performCopyOrIncrRef(bool dCpy) const { if(dCpy) - return deepCpy(); + return deepCopy(); else { incrRef(); @@ -2242,8 +808,8 @@ char DataArrayByteTuple::byteValue() const } /*! - * This method returns a newly allocated instance the caller should dealed with by a ParaMEDMEM::DataArrayByte::decrRef. - * This method performs \b no copy of data. The content is only referenced using ParaMEDMEM::DataArrayByte::useArray with ownership set to \b false. + * This method returns a newly allocated instance the caller should dealed with by a MEDCoupling::DataArrayByte::decrRef. + * This method performs \b no copy of data. The content is only referenced using MEDCoupling::DataArrayByte::useArray with ownership set to \b false. * This method throws an INTERP_KERNEL::Exception is it is impossible to match sizes of \b this that is too say \b nbOfCompo=this->_nb_of_elem and \bnbOfTuples==1 or * \b nbOfCompo=1 and \bnbOfTuples==this->_nb_of_elem. */ @@ -2354,7 +920,7 @@ DataArrayAsciiCharIterator *DataArrayAsciiChar::iterator() * \ref MEDCouplingArrayBasicsCopyDeep. * \return DataArrayAsciiChar * - a new instance of DataArrayAsciiChar. */ -DataArrayAsciiChar *DataArrayAsciiChar::deepCpy() const +DataArrayAsciiChar *DataArrayAsciiChar::deepCopy() const { return new DataArrayAsciiChar(*this); } @@ -2366,10 +932,10 @@ DataArrayAsciiChar *DataArrayAsciiChar::deepCpy() const * \return DataArrayAsciiChar * - either a new instance of DataArrayAsciiChar (if \a dCpy * == \a true) or \a this instance (if \a dCpy == \a false). */ -DataArrayAsciiChar *DataArrayAsciiChar::performCpy(bool dCpy) const +DataArrayAsciiChar *DataArrayAsciiChar::performCopyOrIncrRef(bool dCpy) const { if(dCpy) - return deepCpy(); + return deepCopy(); else { incrRef(); @@ -2580,8 +1146,8 @@ char DataArrayAsciiCharTuple::asciiCharValue() const } /*! - * This method returns a newly allocated instance the caller should dealed with by a ParaMEDMEM::DataArrayAsciiChar::decrRef. - * This method performs \b no copy of data. The content is only referenced using ParaMEDMEM::DataArrayAsciiChar::useArray with ownership set to \b false. + * This method returns a newly allocated instance the caller should dealed with by a MEDCoupling::DataArrayAsciiChar::decrRef. + * This method performs \b no copy of data. The content is only referenced using MEDCoupling::DataArrayAsciiChar::useArray with ownership set to \b false. * This method throws an INTERP_KERNEL::Exception is it is impossible to match sizes of \b this that is too say \b nbOfCompo=this->_nb_of_elem and \bnbOfTuples==1 or * \b nbOfCompo=1 and \bnbOfTuples==this->_nb_of_elem. */