]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
Factorization nearly finished for DataArrays
authorAnthony Geay <anthony.geay@edf.fr>
Fri, 19 Aug 2016 15:49:03 +0000 (17:49 +0200)
committerAnthony Geay <anthony.geay@edf.fr>
Fri, 19 Aug 2016 15:49:03 +0000 (17:49 +0200)
src/MEDCoupling/MEDCouplingMemArray.cxx
src/MEDCoupling/MEDCouplingMemArray.hxx
src/MEDCoupling/MEDCouplingMemArray.txx
src/MEDCoupling/MEDCouplingMemArrayChar.cxx
src/MEDCoupling_Swig/MEDCouplingMemArray.i

index 8459ce8fe5dfac6a83b8e40f4f9c6fd73227f62f..35853e0a220980bb1f4e3a40c7b729716a5f5e1a 100644 (file)
@@ -1208,395 +1208,6 @@ DataArrayDouble *DataArrayDouble::toNoInterlace() const
   return ret;
 }
 
-/*!
- * 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 \c this one.
- * If a permutation reduction is needed, subArray() or selectByTupleId() should be used.
- * For more info on renumbering see \ref numbering.
- *  \param [in] new2Old - C array of length equal to \a this->getNumberOfTuples()
- *     giving a previous position of i-th new value.
- *  \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
-{
-  checkAllocated();
-  int nbTuples=getNumberOfTuples();
-  int nbOfCompo=getNumberOfComponents();
-  MCAuto<DataArrayDouble> ret=DataArrayDouble::New();
-  ret->alloc(nbTuples,nbOfCompo);
-  ret->copyStringInfoFrom(*this);
-  const double *iptr=getConstPointer();
-  double *optr=ret->getPointer();
-  for(int i=0;i<nbTuples;i++)
-    std::copy(iptr+nbOfCompo*new2Old[i],iptr+nbOfCompo*(new2Old[i]+1),optr+i*nbOfCompo);
-  ret->copyStringInfoFrom(*this);
-  return ret.retn();
-}
-
-/*!
- * Returns a shorten and permuted copy of \a this array. The new DataArrayDouble 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 numbering.
- *  \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 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
-{
-  checkAllocated();
-  int nbTuples=getNumberOfTuples();
-  int nbOfCompo=getNumberOfComponents();
-  MCAuto<DataArrayDouble> ret=DataArrayDouble::New();
-  ret->alloc(newNbOfTuple,nbOfCompo);
-  const double *iptr=getConstPointer();
-  double *optr=ret->getPointer();
-  for(int i=0;i<nbTuples;i++)
-    {
-      int w=old2New[i];
-      if(w>=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 DataArrayDouble 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 numbering.
- *  \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 DataArrayDouble * - the new instance of DataArrayDouble that the caller
- *          is to delete using decrRef() as it is no more needed.
- */
-DataArrayDouble *DataArrayDouble::selectByTupleId(const int *new2OldBg, const int *new2OldEnd) const
-{
-  checkAllocated();
-  MCAuto<DataArrayDouble> ret=DataArrayDouble::New();
-  int nbComp=getNumberOfComponents();
-  ret->alloc((int)std::distance(new2OldBg,new2OldEnd),nbComp);
-  ret->copyStringInfoFrom(*this);
-  double *pt=ret->getPointer();
-  const double *srcPt=getConstPointer();
-  int i=0;
-  for(const int *w=new2OldBg;w!=new2OldEnd;w++,i++)
-    std::copy(srcPt+(*w)*nbComp,srcPt+((*w)+1)*nbComp,pt+i*nbComp);
-  ret->copyStringInfoFrom(*this);
-  return ret.retn();
-}
-
-DataArrayDouble *DataArrayDouble::selectByTupleId(const DataArrayInt & di) const
-{
-  return selectByTupleId(di.getConstPointer(), di.getConstPointer()+di.getNumberOfTuples());
-}
-
-/*!
- * Returns a shorten and permuted copy of \a this array. The new DataArrayDouble 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 numbering.
- *  \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 DataArrayDouble * - the new instance of DataArrayDouble that the caller
- *          is to delete using decrRef() as it is no more needed.
- *  \throw If \a new2OldEnd - \a new2OldBg > \a this->getNumberOfTuples().
- */
-DataArrayDouble *DataArrayDouble::selectByTupleIdSafe(const int *new2OldBg, const int *new2OldEnd) const
-{
-  checkAllocated();
-  MCAuto<DataArrayDouble> ret=DataArrayDouble::New();
-  int nbComp=getNumberOfComponents();
-  int oldNbOfTuples=getNumberOfTuples();
-  ret->alloc((int)std::distance(new2OldBg,new2OldEnd),nbComp);
-  ret->copyStringInfoFrom(*this);
-  double *pt=ret->getPointer();
-  const double *srcPt=getConstPointer();
-  int i=0;
-  for(const int *w=new2OldBg;w!=new2OldEnd;w++,i++)
-    if(*w>=0 && *w<oldNbOfTuples)
-      std::copy(srcPt+(*w)*nbComp,srcPt+((*w)+1)*nbComp,pt+i*nbComp);
-    else
-      throw INTERP_KERNEL::Exception("DataArrayDouble::selectByTupleIdSafe : some ids has been detected to be out of [0,this->getNumberOfTuples) !");
-  ret->copyStringInfoFrom(*this);
-  return ret.retn();
-}
-
-/*!
- * Returns a shorten copy of \a this array. The new DataArrayDouble 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 numbering.
- *  \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 DataArrayDouble * - the new instance of DataArrayDouble that the caller
- *          is to delete using decrRef() as it is no more needed.
- *  \sa DataArrayDouble::subArray.
- */
-DataArrayDouble *DataArrayDouble::selectByTupleIdSafeSlice(int bg, int end2, int step) const
-{
-  checkAllocated();
-  MCAuto<DataArrayDouble> ret=DataArrayDouble::New();
-  int nbComp=getNumberOfComponents();
-  int newNbOfTuples=GetNumberOfItemGivenBESRelative(bg,end2,step,"DataArrayDouble::selectByTupleIdSafeSlice : ");
-  ret->alloc(newNbOfTuples,nbComp);
-  double *pt=ret->getPointer();
-  const double *srcPt=getConstPointer()+bg*nbComp;
-  for(int i=0;i<newNbOfTuples;i++,srcPt+=step*nbComp)
-    std::copy(srcPt,srcPt+nbComp,pt+i*nbComp);
-  ret->copyStringInfoFrom(*this);
-  return ret.retn();
-}
-
-/*!
- * Returns a shorten copy of \a this array. The new DataArrayDouble contains ranges
- * of tuples specified by \a ranges parameter.
- * For more info on renumbering see \ref numbering.
- *  \param [in] ranges - std::vector of std::pair's each of which defines a range
- *              of tuples in [\c begin,\c end) format.
- *  \return DataArrayDouble * - the new instance of DataArrayDouble that the caller
- *          is to delete using decrRef() as it is no more needed.
- *  \throw If \a end < \a begin.
- *  \throw If \a end > \a this->getNumberOfTuples().
- *  \throw If \a this is not allocated.
- */
-DataArray *DataArrayDouble::selectByTupleRanges(const std::vector<std::pair<int,int> >& ranges) const
-{
-  checkAllocated();
-  int nbOfComp=getNumberOfComponents();
-  int nbOfTuplesThis=getNumberOfTuples();
-  if(ranges.empty())
-    {
-      DataArrayDouble *ret=DataArrayDouble::New();
-      ret->alloc(0,nbOfComp);
-      ret->copyStringInfoFrom(*this);
-      return ret;
-    }
-  int ref=ranges.front().first;
-  int nbOfTuples=0;
-  bool isIncreasing=true;
-  for(std::vector<std::pair<int,int> >::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 << "DataArrayDouble::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 << "DataArrayDouble::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 deepCopy();
-  MCAuto<DataArrayDouble> ret=DataArrayDouble::New();
-  ret->alloc(nbOfTuples,nbOfComp);
-  ret->copyStringInfoFrom(*this);
-  const double *src=getConstPointer();
-  double *work=ret->getPointer();
-  for(std::vector<std::pair<int,int> >::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 shorten copy of \a this array. The new DataArrayDouble 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 selectByTupleIdSafeSlice().
- *  \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 DataArrayDouble * - the new instance of DataArrayDouble 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 DataArrayDouble::selectByTupleIdSafeSlice
- */
-DataArrayDouble *DataArrayDouble::subArray(int tupleIdBg, int tupleIdEnd) const
-{
-  checkAllocated();
-  int nbt=getNumberOfTuples();
-  if(tupleIdBg<0)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::subArray : The tupleIdBg parameter must be greater than 0 !");
-  if(tupleIdBg>nbt)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::subArray : The tupleIdBg parameter is greater than number of tuples !");
-  int trueEnd=tupleIdEnd;
-  if(tupleIdEnd!=-1)
-    {
-      if(tupleIdEnd>nbt)
-        throw INTERP_KERNEL::Exception("DataArrayDouble::subArray : The tupleIdBg parameter is greater or equal than number of tuples !");
-    }
-  else
-    trueEnd=nbt;
-  int nbComp=getNumberOfComponents();
-  MCAuto<DataArrayDouble> ret=DataArrayDouble::New();
-  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 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.
- */
-DataArrayDouble *DataArrayDouble::changeNbOfComponents(int newNbOfComp, double dftValue) const
-{
-  checkAllocated();
-  MCAuto<DataArrayDouble> ret=DataArrayDouble::New();
-  ret->alloc(getNumberOfTuples(),newNbOfComp);
-  const double *oldc=getConstPointer();
-  double *nc=ret->getPointer();
-  int nbOfTuples=getNumberOfTuples();
-  int oldNbOfComp=getNumberOfComponents();
-  int dim=std::min(oldNbOfComp,newNbOfComp);
-  for(int i=0;i<nbOfTuples;i++)
-    {
-      int j=0;
-      for(;j<dim;j++)
-        nc[newNbOfComp*i+j]=oldc[i*oldNbOfComp+j];
-      for(;j<newNbOfComp;j++)
-        nc[newNbOfComp*i+j]=dftValue;
-    }
-  ret->setName(getName());
-  for(int i=0;i<dim;i++)
-    ret->setInfoOnComponent(i,getInfoOnComponent(i));
-  ret->setName(getName());
-  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)
-{
-  checkAllocated();
-  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<int>::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();
-}
-
-/*!
- * Changes the number of components within \a this array to be equal to its number
- * 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.
- *  \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()
-{
-  checkAllocated();
-  int nbOfTuples=getNumberOfTuples();
-  rearrange(nbOfTuples);
-}
-
-/*!
- * Returns a copy of \a this array composed of selected components.
- * The new DataArrayDouble 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 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.
- *  \throw If a component index (\a i) is not valid: 
- *         \a i < 0 || \a i >= \a this->getNumberOfComponents().
- *
- *  \if ENABLE_EXAMPLES
- *  \ref py_mcdataarraydouble_KeepSelectedComponents "Here is a Python example".
- *  \endif
- */
-DataArrayDouble *DataArrayDouble::keepSelectedComponents(const std::vector<int>& compoIds) const
-{
-  checkAllocated();
-  MCAuto<DataArrayDouble> ret(DataArrayDouble::New());
-  std::size_t newNbOfCompo=compoIds.size();
-  int oldNbOfCompo=getNumberOfComponents();
-  for(std::vector<int>::const_iterator it=compoIds.begin();it!=compoIds.end();it++)
-    if((*it)<0 || (*it)>=oldNbOfCompo)
-      {
-        std::ostringstream oss; oss << "DataArrayDouble::keepSelectedComponents : invalid requested component : " << *it << " whereas it should be in [0," << oldNbOfCompo << ") !";
-        throw INTERP_KERNEL::Exception(oss.str().c_str());
-      }
-  int nbOfTuples=getNumberOfTuples();
-  ret->alloc(nbOfTuples,(int)newNbOfCompo);
-  ret->copyPartOfStringInfoFrom(*this,compoIds);
-  const double *oldc=getConstPointer();
-  double *nc=ret->getPointer();
-  for(int i=0;i<nbOfTuples;i++)
-    for(std::size_t j=0;j<newNbOfCompo;j++,nc++)
-      *nc=oldc[i*oldNbOfCompo+compoIds[j]];
-  return ret.retn();
-}
-
 /*!
  * Appends components of another array to components of \a this one, tuple by tuple.
  * So that the number of tuples of \a this array remains the same and the number of 
@@ -1927,728 +1538,43 @@ DataArrayInt *DataArrayDouble::computeNbOfInteractionsWith(const DataArrayDouble
 DataArrayDouble *DataArrayDouble::getDifferentValues(double prec, int limitTupleId) const
 {
   checkAllocated();
-  DataArrayInt *c0=0,*cI0=0;
-  findCommonTuples(prec,limitTupleId,c0,cI0);
-  MCAuto<DataArrayInt> c(c0),cI(cI0);
-  int newNbOfTuples=-1;
-  MCAuto<DataArrayInt> o2n=DataArrayInt::ConvertIndexArrayToO2N(getNumberOfTuples(),c0->begin(),cI0->begin(),cI0->end(),newNbOfTuples);
-  return renumberAndReduce(o2n->getConstPointer(),newNbOfTuples);
-}
-
-/*!
- * Copy all components in a specified order from another DataArrayDouble.
- * 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.
- *  \param [in] compoIds - sequence of zero based indices of components, data of which is
- *              to be copied.
- *  \throw If \a a is NULL.
- *  \throw If \a compoIds.size() != \a a->getNumberOfComponents().
- *  \throw If \a compoIds[i] < 0 or \a compoIds[i] > \a this->getNumberOfComponents().
- *
- *  \if ENABLE_EXAMPLES
- *  \ref py_mcdataarraydouble_setselectedcomponents "Here is a Python example".
- *  \endif
- */
-void DataArrayDouble::setSelectedComponents(const DataArrayDouble *a, const std::vector<int>& compoIds)
-{
-  if(!a)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::setSelectedComponents : input DataArrayDouble is NULL !");
-  checkAllocated();
-  copyPartOfStringInfoFrom2(compoIds,*a);
-  std::size_t partOfCompoSz=compoIds.size();
-  int nbOfCompo=getNumberOfComponents();
-  int nbOfTuples=std::min(getNumberOfTuples(),a->getNumberOfTuples());
-  const double *ac=a->getConstPointer();
-  double *nc=getPointer();
-  for(int i=0;i<nbOfTuples;i++)
-    for(std::size_t j=0;j<partOfCompoSz;j++,ac++)
-      nc[nbOfCompo*i+compoIds[j]]=*ac;
-}
-
-/*!
- * Copy all values from another DataArrayDouble into specified tuples and components
- * of \a this array. Textual data is not copied.
- * The tree parameters defining set of indices of tuples and components are similar to
- * the tree parameters of the Python function \c range(\c start,\c stop,\c step).
- *  \param [in] a - the array to copy values from.
- *  \param [in] bgTuples - index of the first tuple of \a this array to assign values to.
- *  \param [in] endTuples - index of the tuple before which the tuples to assign to
- *              are located.
- *  \param [in] stepTuples - index increment to get index of the next tuple to assign to.
- *  \param [in] bgComp - index of the first component of \a this array to assign values 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 - if \a true (by default), then \a a->getNumberOfComponents() 
- *              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_mcdataarraydouble_setpartofvalues1 "Here is a Python example".
- *  \endif
- */
-void DataArrayDouble::setPartOfValues1(const DataArrayDouble *a, int bgTuples, int endTuples, int stepTuples, int bgComp, int endComp, int stepComp, bool strictCompoCompare)
-{
-  if(!a)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::setPartOfValues1 : input DataArrayDouble is NULL !");
-  const char msg[]="DataArrayDouble::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;
-    }
-  const double *srcPt=a->getConstPointer();
-  double *pt=getPointer()+bgTuples*nbComp+bgComp;
-  if(assignTech)
-    {
-      for(int i=0;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
-        for(int j=0;j<newNbOfComp;j++,srcPt++)
-          pt[j*stepComp]=*srcPt;
-    }
-  else
-    {
-      for(int i=0;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
-        {
-          const double *srcPt2=srcPt;
-          for(int j=0;j<newNbOfComp;j++,srcPt2++)
-            pt[j*stepComp]=*srcPt2;
-        }
-    }
-}
-
-/*!
- * Assign a given value to values at specified tuples and components of \a this array.
- * The tree parameters defining set of indices of tuples and components are similar to
- * the tree parameters of the Python function \c range(\c start,\c stop,\c step)..
- *  \param [in] a - the value to assign.
- *  \param [in] bgTuples - index of the first tuple of \a this array to assign to.
- *  \param [in] endTuples - index of the tuple before which the tuples to assign to
- *              are located.
- *  \param [in] stepTuples - index increment to get index of the next tuple to assign to.
- *  \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 parameters specifying tuples and components to assign to, do not give a
- *            non-empty range of increasing indices or indices are out of a valid range
- *            for \c this array.
- *
- *  \if ENABLE_EXAMPLES
- *  \ref py_mcdataarraydouble_setpartofvaluessimple1 "Here is a Python example".
- *  \endif
- */
-void DataArrayDouble::setPartOfValuesSimple1(double a, int bgTuples, int endTuples, int stepTuples, int bgComp, int endComp, int stepComp)
-{
-  const char msg[]="DataArrayDouble::setPartOfValuesSimple1";
-  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");
-  double *pt=getPointer()+bgTuples*nbComp+bgComp;
-  for(int i=0;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
-    for(int j=0;j<newNbOfComp;j++)
-      pt[j*stepComp]=a;
-}
-
-/*!
- * Copy all values from another DataArrayDouble (\a a) into specified tuples and 
- * components of \a this array. Textual data is not copied.
- * The tuples and components to assign to are defined by C arrays of indices.
- * 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 <em>(pi)</em> 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 <em>(pi)</em> 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 <em>bgTuples / bgComp</em> is
- *         out of a valid range for \a this array.
- *  \throw In the first *mode of usage*, if <em>strictCompoCompare == true </em> and
- *         if <em> a->getNumberOfComponents() != (endComp - bgComp) </em>.
- *  \throw In the second *mode of usage*, if \a a->getNumberOfTuples() != 1 or
- *         <em> a->getNumberOfComponents() != (endComp - bgComp)</em>.
- *
- *  \if ENABLE_EXAMPLES
- *  \ref py_mcdataarraydouble_setpartofvalues2 "Here is a Python example".
- *  \endif
- */
-void DataArrayDouble::setPartOfValues2(const DataArrayDouble *a, const int *bgTuples, const int *endTuples, const int *bgComp, const int *endComp, bool strictCompoCompare)
-{
-  if(!a)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::setPartOfValues2 : input DataArrayDouble is NULL !");
-  const char msg[]="DataArrayDouble::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;
-    }
-  double *pt=getPointer();
-  const double *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 double *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 <em>bgTuples / bgComp</em> is
- *         out of a valid range for \a this array.
- *
- *  \if ENABLE_EXAMPLES
- *  \ref py_mcdataarraydouble_setpartofvaluessimple2 "Here is a Python example".
- *  \endif
- */
-void DataArrayDouble::setPartOfValuesSimple2(double 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");
-  double *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 DataArrayDouble (\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 <em>(pi)</em> 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 <em>strictCompoCompare == true </em> and
- *         if <em> a->getNumberOfComponents()</em> is unequal to the number of components
- *         defined by <em>(bgComp,endComp,stepComp)</em>.
- *  \throw In the second *mode of usage*, if \a a->getNumberOfTuples() != 1 or
- *         <em> a->getNumberOfComponents()</em> is unequal to the number of components
- *         defined by <em>(bgComp,endComp,stepComp)</em>.
- *  \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 \c this array.
- *
- *  \if ENABLE_EXAMPLES
- *  \ref py_mcdataarraydouble_setpartofvalues3 "Here is a Python example".
- *  \endif
- */
-void DataArrayDouble::setPartOfValues3(const DataArrayDouble *a, const int *bgTuples, const int *endTuples, int bgComp, int endComp, int stepComp, bool strictCompoCompare)
-{
-  if(!a)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::setPartOfValues3 : input DataArrayDouble is NULL !");
-  const char msg[]="DataArrayDouble::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;
-    }
-  double *pt=getPointer()+bgComp;
-  const double *srcPt=a->getConstPointer();
-  if(assignTech)
-    {
-      for(const int *w=bgTuples;w!=endTuples;w++)
-        for(int j=0;j<newNbOfComp;j++,srcPt++)
-          {
-            DataArray::CheckValueInRange(nbOfTuples,*w,"invalid tuple id");
-            pt[(std::size_t)(*w)*nbComp+j*stepComp]=*srcPt;
-          }
-    }
-  else
-    {
-      for(const int *w=bgTuples;w!=endTuples;w++)
-        {
-          const double *srcPt2=srcPt;
-          for(int j=0;j<newNbOfComp;j++,srcPt2++)
-            {
-              DataArray::CheckValueInRange(nbOfTuples,*w,"invalid tuple id");
-              pt[(std::size_t)(*w)*nbComp+j*stepComp]=*srcPt2;
-            }
-        }
-    }
-}
-
-/*!
- * Assign a given value to values at specified tuples and components of \a this array.
- * 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).
- *  \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 <em>(pi)</em> 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 \c this array.
- *
- *  \if ENABLE_EXAMPLES
- *  \ref py_mcdataarraydouble_setpartofvaluessimple3 "Here is a Python example".
- *  \endif
- */
-void DataArrayDouble::setPartOfValuesSimple3(double a, const int *bgTuples, const int *endTuples, int bgComp, int endComp, int stepComp)
-{
-  const char msg[]="DataArrayDouble::setPartOfValuesSimple3";
-  checkAllocated();
-  int newNbOfComp=DataArray::GetNumberOfItemGivenBES(bgComp,endComp,stepComp,msg);
-  int nbComp=getNumberOfComponents();
-  int nbOfTuples=getNumberOfTuples();
-  DataArray::CheckValueInRangeEx(nbComp,bgComp,endComp,"invalid component value");
-  double *pt=getPointer()+bgComp;
-  for(const int *w=bgTuples;w!=endTuples;w++)
-    for(int j=0;j<newNbOfComp;j++)
-      {
-        DataArray::CheckValueInRange(nbOfTuples,*w,"invalid tuple id");
-        pt[(std::size_t)(*w)*nbComp+j*stepComp]=a;
-      }
-}
-
-/*!
- * Copy all values from another DataArrayDouble into specified tuples and components
- * of \a this array. Textual data is not copied.
- * The tree parameters defining set of indices of tuples and components are similar to
- * the tree parameters of the Python function \c range(\c start,\c stop,\c step).
- *  \param [in] a - the array to copy values from.
- *  \param [in] bgTuples - index of the first tuple of \a this array to assign values to.
- *  \param [in] endTuples - index of the tuple before which the tuples to assign to
- *              are located.
- *  \param [in] stepTuples - index increment to get index of the next tuple to assign to.
- *  \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.
- *  \param [in] strictCompoCompare - if \a true (by default), then \a a->getNumberOfComponents() 
- *              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)).
- *
- */
-void DataArrayDouble::setPartOfValues4(const DataArrayDouble *a, int bgTuples, int endTuples, int stepTuples, const int *bgComp, const int *endComp, bool strictCompoCompare)
-{
-  if(!a)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::setPartOfValues4 : input DataArrayDouble is NULL !");
-  const char msg[]="DataArrayDouble::setPartOfValues4";
-  checkAllocated();
-  a->checkAllocated();
-  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 double *srcPt=a->getConstPointer();
-  double *pt=getPointer()+bgTuples*nbComp;
-  if(assignTech)
-    {
-      for(int i=0;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
-        for(const int *z=bgComp;z!=endComp;z++,srcPt++)
-          pt[*z]=*srcPt;
-    }
-  else
-    {
-      for(int i=0;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
-        {
-          const double *srcPt2=srcPt;
-          for(const int *z=bgComp;z!=endComp;z++,srcPt2++)
-            pt[*z]=*srcPt2;
-        }
-    }
-}
-
-void DataArrayDouble::setPartOfValuesSimple4(double a, int bgTuples, int endTuples, int stepTuples, const int *bgComp, const int *endComp)
-{
-  const char msg[]="DataArrayDouble::setPartOfValuesSimple4";
-  checkAllocated();
-  int newNbOfTuples=DataArray::GetNumberOfItemGivenBES(bgTuples,endTuples,stepTuples,msg);
-  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");
-  double *pt=getPointer()+bgTuples*nbComp;
-  for(int i=0;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
-    for(const int *z=bgComp;z!=endComp;z++)
-      pt[*z]=a;
-}
-
-/*!
- * Copy some tuples from another DataArrayDouble into specified tuples
- * of \a this array. Textual data is not copied. Both arrays must have equal number of
- * components.
- * Both the tuples to assign and the tuples to assign to are defined by a DataArrayInt.
- * All components of selected tuples are copied.
- *  \param [in] a - the array to copy values from.
- *  \param [in] tuplesSelec - the array specifying both source tuples of \a a and
- *              target tuples of \a this. \a tuplesSelec has two components, and the
- *              first component specifies index of the source tuple and the second
- *              one specifies index of the target tuple.
- *  \throw If \a this is not allocated.
- *  \throw If \a a is NULL.
- *  \throw If \a a is not allocated.
- *  \throw If \a tuplesSelec is NULL.
- *  \throw If \a tuplesSelec is not allocated.
- *  \throw If <em>this->getNumberOfComponents() != a->getNumberOfComponents()</em>.
- *  \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 DataArrayDouble::setPartOfValuesAdv(const DataArrayDouble *a, const DataArrayInt *tuplesSelec)
-{
-  if(!a || !tuplesSelec)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::setPartOfValuesAdv : input DataArrayDouble is NULL !");
-  checkAllocated();
-  a->checkAllocated();
-  tuplesSelec->checkAllocated();
-  int nbOfComp=getNumberOfComponents();
-  if(nbOfComp!=a->getNumberOfComponents())
-    throw INTERP_KERNEL::Exception("DataArrayDouble::setPartOfValuesAdv : This and a do not have the same number of components !");
-  if(tuplesSelec->getNumberOfComponents()!=2)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::setPartOfValuesAdv : Expecting to have a tuple selector DataArrayInt instance with exactly 2 components !");
-  int thisNt=getNumberOfTuples();
-  int aNt=a->getNumberOfTuples();
-  double *valsToSet=getPointer();
-  const double *valsSrc=a->getConstPointer();
-  for(const int *tuple=tuplesSelec->begin();tuple!=tuplesSelec->end();tuple+=2)
-    {
-      if(tuple[1]>=0 && tuple[1]<aNt)
-        {
-          if(tuple[0]>=0 && tuple[0]<thisNt)
-            std::copy(valsSrc+nbOfComp*tuple[1],valsSrc+nbOfComp*(tuple[1]+1),valsToSet+nbOfComp*tuple[0]);
-          else
-            {
-              std::ostringstream oss; oss << "DataArrayDouble::setPartOfValuesAdv : Tuple #" << std::distance(tuplesSelec->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 << "DataArrayDouble::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 DataArrayDouble (\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 DataArrayInt.
- * 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 a 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 <em>this->getNumberOfComponents() != aBase->getNumberOfComponents()</em>.
- *  \throw If \a tuplesSelec->getNumberOfComponents() != 1.
- *  \throw If <em>tupleIdStart + tuplesSelec->getNumberOfTuples() > this->getNumberOfTuples().</em>
- *  \throw If any tuple index given by \a tuplesSelec is out of a valid range for 
- *         \a aBase array.
- */
-void DataArrayDouble::setContigPartOfSelectedValues(int tupleIdStart, const DataArray *aBase, const DataArrayInt *tuplesSelec)
-{
-  if(!aBase || !tuplesSelec)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::setContigPartOfSelectedValues : input DataArray is NULL !");
-  const DataArrayDouble *a=dynamic_cast<const DataArrayDouble *>(aBase);
-  if(!a)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::setContigPartOfSelectedValues : input DataArray aBase is not a DataArrayDouble !");
-  checkAllocated();
-  a->checkAllocated();
-  tuplesSelec->checkAllocated();
-  int nbOfComp=getNumberOfComponents();
-  if(nbOfComp!=a->getNumberOfComponents())
-    throw INTERP_KERNEL::Exception("DataArrayDouble::setContigPartOfSelectedValues : This and a do not have the same number of components !");
-  if(tuplesSelec->getNumberOfComponents()!=1)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::setContigPartOfSelectedValues : Expecting to have a tuple selector DataArrayInt instance with exactly 1 component !");
-  int thisNt=getNumberOfTuples();
-  int aNt=a->getNumberOfTuples();
-  int nbOfTupleToWrite=tuplesSelec->getNumberOfTuples();
-  double *valsToSet=getPointer()+tupleIdStart*nbOfComp;
-  if(tupleIdStart+nbOfTupleToWrite>thisNt)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::setContigPartOfSelectedValues : invalid number range of values to write !");
-  const double *valsSrc=a->getConstPointer();
-  for(const int *tuple=tuplesSelec->begin();tuple!=tuplesSelec->end();tuple++,valsToSet+=nbOfComp)
-    {
-      if(*tuple>=0 && *tuple<aNt)
-        {
-          std::copy(valsSrc+nbOfComp*(*tuple),valsSrc+nbOfComp*(*tuple+1),valsToSet);
-        }
-      else
-        {
-          std::ostringstream oss; oss << "DataArrayDouble::setContigPartOfSelectedValues : Tuple #" << std::distance(tuplesSelec->begin(),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 DataArrayDouble (\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 <em>this->getNumberOfComponents() != aBase->getNumberOfComponents()</em>.
- *  \throw If <em>tupleIdStart + len(range(bg,end2,step)) > this->getNumberOfTuples().</em>
- *  \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 DataArrayDouble::setContigPartOfSelectedValuesSlice(int tupleIdStart, const DataArray *aBase, int bg, int end2, int step)
-{
-  if(!aBase)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::setContigPartOfSelectedValuesSlice : input DataArray is NULL !");
-  const DataArrayDouble *a=dynamic_cast<const DataArrayDouble *>(aBase);
-  if(!a)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::setContigPartOfSelectedValuesSlice : input DataArray aBase is not a DataArrayDouble !");
-  checkAllocated();
-  a->checkAllocated();
-  int nbOfComp=getNumberOfComponents();
-  const char msg[]="DataArrayDouble::setContigPartOfSelectedValuesSlice";
-  int nbOfTupleToWrite=DataArray::GetNumberOfItemGivenBES(bg,end2,step,msg);
-  if(nbOfComp!=a->getNumberOfComponents())
-    throw INTERP_KERNEL::Exception("DataArrayDouble::setContigPartOfSelectedValuesSlice : This and a do not have the same number of components !");
-  int thisNt=getNumberOfTuples();
-  int aNt=a->getNumberOfTuples();
-  double *valsToSet=getPointer()+tupleIdStart*nbOfComp;
-  if(tupleIdStart+nbOfTupleToWrite>thisNt)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::setContigPartOfSelectedValuesSlice : invalid number range of values to write !");
-  if(end2>aNt)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::setContigPartOfSelectedValuesSlice : invalid range of values to read !");
-  const double *valsSrc=a->getConstPointer()+bg*nbOfComp;
-  for(int i=0;i<nbOfTupleToWrite;i++,valsToSet+=nbOfComp,valsSrc+=step*nbOfComp)
-    {
-      std::copy(valsSrc,valsSrc+nbOfComp,valsToSet);
-    }
-}
-
-/*!
- * Returns the first value of \a this. 
- *  \return double - 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.
- */
-double DataArrayDouble::front() const
-{
-  checkAllocated();
-  if(getNumberOfComponents()!=1)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::front : number of components not equal to one !");
-  int nbOfTuples=getNumberOfTuples();
-  if(nbOfTuples<1)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::front : number of tuples must be >= 1 !");
-  return *(getConstPointer());
+  DataArrayInt *c0=0,*cI0=0;
+  findCommonTuples(prec,limitTupleId,c0,cI0);
+  MCAuto<DataArrayInt> c(c0),cI(cI0);
+  int newNbOfTuples=-1;
+  MCAuto<DataArrayInt> o2n=DataArrayInt::ConvertIndexArrayToO2N(getNumberOfTuples(),c0->begin(),cI0->begin(),cI0->end(),newNbOfTuples);
+  return renumberAndReduce(o2n->getConstPointer(),newNbOfTuples);
 }
 
 /*!
- * Returns the last value of \a this. 
- *  \return double - 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.
+ * Copy all components in a specified order from another DataArrayDouble.
+ * 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.
+ *  \param [in] compoIds - sequence of zero based indices of components, data of which is
+ *              to be copied.
+ *  \throw If \a a is NULL.
+ *  \throw If \a compoIds.size() != \a a->getNumberOfComponents().
+ *  \throw If \a compoIds[i] < 0 or \a compoIds[i] > \a this->getNumberOfComponents().
+ *
+ *  \if ENABLE_EXAMPLES
+ *  \ref py_mcdataarraydouble_setselectedcomponents "Here is a Python example".
+ *  \endif
  */
-double DataArrayDouble::back() const
+void DataArrayDouble::setSelectedComponents(const DataArrayDouble *a, const std::vector<int>& compoIds)
 {
+  if(!a)
+    throw INTERP_KERNEL::Exception("DataArrayDouble::setSelectedComponents : input DataArrayDouble is NULL !");
   checkAllocated();
-  if(getNumberOfComponents()!=1)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::back : number of components not equal to one !");
-  int nbOfTuples=getNumberOfTuples();
-  if(nbOfTuples<1)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::back : number of tuples must be >= 1 !");
-  return *(getConstPointer()+nbOfTuples-1);
+  copyPartOfStringInfoFrom2(compoIds,*a);
+  std::size_t partOfCompoSz=compoIds.size();
+  int nbOfCompo=getNumberOfComponents();
+  int nbOfTuples=std::min(getNumberOfTuples(),a->getNumberOfTuples());
+  const double *ac=a->getConstPointer();
+  double *nc=getPointer();
+  for(int i=0;i<nbOfTuples;i++)
+    for(std::size_t j=0;j<partOfCompoSz;j++,ac++)
+      nc[nbOfCompo*i+compoIds[j]]=*ac;
 }
 
 void DataArrayDouble::SetArrayIn(DataArrayDouble *newArray, DataArrayDouble* &arrayToSet)
@@ -2833,40 +1759,6 @@ void DataArrayDouble::recenterForMaxPrecision(double eps)
     }
 }
 
-/*!
- * 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 double - the maximal value among all values of \a this array.
- *  \throw If \a this->getNumberOfComponents() != 1
- *  \throw If \a this->getNumberOfTuples() < 1
- */
-double DataArrayDouble::getMaxValue(int& tupleId) const
-{
-  checkAllocated();
-  if(getNumberOfComponents()!=1)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::getMaxValue : must be applied on DataArrayDouble with only one component, you can call 'rearrange' method before or call 'getMaxValueInArray' method !");
-  int nbOfTuples=getNumberOfTuples();
-  if(nbOfTuples<=0)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::getMaxValue : array exists but number of tuples must be > 0 !");
-  const double *vals=getConstPointer();
-  const double *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 double - the maximal value among all values of \a this array.
- *  \throw If \a this is not allocated.
- */
-double DataArrayDouble::getMaxValueInArray() const
-{
-  checkAllocated();
-  const double *loc=std::max_element(begin(),end());
-  return *loc;
-}
-
 /*!
  * Returns the maximal value and all its locations within \a this one-dimensional array.
  *  \param [out] tupleIds - a new instance of DataArrayInt containg indices of
@@ -2885,40 +1777,6 @@ double DataArrayDouble::getMaxValue2(DataArrayInt*& tupleIds) const
   return ret;
 }
 
-/*!
- * 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 double - the minimal value among all values of \a this array.
- *  \throw If \a this->getNumberOfComponents() != 1
- *  \throw If \a this->getNumberOfTuples() < 1
- */
-double DataArrayDouble::getMinValue(int& tupleId) const
-{
-  checkAllocated();
-  if(getNumberOfComponents()!=1)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::getMinValue : must be applied on DataArrayDouble with only one component, you can call 'rearrange' method before call 'getMinValueInArray' method !");
-  int nbOfTuples=getNumberOfTuples();
-  if(nbOfTuples<=0)
-    throw INTERP_KERNEL::Exception("DataArrayDouble::getMinValue : array exists but number of tuples must be > 0 !");
-  const double *vals=getConstPointer();
-  const double *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 double - the minimal value among all values of \a this array.
- *  \throw If \a this is not allocated.
- */
-double DataArrayDouble::getMinValueInArray() const
-{
-  checkAllocated();
-  const double *loc=std::min_element(begin(),end());
-  return *loc;
-}
-
 /*!
  * Returns the minimal value and all its locations within \a this one-dimensional array.
  *  \param [out] tupleIds - a new instance of DataArrayInt containg indices of
@@ -6580,230 +5438,6 @@ DataArrayInt *DataArrayInt::toNoInterlace() const
   return ret;
 }
 
-/*!
- * 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 \c this one.
- * If a permutation reduction is needed, subArray() or selectByTupleId() should be used.
- * For more info on renumbering see \ref numbering.
- *  \param [in] new2Old - C array of length equal to \a this->getNumberOfTuples()
- *     giving a previous position of i-th new value.
- *  \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
-{
-  checkAllocated();
-  int nbTuples=getNumberOfTuples();
-  int nbOfCompo=getNumberOfComponents();
-  MCAuto<DataArrayInt> ret=DataArrayInt::New();
-  ret->alloc(nbTuples,nbOfCompo);
-  ret->copyStringInfoFrom(*this);
-  const int *iptr=getConstPointer();
-  int *optr=ret->getPointer();
-  for(int i=0;i<nbTuples;i++)
-    std::copy(iptr+nbOfCompo*new2Old[i],iptr+nbOfCompo*(new2Old[i]+1),optr+nbOfCompo*i);
-  ret->copyStringInfoFrom(*this);
-  return ret.retn();
-}
-
-/*!
- * Returns a shorten and permuted copy of \a this array. The new DataArrayInt 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 numbering.
- *  \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 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
-{
-  checkAllocated();
-  int nbTuples=getNumberOfTuples();
-  int nbOfCompo=getNumberOfComponents();
-  MCAuto<DataArrayInt> ret=DataArrayInt::New();
-  ret->alloc(newNbOfTuple,nbOfCompo);
-  const int *iptr=getConstPointer();
-  int *optr=ret->getPointer();
-  for(int i=0;i<nbTuples;i++)
-    {
-      int w=old2New[i];
-      if(w>=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 DataArrayInt 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 numbering.
- *  \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 DataArrayInt * - the new instance of DataArrayInt that the caller
- *          is to delete using decrRef() as it is no more needed.
- */
-DataArrayInt *DataArrayInt::selectByTupleId(const int *new2OldBg, const int *new2OldEnd) const
-{
-  checkAllocated();
-  MCAuto<DataArrayInt> ret=DataArrayInt::New();
-  int nbComp=getNumberOfComponents();
-  ret->alloc((int)std::distance(new2OldBg,new2OldEnd),nbComp);
-  ret->copyStringInfoFrom(*this);
-  int *pt=ret->getPointer();
-  const int *srcPt=getConstPointer();
-  int i=0;
-  for(const int *w=new2OldBg;w!=new2OldEnd;w++,i++)
-    std::copy(srcPt+(*w)*nbComp,srcPt+((*w)+1)*nbComp,pt+i*nbComp);
-  ret->copyStringInfoFrom(*this);
-  return ret.retn();
-}
-
-/*!
- * Returns a shorten and permuted copy of \a this array. The new DataArrayInt 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 numbering.
- *  \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 DataArrayInt * - the new instance of DataArrayInt that the caller
- *          is to delete using decrRef() as it is no more needed.
- *  \throw If \a new2OldEnd - \a new2OldBg > \a this->getNumberOfTuples().
- */
-DataArrayInt *DataArrayInt::selectByTupleIdSafe(const int *new2OldBg, const int *new2OldEnd) const
-{
-  checkAllocated();
-  MCAuto<DataArrayInt> ret=DataArrayInt::New();
-  int nbComp=getNumberOfComponents();
-  int oldNbOfTuples=getNumberOfTuples();
-  ret->alloc((int)std::distance(new2OldBg,new2OldEnd),nbComp);
-  ret->copyStringInfoFrom(*this);
-  int *pt=ret->getPointer();
-  const int *srcPt=getConstPointer();
-  int i=0;
-  for(const int *w=new2OldBg;w!=new2OldEnd;w++,i++)
-    if(*w>=0 && *w<oldNbOfTuples)
-      std::copy(srcPt+(*w)*nbComp,srcPt+((*w)+1)*nbComp,pt+i*nbComp);
-    else
-      throw INTERP_KERNEL::Exception("DataArrayInt::selectByTupleIdSafe : some ids has been detected to be out of [0,this->getNumberOfTuples) !");
-  ret->copyStringInfoFrom(*this);
-  return ret.retn();
-}
-
-/*!
- * Returns a shorten copy of \a this array. The new DataArrayInt 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 numbering.
- *  \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 DataArrayInt * - the new instance of DataArrayInt that the caller
- *          is to delete using decrRef() as it is no more needed.
- *  \sa DataArrayInt::subArray.
- */
-DataArrayInt *DataArrayInt::selectByTupleIdSafeSlice(int bg, int end2, int step) const
-{
-  checkAllocated();
-  MCAuto<DataArrayInt> ret=DataArrayInt::New();
-  int nbComp=getNumberOfComponents();
-  int newNbOfTuples=GetNumberOfItemGivenBESRelative(bg,end2,step,"DataArrayInt::selectByTupleIdSafeSlice : ");
-  ret->alloc(newNbOfTuples,nbComp);
-  int *pt=ret->getPointer();
-  const int *srcPt=getConstPointer()+bg*nbComp;
-  for(int i=0;i<newNbOfTuples;i++,srcPt+=step*nbComp)
-    std::copy(srcPt,srcPt+nbComp,pt+i*nbComp);
-  ret->copyStringInfoFrom(*this);
-  return ret.retn();
-}
-
-/*!
- * Returns a shorten copy of \a this array. The new DataArrayInt contains ranges
- * of tuples specified by \a ranges parameter.
- * For more info on renumbering see \ref numbering.
- *  \param [in] ranges - std::vector of std::pair's each of which defines a range
- *              of tuples in [\c begin,\c end) format.
- *  \return DataArrayInt * - the new instance of DataArrayInt that the caller
- *          is to delete using decrRef() as it is no more needed.
- *  \throw If \a end < \a begin.
- *  \throw If \a end > \a this->getNumberOfTuples().
- *  \throw If \a this is not allocated.
- */
-DataArray *DataArrayInt::selectByTupleRanges(const std::vector<std::pair<int,int> >& ranges) const
-{
-  checkAllocated();
-  int nbOfComp=getNumberOfComponents();
-  int nbOfTuplesThis=getNumberOfTuples();
-  if(ranges.empty())
-    {
-      MCAuto<DataArrayInt> ret=DataArrayInt::New();
-      ret->alloc(0,nbOfComp);
-      ret->copyStringInfoFrom(*this);
-      return ret.retn();
-    }
-  int ref=ranges.front().first;
-  int nbOfTuples=0;
-  bool isIncreasing=true;
-  for(std::vector<std::pair<int,int> >::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 << "DataArrayInt::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 << "DataArrayInt::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 deepCopy();
-  MCAuto<DataArrayInt> ret=DataArrayInt::New();
-  ret->alloc(nbOfTuples,nbOfComp);
-  ret->copyStringInfoFrom(*this);
-  const int *src=getConstPointer();
-  int *work=ret->getPointer();
-  for(std::vector<std::pair<int,int> >::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 new DataArrayInt containing a renumbering map in "Old to New" mode.
  * This map, if applied to \a this array, would make it sorted. For example, if
@@ -7131,171 +5765,15 @@ bool DataArrayInt::hasUniqueValues() const
  */
 DataArrayDouble *DataArrayInt::convertToDblArr() const
 {
-  checkAllocated();
-  DataArrayDouble *ret=DataArrayDouble::New();
-  ret->alloc(getNumberOfTuples(),getNumberOfComponents());
-  std::size_t nbOfVals=getNbOfElems();
-  const int *src=getConstPointer();
-  double *dest=ret->getPointer();
-  std::copy(src,src+nbOfVals,dest);
-  ret->copyStringInfoFrom(*this);
-  return ret;
-}
-
-/*!
- * Returns a shorten copy of \a this array. The new DataArrayInt 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 selectByTupleIdSafeSlice().
- *  \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 DataArrayInt * - the new instance of DataArrayInt 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 DataArrayInt::selectByTupleIdSafeSlice
- */
-DataArrayInt *DataArrayInt::subArray(int tupleIdBg, int tupleIdEnd) const
-{
-  checkAllocated();
-  int nbt=getNumberOfTuples();
-  if(tupleIdBg<0)
-    throw INTERP_KERNEL::Exception("DataArrayInt::subArray : The tupleIdBg parameter must be greater than 0 !");
-  if(tupleIdBg>nbt)
-    throw INTERP_KERNEL::Exception("DataArrayInt::subArray : The tupleIdBg parameter is greater than number of tuples !");
-  int trueEnd=tupleIdEnd;
-  if(tupleIdEnd!=-1)
-    {
-      if(tupleIdEnd>nbt)
-        throw INTERP_KERNEL::Exception("DataArrayInt::subArray : The tupleIdBg parameter is greater or equal than number of tuples !");
-    }
-  else
-    trueEnd=nbt;
-  int nbComp=getNumberOfComponents();
-  MCAuto<DataArrayInt> ret=DataArrayInt::New();
-  ret->alloc(trueEnd-tupleIdBg,nbComp);
-  ret->copyStringInfoFrom(*this);
-  std::copy(getConstPointer()+tupleIdBg*nbComp,getConstPointer()+trueEnd*nbComp,ret->getPointer());
-  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)
-{
-  checkAllocated();
-  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<int>::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();
-}
-
-/*!
- * Changes the number of components within \a this array to be equal to its number
- * 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.
- *  \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()
-{
-  checkAllocated();
-  int nbOfTuples=getNumberOfTuples();
-  rearrange(nbOfTuples);
-}
-
-/*!
- * 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 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.
- */
-DataArrayInt *DataArrayInt::changeNbOfComponents(int newNbOfComp, int dftValue) const
-{
-  checkAllocated();
-  MCAuto<DataArrayInt> ret=DataArrayInt::New();
-  ret->alloc(getNumberOfTuples(),newNbOfComp);
-  const int *oldc=getConstPointer();
-  int *nc=ret->getPointer();
-  int nbOfTuples=getNumberOfTuples();
-  int oldNbOfComp=getNumberOfComponents();
-  int dim=std::min(oldNbOfComp,newNbOfComp);
-  for(int i=0;i<nbOfTuples;i++)
-    {
-      int j=0;
-      for(;j<dim;j++)
-        nc[newNbOfComp*i+j]=oldc[i*oldNbOfComp+j];
-      for(;j<newNbOfComp;j++)
-        nc[newNbOfComp*i+j]=dftValue;
-    }
-  ret->setName(getName());
-  for(int i=0;i<dim;i++)
-    ret->setInfoOnComponent(i,getInfoOnComponent(i));
-  ret->setName(getName());
-  return ret.retn();
-}
-
-/*!
- * Returns a copy of \a this array composed of selected components.
- * The new DataArrayInt 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 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.
- *  \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
- */
-DataArrayInt *DataArrayInt::keepSelectedComponents(const std::vector<int>& compoIds) const
-{
-  checkAllocated();
-  MCAuto<DataArrayInt> ret(DataArrayInt::New());
-  int newNbOfCompo=(int)compoIds.size();
-  int oldNbOfCompo=getNumberOfComponents();
-  for(std::vector<int>::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 int *oldc=getConstPointer();
-  int *nc=ret->getPointer();
-  for(int i=0;i<nbOfTuples;i++)
-    for(int j=0;j<newNbOfCompo;j++,nc++)
-      *nc=oldc[i*oldNbOfCompo+compoIds[j]];
-  return ret.retn();
+  checkAllocated();
+  DataArrayDouble *ret=DataArrayDouble::New();
+  ret->alloc(getNumberOfTuples(),getNumberOfComponents());
+  std::size_t nbOfVals=getNbOfElems();
+  const int *src=getConstPointer();
+  double *dest=ret->getPointer();
+  std::copy(src,src+nbOfVals,dest);
+  ret->copyStringInfoFrom(*this);
+  return ret;
 }
 
 /*!
@@ -7372,658 +5850,6 @@ void DataArrayInt::setSelectedComponents(const DataArrayInt *a, const std::vecto
       nc[nbOfCompo*i+compoIds[j]]=*ac;
 }
 
-/*!
- * Copy all values from another DataArrayInt into specified tuples and components
- * of \a this array. Textual data is not copied.
- * The tree parameters defining set of indices of tuples and components are similar to
- * the tree parameters of the Python function \c range(\c start,\c stop,\c step).
- *  \param [in] a - the array to copy values from.
- *  \param [in] bgTuples - index of the first tuple of \a this array to assign values to.
- *  \param [in] endTuples - index of the tuple before which the tuples to assign to
- *              are located.
- *  \param [in] stepTuples - index increment to get index of the next tuple to assign to.
- *  \param [in] bgComp - index of the first component of \a this array to assign values 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 - if \a true (by default), then \a a->getNumberOfComponents() 
- *              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 DataArrayInt::setPartOfValues1(const DataArrayInt *a, int bgTuples, int endTuples, int stepTuples, int bgComp, int endComp, int stepComp, bool strictCompoCompare)
-{
-  if(!a)
-    throw INTERP_KERNEL::Exception("DataArrayInt::setPartOfValues1 : DataArrayInt pointer in input is NULL !");
-  const char msg[]="DataArrayInt::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;
-    }
-  int *pt=getPointer()+bgTuples*nbComp+bgComp;
-  const int *srcPt=a->getConstPointer();
-  if(assignTech)
-    {
-      for(int i=0;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
-        for(int j=0;j<newNbOfComp;j++,srcPt++)
-          pt[j*stepComp]=*srcPt;
-    }
-  else
-    {
-      for(int i=0;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
-        {
-          const int *srcPt2=srcPt;
-          for(int j=0;j<newNbOfComp;j++,srcPt2++)
-            pt[j*stepComp]=*srcPt2;
-        }
-    }
-}
-
-/*!
- * Assign a given value to values at specified tuples and components of \a this array.
- * The tree parameters defining set of indices of tuples and components are similar to
- * the tree parameters of the Python function \c range(\c start,\c stop,\c step)..
- *  \param [in] a - the value to assign.
- *  \param [in] bgTuples - index of the first tuple of \a this array to assign to.
- *  \param [in] endTuples - index of the tuple before which the tuples to assign to
- *              are located.
- *  \param [in] stepTuples - index increment to get index of the next tuple to assign to.
- *  \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 parameters specifying tuples and components to assign to, do not give a
- *            non-empty range of increasing indices or indices are out of a valid range
- *            for \c this array.
- *
- *  \if ENABLE_EXAMPLES
- *  \ref py_mcdataarrayint_setpartofvaluessimple1 "Here is a Python example".
- *  \endif
- */
-void DataArrayInt::setPartOfValuesSimple1(int a, int bgTuples, int endTuples, int stepTuples, int bgComp, int endComp, int stepComp)
-{
-  const char msg[]="DataArrayInt::setPartOfValuesSimple1";
-  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");
-  int *pt=getPointer()+bgTuples*nbComp+bgComp;
-  for(int i=0;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
-    for(int j=0;j<newNbOfComp;j++)
-      pt[j*stepComp]=a;
-}
-
-
-/*!
- * Copy all values from another DataArrayInt (\a a) into specified tuples and 
- * components of \a this array. Textual data is not copied.
- * The tuples and components to assign to are defined by C arrays of indices.
- * 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 <em>(pi)</em> 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 <em>(pi)</em> 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 <em>bgTuples / bgComp</em> is
- *         out of a valid range for \a this array.
- *  \throw In the first *mode of usage*, if <em>strictCompoCompare == true </em> and
- *         if <em> a->getNumberOfComponents() != (endComp - bgComp) </em>.
- *  \throw In the second *mode of usage*, if \a a->getNumberOfTuples() != 1 or
- *         <em> a->getNumberOfComponents() != (endComp - bgComp)</em>.
- *
- *  \if ENABLE_EXAMPLES
- *  \ref py_mcdataarrayint_setpartofvalues2 "Here is a Python example".
- *  \endif
- */
-void DataArrayInt::setPartOfValues2(const DataArrayInt *a, const int *bgTuples, const int *endTuples, const int *bgComp, const int *endComp, bool strictCompoCompare)
-{
-  if(!a)
-    throw INTERP_KERNEL::Exception("DataArrayInt::setPartOfValues2 : DataArrayInt pointer in input is NULL !");
-  const char msg[]="DataArrayInt::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;
-    }
-  int *pt=getPointer();
-  const int *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 int *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 <em>bgTuples / bgComp</em> is
- *         out of a valid range for \a this array.
- *
- *  \if ENABLE_EXAMPLES
- *  \ref py_mcdataarrayint_setpartofvaluessimple2 "Here is a Python example".
- *  \endif
- */
-void DataArrayInt::setPartOfValuesSimple2(int 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");
-  int *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 DataArrayInt (\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 <em>(pi)</em> 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 <em>strictCompoCompare == true </em> and
- *         if <em> a->getNumberOfComponents()</em> is unequal to the number of components
- *         defined by <em>(bgComp,endComp,stepComp)</em>.
- *  \throw In the second *mode of usage*, if \a a->getNumberOfTuples() != 1 or
- *         <em> a->getNumberOfComponents()</em> is unequal to the number of components
- *         defined by <em>(bgComp,endComp,stepComp)</em>.
- *  \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 \c this array.
- *
- *  \if ENABLE_EXAMPLES
- *  \ref py_mcdataarrayint_setpartofvalues3 "Here is a Python example".
- *  \endif
- */
-void DataArrayInt::setPartOfValues3(const DataArrayInt *a, const int *bgTuples, const int *endTuples, int bgComp, int endComp, int stepComp, bool strictCompoCompare)
-{
-  if(!a)
-    throw INTERP_KERNEL::Exception("DataArrayInt::setPartOfValues3 : DataArrayInt pointer in input is NULL !");
-  const char msg[]="DataArrayInt::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;
-    }
-  int *pt=getPointer()+bgComp;
-  const int *srcPt=a->getConstPointer();
-  if(assignTech)
-    {
-      for(const int *w=bgTuples;w!=endTuples;w++)
-        for(int j=0;j<newNbOfComp;j++,srcPt++)
-          {
-            DataArray::CheckValueInRange(nbOfTuples,*w,"invalid tuple id");
-            pt[(std::size_t)(*w)*nbComp+j*stepComp]=*srcPt;
-          }
-    }
-  else
-    {
-      for(const int *w=bgTuples;w!=endTuples;w++)
-        {
-          const int *srcPt2=srcPt;
-          for(int j=0;j<newNbOfComp;j++,srcPt2++)
-            {
-              DataArray::CheckValueInRange(nbOfTuples,*w,"invalid tuple id");
-              pt[(std::size_t)(*w)*nbComp+j*stepComp]=*srcPt2;
-            }
-        }
-    }
-}
-
-/*!
- * Assign a given value to values at specified tuples and components of \a this array.
- * 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).
- *  \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 <em>(pi)</em> 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 \c this array.
- *
- *  \if ENABLE_EXAMPLES
- *  \ref py_mcdataarrayint_setpartofvaluessimple3 "Here is a Python example".
- *  \endif
- */
-void DataArrayInt::setPartOfValuesSimple3(int a, const int *bgTuples, const int *endTuples, int bgComp, int endComp, int stepComp)
-{
-  const char msg[]="DataArrayInt::setPartOfValuesSimple3";
-  checkAllocated();
-  int newNbOfComp=DataArray::GetNumberOfItemGivenBES(bgComp,endComp,stepComp,msg);
-  int nbComp=getNumberOfComponents();
-  int nbOfTuples=getNumberOfTuples();
-  DataArray::CheckValueInRangeEx(nbComp,bgComp,endComp,"invalid component value");
-  int *pt=getPointer()+bgComp;
-  for(const int *w=bgTuples;w!=endTuples;w++)
-    for(int j=0;j<newNbOfComp;j++)
-      {
-        DataArray::CheckValueInRange(nbOfTuples,*w,"invalid tuple id");
-        pt[(std::size_t)(*w)*nbComp+j*stepComp]=a;
-      }
-}
-
-void DataArrayInt::setPartOfValues4(const DataArrayInt *a, int bgTuples, int endTuples, int stepTuples, const int *bgComp, const int *endComp, bool strictCompoCompare)
-{
-  if(!a)
-    throw INTERP_KERNEL::Exception("DataArrayInt::setPartOfValues4 : input DataArrayInt is NULL !");
-  const char msg[]="DataArrayInt::setPartOfValues4";
-  checkAllocated();
-  a->checkAllocated();
-  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 int *srcPt=a->getConstPointer();
-  int *pt=getPointer()+bgTuples*nbComp;
-  if(assignTech)
-    {
-      for(int i=0;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
-        for(const int *z=bgComp;z!=endComp;z++,srcPt++)
-          pt[*z]=*srcPt;
-    }
-  else
-    {
-      for(int i=0;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
-        {
-          const int *srcPt2=srcPt;
-          for(const int *z=bgComp;z!=endComp;z++,srcPt2++)
-            pt[*z]=*srcPt2;
-        }
-    }
-}
-
-void DataArrayInt::setPartOfValuesSimple4(int a, int bgTuples, int endTuples, int stepTuples, const int *bgComp, const int *endComp)
-{
-  const char msg[]="DataArrayInt::setPartOfValuesSimple4";
-  checkAllocated();
-  int newNbOfTuples=DataArray::GetNumberOfItemGivenBES(bgTuples,endTuples,stepTuples,msg);
-  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");
-  int *pt=getPointer()+bgTuples*nbComp;
-  for(int i=0;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
-    for(const int *z=bgComp;z!=endComp;z++)
-      pt[*z]=a;
-}
-
-/*!
- * Copy some tuples from another DataArrayInt into specified tuples
- * of \a this array. Textual data is not copied. Both arrays must have equal number of
- * components.
- * Both the tuples to assign and the tuples to assign to are defined by a DataArrayInt.
- * All components of selected tuples are copied.
- *  \param [in] a - the array to copy values from.
- *  \param [in] tuplesSelec - the array specifying both source tuples of \a a and
- *              target tuples of \a this. \a tuplesSelec has two components, and the
- *              first component specifies index of the source tuple and the second
- *              one specifies index of the target tuple.
- *  \throw If \a this is not allocated.
- *  \throw If \a a is NULL.
- *  \throw If \a a is not allocated.
- *  \throw If \a tuplesSelec is NULL.
- *  \throw If \a tuplesSelec is not allocated.
- *  \throw If <em>this->getNumberOfComponents() != a->getNumberOfComponents()</em>.
- *  \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 DataArrayInt::setPartOfValuesAdv(const DataArrayInt *a, const DataArrayInt *tuplesSelec)
-{
-  if(!a || !tuplesSelec)
-    throw INTERP_KERNEL::Exception("DataArrayInt::setPartOfValuesAdv : DataArrayInt pointer in input is NULL !");
-  checkAllocated();
-  a->checkAllocated();
-  tuplesSelec->checkAllocated();
-  int nbOfComp=getNumberOfComponents();
-  if(nbOfComp!=a->getNumberOfComponents())
-    throw INTERP_KERNEL::Exception("DataArrayInt::setPartOfValuesAdv : This and a do not have the same number of components !");
-  if(tuplesSelec->getNumberOfComponents()!=2)
-    throw INTERP_KERNEL::Exception("DataArrayInt::setPartOfValuesAdv : Expecting to have a tuple selector DataArrayInt instance with exactly 2 components !");
-  int thisNt=getNumberOfTuples();
-  int aNt=a->getNumberOfTuples();
-  int *valsToSet=getPointer();
-  const int *valsSrc=a->getConstPointer();
-  for(const int *tuple=tuplesSelec->begin();tuple!=tuplesSelec->end();tuple+=2)
-    {
-      if(tuple[1]>=0 && tuple[1]<aNt)
-        {
-          if(tuple[0]>=0 && tuple[0]<thisNt)
-            std::copy(valsSrc+nbOfComp*tuple[1],valsSrc+nbOfComp*(tuple[1]+1),valsToSet+nbOfComp*tuple[0]);
-          else
-            {
-              std::ostringstream oss; oss << "DataArrayInt::setPartOfValuesAdv : Tuple #" << std::distance(tuplesSelec->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 << "DataArrayInt::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 DataArrayInt (\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 DataArrayInt.
- * 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 <em>this->getNumberOfComponents() != a->getNumberOfComponents()</em>.
- *  \throw If \a tuplesSelec->getNumberOfComponents() != 1.
- *  \throw If <em>tupleIdStart + tuplesSelec->getNumberOfTuples() > this->getNumberOfTuples().</em>
- *  \throw If any tuple index given by \a tuplesSelec is out of a valid range for 
- *         \a aBase array.
- */
-void DataArrayInt::setContigPartOfSelectedValues(int tupleIdStart, const DataArray *aBase, const DataArrayInt *tuplesSelec)
-{
-  if(!aBase || !tuplesSelec)
-    throw INTERP_KERNEL::Exception("DataArrayInt::setContigPartOfSelectedValues : input DataArray is NULL !");
-  const DataArrayInt *a=dynamic_cast<const DataArrayInt *>(aBase);
-  if(!a)
-    throw INTERP_KERNEL::Exception("DataArrayInt::setContigPartOfSelectedValues : input DataArray aBase is not a DataArrayInt !");
-  checkAllocated();
-  a->checkAllocated();
-  tuplesSelec->checkAllocated();
-  int nbOfComp=getNumberOfComponents();
-  if(nbOfComp!=a->getNumberOfComponents())
-    throw INTERP_KERNEL::Exception("DataArrayInt::setContigPartOfSelectedValues : This and a do not have the same number of components !");
-  if(tuplesSelec->getNumberOfComponents()!=1)
-    throw INTERP_KERNEL::Exception("DataArrayInt::setContigPartOfSelectedValues : Expecting to have a tuple selector DataArrayInt instance with exactly 1 component !");
-  int thisNt=getNumberOfTuples();
-  int aNt=a->getNumberOfTuples();
-  int nbOfTupleToWrite=tuplesSelec->getNumberOfTuples();
-  int *valsToSet=getPointer()+tupleIdStart*nbOfComp;
-  if(tupleIdStart+nbOfTupleToWrite>thisNt)
-    throw INTERP_KERNEL::Exception("DataArrayInt::setContigPartOfSelectedValues : invalid number range of values to write !");
-  const int *valsSrc=a->getConstPointer();
-  for(const int *tuple=tuplesSelec->begin();tuple!=tuplesSelec->end();tuple++,valsToSet+=nbOfComp)
-    {
-      if(*tuple>=0 && *tuple<aNt)
-        {
-          std::copy(valsSrc+nbOfComp*(*tuple),valsSrc+nbOfComp*(*tuple+1),valsToSet);
-        }
-      else
-        {
-          std::ostringstream oss; oss << "DataArrayInt::setContigPartOfSelectedValues : Tuple #" << std::distance(tuplesSelec->begin(),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 DataArrayInt (\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 <em>this->getNumberOfComponents() != aBase->getNumberOfComponents()</em>.
- *  \throw If <em>tupleIdStart + len(range(bg,end2,step)) > this->getNumberOfTuples().</em>
- *  \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 DataArrayInt::setContigPartOfSelectedValuesSlice(int tupleIdStart, const DataArray *aBase, int bg, int end2, int step)
-{
-  if(!aBase)
-    throw INTERP_KERNEL::Exception("DataArrayInt::setContigPartOfSelectedValuesSlice : input DataArray is NULL !");
-  const DataArrayInt *a=dynamic_cast<const DataArrayInt *>(aBase);
-  if(!a)
-    throw INTERP_KERNEL::Exception("DataArrayInt::setContigPartOfSelectedValuesSlice : input DataArray aBase is not a DataArrayInt !");
-  checkAllocated();
-  a->checkAllocated();
-  int nbOfComp=getNumberOfComponents();
-  const char msg[]="DataArrayInt::setContigPartOfSelectedValuesSlice";
-  int nbOfTupleToWrite=DataArray::GetNumberOfItemGivenBES(bg,end2,step,msg);
-  if(nbOfComp!=a->getNumberOfComponents())
-    throw INTERP_KERNEL::Exception("DataArrayInt::setContigPartOfSelectedValuesSlice : This and a do not have the same number of components !");
-  int thisNt=getNumberOfTuples();
-  int aNt=a->getNumberOfTuples();
-  int *valsToSet=getPointer()+tupleIdStart*nbOfComp;
-  if(tupleIdStart+nbOfTupleToWrite>thisNt)
-    throw INTERP_KERNEL::Exception("DataArrayInt::setContigPartOfSelectedValuesSlice : invalid number range of values to write !");
-  if(end2>aNt)
-    throw INTERP_KERNEL::Exception("DataArrayInt::setContigPartOfSelectedValuesSlice : invalid range of values to read !");
-  const int *valsSrc=a->getConstPointer()+bg*nbOfComp;
-  for(int i=0;i<nbOfTupleToWrite;i++,valsToSet+=nbOfComp,valsSrc+=step*nbOfComp)
-    {
-      std::copy(valsSrc,valsSrc+nbOfComp,valsToSet);
-    }
-}
-
-/*!
- * Returns the first value of \a this. 
- *  \return int - 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.
- */
-int DataArrayInt::front() const
-{
-  checkAllocated();
-  if(getNumberOfComponents()!=1)
-    throw INTERP_KERNEL::Exception("DataArrayInt::front : number of components not equal to one !");
-  int nbOfTuples=getNumberOfTuples();
-  if(nbOfTuples<1)
-    throw INTERP_KERNEL::Exception("DataArrayInt::front : number of tuples must be >= 1 !");
-  return *(getConstPointer());
-}
-
-/*!
- * Returns the last value of \a this. 
- *  \return int - 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.
- */
-int DataArrayInt::back() const
-{
-  checkAllocated();
-  if(getNumberOfComponents()!=1)
-    throw INTERP_KERNEL::Exception("DataArrayInt::back : number of components not equal to one !");
-  int nbOfTuples=getNumberOfTuples();
-  if(nbOfTuples<1)
-    throw INTERP_KERNEL::Exception("DataArrayInt::back : number of tuples must be >= 1 !");
-  return *(getConstPointer()+nbOfTuples-1);
-}
-
 /*!
  * Assign pointer to one array to a pointer to another appay. Reference counter of
  * \a arrayToSet is incremented / decremented.
@@ -8591,74 +6417,6 @@ DataArrayInt *DataArrayInt::AggregateIndexes(const std::vector<const DataArrayIn
   return ret.retn();
 }
 
-/*!
- * 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 int - the maximal value among all values of \a this array.
- *  \throw If \a this->getNumberOfComponents() != 1
- *  \throw If \a this->getNumberOfTuples() < 1
- */
-int DataArrayInt::getMaxValue(int& tupleId) const
-{
-  checkAllocated();
-  if(getNumberOfComponents()!=1)
-    throw INTERP_KERNEL::Exception("DataArrayInt::getMaxValue : must be applied on DataArrayInt with only one component !");
-  int nbOfTuples=getNumberOfTuples();
-  if(nbOfTuples<=0)
-    throw INTERP_KERNEL::Exception("DataArrayInt::getMaxValue : array exists but number of tuples must be > 0 !");
-  const int *vals=getConstPointer();
-  const int *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 int - the maximal value among all values of \a this array.
- *  \throw If \a this is not allocated.
- */
-int DataArrayInt::getMaxValueInArray() const
-{
-  checkAllocated();
-  const int *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 int - the minimal value among all values of \a this array.
- *  \throw If \a this->getNumberOfComponents() != 1
- *  \throw If \a this->getNumberOfTuples() < 1
- */
-int DataArrayInt::getMinValue(int& tupleId) const
-{
-  checkAllocated();
-  if(getNumberOfComponents()!=1)
-    throw INTERP_KERNEL::Exception("DataArrayInt::getMaxValue : must be applied on DataArrayInt with only one component !");
-  int nbOfTuples=getNumberOfTuples();
-  if(nbOfTuples<=0)
-    throw INTERP_KERNEL::Exception("DataArrayInt::getMaxValue : array exists but number of tuples must be > 0 !");
-  const int *vals=getConstPointer();
-  const int *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 int - the minimal value among all values of \a this array.
- *  \throw If \a this is not allocated.
- */
-int DataArrayInt::getMinValueInArray() const
-{
-  checkAllocated();
-  const int *loc=std::min_element(begin(),end());
-  return *loc;
-}
-
 /*!
  * Returns in a single walk in \a this the min value and the max value in \a this.
  * \a this is expected to be single component array.
index f83539808b208eedd514e06c1ad8247ddafc0d4e..6162b095edb1f0ad9a3ac302324b71d373aedad9 100644 (file)
@@ -203,6 +203,8 @@ namespace MEDCoupling
 
 namespace MEDCoupling
 {
+  class DataArrayInt;
+
   template<class T>
   class DataArrayTemplate : public DataArray
   {
@@ -228,9 +230,13 @@ namespace MEDCoupling
     MEDCOUPLING_EXPORT void checkAllocated() const;
     MEDCOUPLING_EXPORT void desallocate();
     MEDCOUPLING_EXPORT void reserve(std::size_t nbOfElems);
+    MEDCOUPLING_EXPORT void rearrange(int newNbOfCompo);
+    MEDCOUPLING_EXPORT void transpose();
     MEDCOUPLING_EXPORT void pushBackSilent(T val);
     MEDCOUPLING_EXPORT void pushBackValsSilent(const T *valsBg, const T *valsEnd);
     MEDCOUPLING_EXPORT T popBackSilent();
+    MEDCOUPLING_EXPORT T front() const;
+    MEDCOUPLING_EXPORT T back() const;
     MEDCOUPLING_EXPORT std::size_t getNbOfElemAllocated() const { return _mem.getNbOfElemAllocated(); }
     MEDCOUPLING_EXPORT void allocIfNecessary(int nbOfTuple, int nbOfCompo);
     MEDCOUPLING_EXPORT void deepCopyFrom(const DataArrayTemplate<T>& other);
@@ -241,16 +247,39 @@ namespace MEDCoupling
     MEDCOUPLING_EXPORT void renumberInPlaceR(const int *new2Old);
     MEDCOUPLING_EXPORT void sort(bool asc=true);
     MEDCOUPLING_EXPORT typename Traits<T>::ArrayType *renumber(const int *old2New) const;
+    MEDCOUPLING_EXPORT typename Traits<T>::ArrayType *renumberR(const int *new2Old) const;
+    MEDCOUPLING_EXPORT typename Traits<T>::ArrayType *renumberAndReduce(const int *old2New, int newNbOfTuple) const;
+    MEDCOUPLING_EXPORT typename Traits<T>::ArrayType *changeNbOfComponents(int newNbOfComp, T dftValue) const;
+    MEDCOUPLING_EXPORT typename Traits<T>::ArrayType *subArray(int tupleIdBg, int tupleIdEnd=-1) const;
+    MEDCOUPLING_EXPORT void setPartOfValues1(const typename Traits<T>::ArrayType *a, int bgTuples, int endTuples, int stepTuples, int bgComp, int endComp, int stepComp, bool strictCompoCompare=true);
+    MEDCOUPLING_EXPORT void setPartOfValuesSimple1(T a, int bgTuples, int endTuples, int stepTuples, int bgComp, int endComp, int stepComp);
+    MEDCOUPLING_EXPORT void setPartOfValues2(const typename Traits<T>::ArrayType *a, const int *bgTuples, const int *endTuples, const int *bgComp, const int *endComp, bool strictCompoCompare=true);
+    MEDCOUPLING_EXPORT void setPartOfValuesSimple2(T a, const int *bgTuples, const int *endTuples, const int *bgComp, const int *endComp);
+    MEDCOUPLING_EXPORT void setPartOfValues3(const typename Traits<T>::ArrayType *a, const int *bgTuples, const int *endTuples, int bgComp, int endComp, int stepComp, bool strictCompoCompare=true);
+    MEDCOUPLING_EXPORT void setPartOfValuesSimple3(T a, const int *bgTuples, const int *endTuples, int bgComp, int endComp, int stepComp);
+    MEDCOUPLING_EXPORT void setPartOfValues4(const typename Traits<T>::ArrayType *a, int bgTuples, int endTuples, int stepTuples, const int *bgComp, const int *endComp, bool strictCompoCompare=true);
+    MEDCOUPLING_EXPORT void setPartOfValuesSimple4(T a, int bgTuples, int endTuples, int stepTuples, const int *bgComp, const int *endComp);
+    MEDCOUPLING_EXPORT void setPartOfValuesAdv(const typename Traits<T>::ArrayType *a, const DataArrayInt *tuplesSelec);
+    MEDCOUPLING_EXPORT void setContigPartOfSelectedValues(int tupleIdStart, const DataArray *aBase, const DataArrayInt *tuplesSelec);
+    MEDCOUPLING_EXPORT void setContigPartOfSelectedValuesSlice(int tupleIdStart, const DataArray *aBase, int bg, int end2, int step);
+    MEDCOUPLING_EXPORT T getMaxValue(int& tupleId) const;
+    MEDCOUPLING_EXPORT T getMaxValueInArray() const;
+    MEDCOUPLING_EXPORT T getMinValue(int& tupleId) const;
+    MEDCOUPLING_EXPORT T getMinValueInArray() const;
+  protected:
+    typename Traits<T>::ArrayType *mySelectByTupleId(const int *new2OldBg, const int *new2OldEnd) const;
+    typename Traits<T>::ArrayType *mySelectByTupleId(const DataArrayInt& di) const;
+    typename Traits<T>::ArrayType *mySelectByTupleIdSafe(const int *new2OldBg, const int *new2OldEnd) const;
+    typename Traits<T>::ArrayType *myKeepSelectedComponents(const std::vector<int>& compoIds) const;
+    typename Traits<T>::ArrayType *mySelectByTupleIdSafeSlice(int bg, int end2, int step) const;
+    typename Traits<T>::ArrayType *mySelectByTupleRanges(const std::vector<std::pair<int,int> >& ranges) const;
   protected:
     MemArray<T> _mem;
   };
 }
 
-#include "MEDCouplingMemArray.txx"
-
 namespace MEDCoupling
 {
-  class DataArrayInt;
   class DataArrayDoubleIterator;
   class DataArrayDouble : public DataArrayTemplate<double>
   {
@@ -284,18 +313,12 @@ namespace MEDCoupling
     MEDCOUPLING_EXPORT DataArrayInt *convertToIntArr() const;
     MEDCOUPLING_EXPORT DataArrayDouble *fromNoInterlace() const;
     MEDCOUPLING_EXPORT DataArrayDouble *toNoInterlace() const;
-    MEDCOUPLING_EXPORT DataArrayDouble *renumberR(const int *new2Old) const;
-    MEDCOUPLING_EXPORT DataArrayDouble *renumberAndReduce(const int *old2New, int newNbOfTuple) const;
-    MEDCOUPLING_EXPORT DataArrayDouble *selectByTupleId(const int *new2OldBg, const int *new2OldEnd) const;
-    MEDCOUPLING_EXPORT DataArrayDouble *selectByTupleId(const DataArrayInt & di) const;
-    MEDCOUPLING_EXPORT DataArrayDouble *selectByTupleIdSafe(const int *new2OldBg, const int *new2OldEnd) const;
-    MEDCOUPLING_EXPORT DataArrayDouble *selectByTupleIdSafeSlice(int bg, int end2, int step) const;
-    MEDCOUPLING_EXPORT DataArray *selectByTupleRanges(const std::vector<std::pair<int,int> >& ranges) const;
-    MEDCOUPLING_EXPORT DataArrayDouble *subArray(int tupleIdBg, int tupleIdEnd=-1) const;
-    MEDCOUPLING_EXPORT void rearrange(int newNbOfCompo);
-    MEDCOUPLING_EXPORT void transpose();
-    MEDCOUPLING_EXPORT DataArrayDouble *changeNbOfComponents(int newNbOfComp, double dftValue) const;
-    MEDCOUPLING_EXPORT DataArrayDouble *keepSelectedComponents(const std::vector<int>& compoIds) const;
+    MEDCOUPLING_EXPORT DataArrayDouble *selectByTupleId(const int *new2OldBg, const int *new2OldEnd) const { return DataArrayTemplate<double>::mySelectByTupleId(new2OldBg,new2OldEnd); }
+    MEDCOUPLING_EXPORT DataArrayDouble *selectByTupleId(const DataArrayInt& di) const { return DataArrayTemplate<double>::mySelectByTupleId(di); }
+    MEDCOUPLING_EXPORT DataArrayDouble *selectByTupleIdSafe(const int *new2OldBg, const int *new2OldEnd) const { return DataArrayTemplate<double>::mySelectByTupleIdSafe(new2OldBg,new2OldEnd); }
+    MEDCOUPLING_EXPORT DataArrayDouble *keepSelectedComponents(const std::vector<int>& compoIds) const { return DataArrayTemplate<double>::myKeepSelectedComponents(compoIds); }
+    MEDCOUPLING_EXPORT DataArrayDouble *selectByTupleIdSafeSlice(int bg, int end2, int step) const { return DataArrayTemplate<double>::mySelectByTupleIdSafeSlice(bg,end2,step); }
+    MEDCOUPLING_EXPORT DataArray *selectByTupleRanges(const std::vector<std::pair<int,int> >& ranges) const { return DataArrayTemplate<double>::mySelectByTupleRanges(ranges); }
     MEDCOUPLING_EXPORT void meldWith(const DataArrayDouble *other);
     MEDCOUPLING_EXPORT bool areIncludedInMe(const DataArrayDouble *other, double prec, DataArrayInt *&tupleIds) const;
     MEDCOUPLING_EXPORT void findCommonTuples(double prec, int limitTupleId, DataArrayInt *&comm, DataArrayInt *&commIndex) const;
@@ -305,20 +328,7 @@ namespace MEDCoupling
     MEDCOUPLING_EXPORT DataArrayInt *findClosestTupleId(const DataArrayDouble *other) const;
     MEDCOUPLING_EXPORT DataArrayInt *computeNbOfInteractionsWith(const DataArrayDouble *otherBBoxFrmt, double eps) const;
     MEDCOUPLING_EXPORT void setSelectedComponents(const DataArrayDouble *a, const std::vector<int>& compoIds);
-    MEDCOUPLING_EXPORT void setPartOfValues1(const DataArrayDouble *a, int bgTuples, int endTuples, int stepTuples, int bgComp, int endComp, int stepComp, bool strictCompoCompare=true);
-    MEDCOUPLING_EXPORT void setPartOfValuesSimple1(double a, int bgTuples, int endTuples, int stepTuples, int bgComp, int endComp, int stepComp);
-    MEDCOUPLING_EXPORT void setPartOfValues2(const DataArrayDouble *a, const int *bgTuples, const int *endTuples, const int *bgComp, const int *endComp, bool strictCompoCompare=true);
-    MEDCOUPLING_EXPORT void setPartOfValuesSimple2(double a, const int *bgTuples, const int *endTuples, const int *bgComp, const int *endComp);
-    MEDCOUPLING_EXPORT void setPartOfValues3(const DataArrayDouble *a, const int *bgTuples, const int *endTuples, int bgComp, int endComp, int stepComp, bool strictCompoCompare=true);
-    MEDCOUPLING_EXPORT void setPartOfValuesSimple3(double a, const int *bgTuples, const int *endTuples, int bgComp, int endComp, int stepComp);
-    MEDCOUPLING_EXPORT void setPartOfValues4(const DataArrayDouble *a, int bgTuples, int endTuples, int stepTuples, const int *bgComp, const int *endComp, bool strictCompoCompare=true);
-    MEDCOUPLING_EXPORT void setPartOfValuesSimple4(double a, int bgTuples, int endTuples, int stepTuples, const int *bgComp, const int *endComp);
-    MEDCOUPLING_EXPORT void setPartOfValuesAdv(const DataArrayDouble *a, const DataArrayInt *tuplesSelec);
-    MEDCOUPLING_EXPORT void setContigPartOfSelectedValues(int tupleIdStart, const DataArray *aBase, const DataArrayInt *tuplesSelec);
-    MEDCOUPLING_EXPORT void setContigPartOfSelectedValuesSlice(int tupleIdStart, const DataArray *aBase, int bg, int end2, int step);
     MEDCOUPLING_EXPORT void getTuple(int tupleId, double *res) const { std::copy(_mem.getConstPointerLoc(tupleId*_info_on_compo.size()),_mem.getConstPointerLoc((tupleId+1)*_info_on_compo.size()),res); }
-    MEDCOUPLING_EXPORT double front() const;
-    MEDCOUPLING_EXPORT double back() const;
     MEDCOUPLING_EXPORT static void SetArrayIn(DataArrayDouble *newArray, DataArrayDouble* &arrayToSet);
     MEDCOUPLING_EXPORT DataArrayDoubleIterator *iterator();
     template<class InputIterator>
@@ -330,10 +340,6 @@ namespace MEDCoupling
     MEDCOUPLING_EXPORT DataArrayDouble *computeBBoxPerTuple(double epsilon=0.0) const;
     MEDCOUPLING_EXPORT void computeTupleIdsNearTuples(const DataArrayDouble *other, double eps, DataArrayInt *& c, DataArrayInt *& cI) const;
     MEDCOUPLING_EXPORT void recenterForMaxPrecision(double eps);
-    MEDCOUPLING_EXPORT double getMaxValue(int& tupleId) const;
-    MEDCOUPLING_EXPORT double getMaxValueInArray() const;
-    MEDCOUPLING_EXPORT double getMinValue(int& tupleId) const;
-    MEDCOUPLING_EXPORT double getMinValueInArray() const;
     MEDCOUPLING_EXPORT double getMaxValue2(DataArrayInt*& tupleIds) const;
     MEDCOUPLING_EXPORT double getMinValue2(DataArrayInt*& tupleIds) const;
     MEDCOUPLING_EXPORT int count(double value, double eps) const;
@@ -502,12 +508,12 @@ namespace MEDCoupling
     MEDCOUPLING_EXPORT DataArrayDouble *convertToDblArr() const;
     MEDCOUPLING_EXPORT DataArrayInt *fromNoInterlace() const;
     MEDCOUPLING_EXPORT DataArrayInt *toNoInterlace() const;
-    MEDCOUPLING_EXPORT DataArrayInt *renumberR(const int *new2Old) const;
-    MEDCOUPLING_EXPORT DataArrayInt *renumberAndReduce(const int *old2NewBg, int newNbOfTuple) const;
-    MEDCOUPLING_EXPORT DataArrayInt *selectByTupleId(const int *new2OldBg, const int *new2OldEnd) const;
-    MEDCOUPLING_EXPORT DataArrayInt *selectByTupleIdSafe(const int *new2OldBg, const int *new2OldEnd) const;
-    MEDCOUPLING_EXPORT DataArrayInt *selectByTupleIdSafeSlice(int bg, int end, int step) const;
-    MEDCOUPLING_EXPORT DataArray *selectByTupleRanges(const std::vector<std::pair<int,int> >& ranges) const;
+    MEDCOUPLING_EXPORT DataArrayInt *selectByTupleId(const int *new2OldBg, const int *new2OldEnd) const { return DataArrayTemplate<int>::mySelectByTupleId(new2OldBg,new2OldEnd); }
+    MEDCOUPLING_EXPORT DataArrayInt *selectByTupleId(const DataArrayInt& di) const { return DataArrayTemplate<int>::mySelectByTupleId(di); }
+    MEDCOUPLING_EXPORT DataArrayInt *selectByTupleIdSafe(const int *new2OldBg, const int *new2OldEnd) const { return DataArrayTemplate<int>::mySelectByTupleIdSafe(new2OldBg,new2OldEnd); }
+    MEDCOUPLING_EXPORT DataArrayInt *keepSelectedComponents(const std::vector<int>& compoIds) const { return DataArrayTemplate<int>::myKeepSelectedComponents(compoIds); }
+    MEDCOUPLING_EXPORT DataArrayInt *selectByTupleIdSafeSlice(int bg, int end, int step) const { return DataArrayTemplate<int>::mySelectByTupleIdSafeSlice(bg,end,step); }
+    MEDCOUPLING_EXPORT DataArray *selectByTupleRanges(const std::vector<std::pair<int,int> >& ranges) const { return DataArrayTemplate<int>::mySelectByTupleRanges(ranges); }
     MEDCOUPLING_EXPORT DataArrayInt *checkAndPreparePermutation() const;
     MEDCOUPLING_EXPORT static DataArrayInt *FindPermutationFromFirstToSecond(const DataArrayInt *ids1, const DataArrayInt *ids2);
     MEDCOUPLING_EXPORT void changeSurjectiveFormat(int targetNb, DataArrayInt *&arr, DataArrayInt *&arrI) const;
@@ -516,27 +522,9 @@ namespace MEDCoupling
     MEDCOUPLING_EXPORT bool isIota(int sizeExpected) const;
     MEDCOUPLING_EXPORT bool isUniform(int val) const;
     MEDCOUPLING_EXPORT bool hasUniqueValues() const;
-    MEDCOUPLING_EXPORT DataArrayInt *subArray(int tupleIdBg, int tupleIdEnd=-1) const;
-    MEDCOUPLING_EXPORT void rearrange(int newNbOfCompo);
-    MEDCOUPLING_EXPORT void transpose();
-    MEDCOUPLING_EXPORT DataArrayInt *changeNbOfComponents(int newNbOfComp, int dftValue) const;
-    MEDCOUPLING_EXPORT DataArrayInt *keepSelectedComponents(const std::vector<int>& compoIds) const;
     MEDCOUPLING_EXPORT void meldWith(const DataArrayInt *other);
     MEDCOUPLING_EXPORT void setSelectedComponents(const DataArrayInt *a, const std::vector<int>& compoIds);
-    MEDCOUPLING_EXPORT void setPartOfValues1(const DataArrayInt *a, int bgTuples, int endTuples, int stepTuples, int bgComp, int endComp, int stepComp, bool strictCompoCompare=true);
-    MEDCOUPLING_EXPORT void setPartOfValuesSimple1(int a, int bgTuples, int endTuples, int stepTuples, int bgComp, int endComp, int stepComp);
-    MEDCOUPLING_EXPORT void setPartOfValues2(const DataArrayInt *a, const int *bgTuples, const int *endTuples, const int *bgComp, const int *endComp, bool strictCompoCompare=true);
-    MEDCOUPLING_EXPORT void setPartOfValuesSimple2(int a, const int *bgTuples, const int *endTuples, const int *bgComp, const int *endComp);
-    MEDCOUPLING_EXPORT void setPartOfValues3(const DataArrayInt *a, const int *bgTuples, const int *endTuples, int bgComp, int endComp, int stepComp, bool strictCompoCompare=true);
-    MEDCOUPLING_EXPORT void setPartOfValuesSimple3(int a, const int *bgTuples, const int *endTuples, int bgComp, int endComp, int stepComp);
-    MEDCOUPLING_EXPORT void setPartOfValues4(const DataArrayInt *a, int bgTuples, int endTuples, int stepTuples, const int *bgComp, const int *endComp, bool strictCompoCompare=true);
-    MEDCOUPLING_EXPORT void setPartOfValuesSimple4(int a, int bgTuples, int endTuples, int stepTuples, const int *bgComp, const int *endComp);
-    MEDCOUPLING_EXPORT void setPartOfValuesAdv(const DataArrayInt *a, const DataArrayInt *tuplesSelec);
-    MEDCOUPLING_EXPORT void setContigPartOfSelectedValues(int tupleIdStart, const DataArray *aBase, const DataArrayInt *tuplesSelec);
-    MEDCOUPLING_EXPORT void setContigPartOfSelectedValuesSlice(int tupleIdStart, const DataArray *aBase, int bg, int end2, int step);
     MEDCOUPLING_EXPORT void getTuple(int tupleId, int *res) const { std::copy(_mem.getConstPointerLoc(tupleId*_info_on_compo.size()),_mem.getConstPointerLoc((tupleId+1)*_info_on_compo.size()),res); }
-    MEDCOUPLING_EXPORT int front() const;
-    MEDCOUPLING_EXPORT int back() const;
     MEDCOUPLING_EXPORT static void SetArrayIn(DataArrayInt *newArray, DataArrayInt* &arrayToSet);
     MEDCOUPLING_EXPORT DataArrayIntIterator *iterator();
     MEDCOUPLING_EXPORT DataArrayInt *findIdsEqual(int val) const;
@@ -556,10 +544,6 @@ namespace MEDCoupling
     MEDCOUPLING_EXPORT void accumulate(int *res) const;
     MEDCOUPLING_EXPORT int accumulate(int compId) const;
     MEDCOUPLING_EXPORT DataArrayInt *accumulatePerChunck(const int *bgOfIndex, const int *endOfIndex) const;
-    MEDCOUPLING_EXPORT int getMaxValue(int& tupleId) const;
-    MEDCOUPLING_EXPORT int getMaxValueInArray() const;
-    MEDCOUPLING_EXPORT int getMinValue(int& tupleId) const;
-    MEDCOUPLING_EXPORT int getMinValueInArray() const;
     MEDCOUPLING_EXPORT void getMinMaxValues(int& minValue, int& maxValue) const;
     MEDCOUPLING_EXPORT void abs();
     MEDCOUPLING_EXPORT DataArrayInt *computeAbs() const;
@@ -682,32 +666,15 @@ namespace MEDCoupling
     MEDCOUPLING_EXPORT std::string repr() const;
     MEDCOUPLING_EXPORT std::string reprZip() const;
     MEDCOUPLING_EXPORT DataArrayInt *convertToIntArr() const;
-    MEDCOUPLING_EXPORT DataArrayChar *renumberR(const int *new2Old) const;
-    MEDCOUPLING_EXPORT DataArrayChar *renumberAndReduce(const int *old2NewBg, int newNbOfTuple) const;
-    MEDCOUPLING_EXPORT DataArrayChar *selectByTupleId(const int *new2OldBg, const int *new2OldEnd) const;
-    MEDCOUPLING_EXPORT DataArrayChar *selectByTupleIdSafe(const int *new2OldBg, const int *new2OldEnd) const;
-    MEDCOUPLING_EXPORT DataArrayChar *selectByTupleIdSafeSlice(int bg, int end, int step) const;
+    MEDCOUPLING_EXPORT DataArrayChar *selectByTupleId(const int *new2OldBg, const int *new2OldEnd) const { return DataArrayTemplate<char>::mySelectByTupleId(new2OldBg,new2OldEnd); }
+    MEDCOUPLING_EXPORT DataArrayChar *selectByTupleId(const DataArrayInt& di) const { return DataArrayTemplate<char>::mySelectByTupleId(di); }
+    MEDCOUPLING_EXPORT DataArrayChar *selectByTupleIdSafe(const int *new2OldBg, const int *new2OldEnd) const { return DataArrayTemplate<char>::mySelectByTupleIdSafe(new2OldBg,new2OldEnd); }
+    MEDCOUPLING_EXPORT DataArrayChar *keepSelectedComponents(const std::vector<int>& compoIds) const { return DataArrayTemplate<char>::myKeepSelectedComponents(compoIds); }
+    MEDCOUPLING_EXPORT DataArrayChar *selectByTupleIdSafeSlice(int bg, int end, int step) const { return DataArrayTemplate<char>::mySelectByTupleIdSafeSlice(bg,end,step); }
     MEDCOUPLING_EXPORT bool isUniform(char val) const;
-    MEDCOUPLING_EXPORT void rearrange(int newNbOfCompo);
-    MEDCOUPLING_EXPORT DataArrayChar *subArray(int tupleIdBg, int tupleIdEnd=-1) const;
-    MEDCOUPLING_EXPORT DataArrayChar *changeNbOfComponents(int newNbOfComp, char dftValue) const;
-    MEDCOUPLING_EXPORT DataArrayChar *keepSelectedComponents(const std::vector<int>& compoIds) const;
     MEDCOUPLING_EXPORT void meldWith(const DataArrayChar *other);
-    MEDCOUPLING_EXPORT void setPartOfValues1(const DataArrayChar *a, int bgTuples, int endTuples, int stepTuples, int bgComp, int endComp, int stepComp, bool strictCompoCompare=true);
-    MEDCOUPLING_EXPORT void setPartOfValuesSimple1(char a, int bgTuples, int endTuples, int stepTuples, int bgComp, int endComp, int stepComp);
-    MEDCOUPLING_EXPORT void setPartOfValues2(const DataArrayChar *a, const int *bgTuples, const int *endTuples, const int *bgComp, const int *endComp, bool strictCompoCompare=true);
-    MEDCOUPLING_EXPORT void setPartOfValuesSimple2(char a, const int *bgTuples, const int *endTuples, const int *bgComp, const int *endComp);
-    MEDCOUPLING_EXPORT void setPartOfValues3(const DataArrayChar *a, const int *bgTuples, const int *endTuples, int bgComp, int endComp, int stepComp, bool strictCompoCompare=true);
-    MEDCOUPLING_EXPORT void setPartOfValuesSimple3(char a, const int *bgTuples, const int *endTuples, int bgComp, int endComp, int stepComp);
-    MEDCOUPLING_EXPORT void setPartOfValues4(const DataArrayChar *a, int bgTuples, int endTuples, int stepTuples, const int *bgComp, const int *endComp, bool strictCompoCompare=true);
-    MEDCOUPLING_EXPORT void setPartOfValuesSimple4(char a, int bgTuples, int endTuples, int stepTuples, const int *bgComp, const int *endComp);
-    MEDCOUPLING_EXPORT void setPartOfValuesAdv(const DataArrayChar *a, const DataArrayChar *tuplesSelec);
-    MEDCOUPLING_EXPORT void setContigPartOfSelectedValues(int tupleIdStart, const DataArray *aBase, const DataArrayInt *tuplesSelec);
-    MEDCOUPLING_EXPORT void setContigPartOfSelectedValuesSlice(int tupleIdStart, const DataArray *aBase, int bg, int end2, int step);
-    MEDCOUPLING_EXPORT DataArray *selectByTupleRanges(const std::vector<std::pair<int,int> >& ranges) const;
+    MEDCOUPLING_EXPORT DataArray *selectByTupleRanges(const std::vector<std::pair<int,int> >& ranges) const { return DataArrayTemplate<char>::mySelectByTupleRanges(ranges); }
     MEDCOUPLING_EXPORT void getTuple(int tupleId, char *res) const { std::copy(_mem.getConstPointerLoc(tupleId*_info_on_compo.size()),_mem.getConstPointerLoc((tupleId+1)*_info_on_compo.size()),res); }
-    MEDCOUPLING_EXPORT char front() const;
-    MEDCOUPLING_EXPORT char back() const;
     MEDCOUPLING_EXPORT DataArrayInt *findIdsEqual(char val) const;
     MEDCOUPLING_EXPORT DataArrayInt *findIdsNotEqual(char val) const;
     MEDCOUPLING_EXPORT int findIdSequence(const std::vector<char>& vals) const;
@@ -717,10 +684,6 @@ namespace MEDCoupling
     MEDCOUPLING_EXPORT bool presenceOfTuple(const std::vector<char>& tupl) const;
     MEDCOUPLING_EXPORT bool presenceOfValue(char value) const;
     MEDCOUPLING_EXPORT bool presenceOfValue(const std::vector<char>& vals) const;
-    MEDCOUPLING_EXPORT char getMaxValue(int& tupleId) const;
-    MEDCOUPLING_EXPORT char getMaxValueInArray() const;
-    MEDCOUPLING_EXPORT char getMinValue(int& tupleId) const;
-    MEDCOUPLING_EXPORT char getMinValueInArray() const;
     MEDCOUPLING_EXPORT DataArrayInt *findIdsInRange(char vmin, char vmax) const;
     MEDCOUPLING_EXPORT static DataArrayChar *Aggregate(const DataArrayChar *a1, const DataArrayChar *a2);
     MEDCOUPLING_EXPORT static DataArrayChar *Aggregate(const std::vector<const DataArrayChar *>& arr);
@@ -856,7 +819,12 @@ namespace MEDCoupling
     char *_pt;
     int _nb_of_compo;
   };
+}
+
+#include "MEDCouplingMemArray.txx"
 
+namespace MEDCoupling
+{
   template<class InputIterator>
   void DataArrayDouble::insertAtTheEnd(InputIterator first, InputIterator last)
   {
index 52d50034074ddd33422bf58dd7809182b5c9d2b7..9ea54b20e9dae800390dbd363d66790e2b0663f8 100644 (file)
@@ -937,6 +937,1203 @@ namespace MEDCoupling
     ret->copyStringInfoFrom(*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 \c this one.
+   * If a permutation reduction is needed, subArray() or selectByTupleId() should be used.
+   * For more info on renumbering see \ref numbering.
+   *  \param [in] new2Old - C array of length equal to \a this->getNumberOfTuples()
+   *     giving a previous position of i-th new value.
+   *  \return DataArrayDouble * - the new instance of DataArrayDouble that the caller
+   *          is to delete using decrRef() as it is no more needed.
+   */
+  template<class T>
+  typename Traits<T>::ArrayType *DataArrayTemplate<T>::renumberR(const int *new2Old) const
+  {
+    checkAllocated();
+    int nbTuples(getNumberOfTuples()),nbOfCompo(getNumberOfComponents());
+    MCAuto<DataArray> ret0(buildNewEmptyInstance());
+    MCAuto< typename Traits<T>::ArrayType > ret(DynamicCastSafe<DataArray,typename Traits<T>::ArrayType>(ret0));
+    ret->alloc(nbTuples,nbOfCompo);
+    ret->copyStringInfoFrom(*this);
+    const T *iptr(getConstPointer());
+    T *optr(ret->getPointer());
+    for(int i=0;i<nbTuples;i++)
+      std::copy(iptr+nbOfCompo*new2Old[i],iptr+nbOfCompo*(new2Old[i]+1),optr+i*nbOfCompo);
+    ret->copyStringInfoFrom(*this);
+    return ret.retn();
+  }
+
+  /*!
+   * Returns a shorten and permuted copy of \a this array. The new DataArrayDouble 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 numbering.
+   *  \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 DataArrayDouble * - the new instance of DataArrayDouble that the caller
+   *          is to delete using decrRef() as it is no more needed.
+   */
+  template<class T>
+  typename Traits<T>::ArrayType *DataArrayTemplate<T>::renumberAndReduce(const int *old2New, int newNbOfTuple) const
+  {
+    checkAllocated();
+    int nbTuples(getNumberOfTuples()),nbOfCompo(getNumberOfComponents());
+    MCAuto<DataArray> ret0(buildNewEmptyInstance());
+    MCAuto< typename Traits<T>::ArrayType > ret(DynamicCastSafe<DataArray,typename Traits<T>::ArrayType>(ret0));
+    ret->alloc(newNbOfTuple,nbOfCompo);
+    const T *iptr=getConstPointer();
+    T *optr=ret->getPointer();
+    for(int i=0;i<nbTuples;i++)
+      {
+        int w=old2New[i];
+        if(w>=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 DataArrayDouble 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 numbering.
+   *  \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 DataArrayDouble * - the new instance of DataArrayDouble that the caller
+   *          is to delete using decrRef() as it is no more needed.
+   */
+  template<class T>
+  typename Traits<T>::ArrayType *DataArrayTemplate<T>::mySelectByTupleId(const int *new2OldBg, const int *new2OldEnd) const
+  {
+    checkAllocated();
+    MCAuto<DataArray> ret0(buildNewEmptyInstance());
+    MCAuto< typename Traits<T>::ArrayType > ret(DynamicCastSafe<DataArray,typename Traits<T>::ArrayType>(ret0));
+    int nbComp(getNumberOfComponents());
+    ret->alloc((int)std::distance(new2OldBg,new2OldEnd),nbComp);
+    ret->copyStringInfoFrom(*this);
+    T *pt(ret->getPointer());
+    const T *srcPt(getConstPointer());
+    int i(0);
+    for(const int *w=new2OldBg;w!=new2OldEnd;w++,i++)
+      std::copy(srcPt+(*w)*nbComp,srcPt+((*w)+1)*nbComp,pt+i*nbComp);
+    ret->copyStringInfoFrom(*this);
+    return ret.retn();
+  }
+
+  template<class T>
+  typename Traits<T>::ArrayType *DataArrayTemplate<T>::mySelectByTupleId(const DataArrayInt& di) const
+  {
+    return DataArrayTemplate<T>::mySelectByTupleId(di.begin(),di.end());
+  }
+  
+  /*!
+   * Returns a shorten and permuted copy of \a this array. The new DataArrayDouble 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 numbering.
+   *  \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 DataArrayDouble * - the new instance of DataArrayDouble that the caller
+   *          is to delete using decrRef() as it is no more needed.
+   *  \throw If \a new2OldEnd - \a new2OldBg > \a this->getNumberOfTuples().
+   */
+  template<class T>
+  typename Traits<T>::ArrayType *DataArrayTemplate<T>::mySelectByTupleIdSafe(const int *new2OldBg, const int *new2OldEnd) const
+  {
+    checkAllocated();
+    MCAuto<DataArray> ret0(buildNewEmptyInstance());
+    MCAuto< typename Traits<T>::ArrayType > ret(DynamicCastSafe<DataArray,typename Traits<T>::ArrayType>(ret0));
+    int nbComp(getNumberOfComponents()),oldNbOfTuples(getNumberOfTuples());
+    ret->alloc((int)std::distance(new2OldBg,new2OldEnd),nbComp);
+    ret->copyStringInfoFrom(*this);
+    T *pt(ret->getPointer());
+    const T *srcPt(getConstPointer());
+    int i(0);
+    for(const int *w=new2OldBg;w!=new2OldEnd;w++,i++)
+      if(*w>=0 && *w<oldNbOfTuples)
+        std::copy(srcPt+(*w)*nbComp,srcPt+((*w)+1)*nbComp,pt+i*nbComp);
+      else
+        {
+          std::ostringstream oss; oss << Traits<T>::ArrayTypeName << "::selectByTupleIdSafe : some ids has been detected to be out of [0,this->getNumberOfTuples) !";
+          throw INTERP_KERNEL::Exception(oss.str().c_str());
+        }
+    ret->copyStringInfoFrom(*this);
+    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!
+   */
+  template<class T>
+  void DataArrayTemplate<T>::rearrange(int newNbOfCompo)
+  {
+    checkAllocated();
+    if(newNbOfCompo<1)
+      {
+        std::ostringstream oss; oss << Traits<T>::ArrayTypeName << "::rearrange : input newNbOfCompo must be > 0 !";
+        throw INTERP_KERNEL::Exception(oss.str().c_str());
+      }
+    std::size_t nbOfElems=getNbOfElems();
+    if(nbOfElems%newNbOfCompo!=0)
+      {
+        std::ostringstream oss; oss << Traits<T>::ArrayTypeName << "::rearrange : nbOfElems%newNbOfCompo!=0 !";
+        throw INTERP_KERNEL::Exception(oss.str().c_str());
+      }
+    if(nbOfElems/newNbOfCompo>(std::size_t)std::numeric_limits<int>::max())
+      {
+        std::ostringstream oss; oss << Traits<T>::ArrayTypeName << "::rearrange : the rearrangement leads to too high number of tuples (> 2147483647) !";
+        throw INTERP_KERNEL::Exception(oss.str().c_str());
+      }
+    _info_on_compo.clear();
+    _info_on_compo.resize(newNbOfCompo);
+    declareAsNew();
+  }
+
+  /*!
+   * Changes the number of components within \a this array to be equal to its number
+   * 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.
+   *  \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()
+   */
+  template<class T>
+  void DataArrayTemplate<T>::transpose()
+  {
+    checkAllocated();
+    int nbOfTuples(getNumberOfTuples());
+    rearrange(nbOfTuples);
+  }
+
+  /*!
+   * 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 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.
+   */
+  template<class T>
+  typename Traits<T>::ArrayType *DataArrayTemplate<T>::changeNbOfComponents(int newNbOfComp, T dftValue) const
+  {
+    checkAllocated();
+    MCAuto<DataArray> ret0(buildNewEmptyInstance());
+    MCAuto< typename Traits<T>::ArrayType > ret(DynamicCastSafe<DataArray,typename Traits<T>::ArrayType>(ret0));
+    ret->alloc(getNumberOfTuples(),newNbOfComp);
+    const T *oldc(getConstPointer());
+    T *nc(ret->getPointer());
+    int nbOfTuples(getNumberOfTuples()),oldNbOfComp(getNumberOfComponents());
+    int dim(std::min(oldNbOfComp,newNbOfComp));
+    for(int i=0;i<nbOfTuples;i++)
+      {
+        int j=0;
+        for(;j<dim;j++)
+          nc[newNbOfComp*i+j]=oldc[i*oldNbOfComp+j];
+        for(;j<newNbOfComp;j++)
+          nc[newNbOfComp*i+j]=dftValue;
+      }
+    ret->setName(getName());
+    for(int i=0;i<dim;i++)
+      ret->setInfoOnComponent(i,getInfoOnComponent(i));
+    ret->setName(getName());
+    return ret.retn();
+  }
+
+  /*!
+   * Returns a copy of \a this array composed of selected components.
+   * The new DataArrayDouble 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 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.
+   *  \throw If a component index (\a i) is not valid: 
+   *         \a i < 0 || \a i >= \a this->getNumberOfComponents().
+   *
+   *  \if ENABLE_EXAMPLES
+   *  \ref py_mcdataarraydouble_KeepSelectedComponents "Here is a Python example".
+   *  \endif
+   */
+  template<class T>
+  typename Traits<T>::ArrayType *DataArrayTemplate<T>::myKeepSelectedComponents(const std::vector<int>& compoIds) const
+  {
+    checkAllocated();
+    MCAuto<DataArray> ret0(buildNewEmptyInstance());
+    MCAuto< typename Traits<T>::ArrayType > ret(DynamicCastSafe<DataArray,typename Traits<T>::ArrayType>(ret0));
+    std::size_t newNbOfCompo(compoIds.size());
+    int oldNbOfCompo(getNumberOfComponents());
+    for(std::vector<int>::const_iterator it=compoIds.begin();it!=compoIds.end();it++)
+      if((*it)<0 || (*it)>=oldNbOfCompo)
+        {
+          std::ostringstream oss; oss << Traits<T>::ArrayTypeName << "::keepSelectedComponents : invalid requested component : " << *it << " whereas it should be in [0," << oldNbOfCompo << ") !";
+          throw INTERP_KERNEL::Exception(oss.str().c_str());
+        }
+    int nbOfTuples(getNumberOfTuples());
+    ret->alloc(nbOfTuples,(int)newNbOfCompo);
+    ret->copyPartOfStringInfoFrom(*this,compoIds);
+    const T *oldc(getConstPointer());
+    T *nc(ret->getPointer());
+    for(int i=0;i<nbOfTuples;i++)
+      for(std::size_t j=0;j<newNbOfCompo;j++,nc++)
+        *nc=oldc[i*oldNbOfCompo+compoIds[j]];
+    return ret.retn();
+  }
+
+  /*!
+   * Returns a shorten copy of \a this array. The new DataArrayDouble 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 selectByTupleIdSafeSlice().
+   *  \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 DataArrayDouble * - the new instance of DataArrayDouble 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 DataArrayDouble::selectByTupleIdSafeSlice
+   */
+  template<class T>
+  typename Traits<T>::ArrayType *DataArrayTemplate<T>::subArray(int tupleIdBg, int tupleIdEnd) const
+  {
+    checkAllocated();
+    int nbt(getNumberOfTuples());
+    if(tupleIdBg<0)
+      {
+        std::ostringstream oss; oss << Traits<T>::ArrayTypeName << "::subArray : The tupleIdBg parameter must be greater than 0 !";
+        throw INTERP_KERNEL::Exception(oss.str().c_str());
+      }
+    if(tupleIdBg>nbt)
+      {
+        std::ostringstream oss; oss << Traits<T>::ArrayTypeName << ":subArray : The tupleIdBg parameter is greater than number of tuples !";
+        throw INTERP_KERNEL::Exception(oss.str().c_str());
+      }
+    int trueEnd=tupleIdEnd;
+    if(tupleIdEnd!=-1)
+      {
+        if(tupleIdEnd>nbt)
+          {
+            std::ostringstream oss; oss << Traits<T>::ArrayTypeName << ":subArray : The tupleIdBg parameter is greater than number of tuples !";
+            throw INTERP_KERNEL::Exception(oss.str().c_str());
+          }
+      }
+    else
+      trueEnd=nbt;
+    int nbComp(getNumberOfComponents());
+    MCAuto<DataArray> ret0(buildNewEmptyInstance());
+    MCAuto< typename Traits<T>::ArrayType > ret(DynamicCastSafe<DataArray,typename Traits<T>::ArrayType>(ret0));
+    ret->alloc(trueEnd-tupleIdBg,nbComp);
+    ret->copyStringInfoFrom(*this);
+    std::copy(getConstPointer()+tupleIdBg*nbComp,getConstPointer()+trueEnd*nbComp,ret->getPointer());
+    return ret.retn();
+  }
+
+  /*!
+   * Returns a shorten copy of \a this array. The new DataArrayDouble 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 numbering.
+   *  \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 DataArrayDouble * - the new instance of DataArrayDouble that the caller
+   *          is to delete using decrRef() as it is no more needed.
+   *  \sa DataArrayDouble::subArray.
+   */
+  template<class T>
+  typename Traits<T>::ArrayType *DataArrayTemplate<T>::mySelectByTupleIdSafeSlice(int bg, int end2, int step) const
+  {
+    checkAllocated();
+    MCAuto<DataArray> ret0(buildNewEmptyInstance());
+    MCAuto< typename Traits<T>::ArrayType > ret(DynamicCastSafe<DataArray,typename Traits<T>::ArrayType>(ret0));
+    int nbComp(getNumberOfComponents());
+    std::ostringstream oss; oss << Traits<T>::ArrayTypeName << "::selectByTupleIdSafeSlice : ";
+    int newNbOfTuples(GetNumberOfItemGivenBESRelative(bg,end2,step,oss.str()));
+    ret->alloc(newNbOfTuples,nbComp);
+    T *pt(ret->getPointer());
+    const T *srcPt(getConstPointer()+bg*nbComp);
+    for(int i=0;i<newNbOfTuples;i++,srcPt+=step*nbComp)
+      std::copy(srcPt,srcPt+nbComp,pt+i*nbComp);
+    ret->copyStringInfoFrom(*this);
+    return ret.retn();
+  }
+  
+  /*!
+   * Copy all values from another DataArrayDouble into specified tuples and components
+   * of \a this array. Textual data is not copied.
+   * The tree parameters defining set of indices of tuples and components are similar to
+   * the tree parameters of the Python function \c range(\c start,\c stop,\c step).
+   *  \param [in] a - the array to copy values from.
+   *  \param [in] bgTuples - index of the first tuple of \a this array to assign values to.
+   *  \param [in] endTuples - index of the tuple before which the tuples to assign to
+   *              are located.
+   *  \param [in] stepTuples - index increment to get index of the next tuple to assign to.
+   *  \param [in] bgComp - index of the first component of \a this array to assign values 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 - if \a true (by default), then \a a->getNumberOfComponents() 
+   *              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_mcdataarraydouble_setpartofvalues1 "Here is a Python example".
+   *  \endif
+   */
+  template<class T>
+  void DataArrayTemplate<T>::setPartOfValues1(const typename Traits<T>::ArrayType *a, int bgTuples, int endTuples, int stepTuples, int bgComp, int endComp, int stepComp, bool strictCompoCompare)
+  {
+    if(!a)
+      {
+        std::ostringstream oss; oss << Traits<T>::ArrayTypeName << "::setPartOfValues1 : input DataArrayDouble is NULL !";
+        throw INTERP_KERNEL::Exception(oss.str().c_str());
+      }
+    const char msg[]="DataArrayTemplate::setPartOfValues1";
+    checkAllocated();
+    a->checkAllocated();
+    int newNbOfTuples(DataArray::GetNumberOfItemGivenBES(bgTuples,endTuples,stepTuples,msg));
+    int newNbOfComp(DataArray::GetNumberOfItemGivenBES(bgComp,endComp,stepComp,msg));
+    int nbComp(getNumberOfComponents()),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;
+      }
+    const T *srcPt(a->getConstPointer());
+    T *pt(getPointer()+bgTuples*nbComp+bgComp);
+    if(assignTech)
+      {
+        for(int i=0;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
+          for(int j=0;j<newNbOfComp;j++,srcPt++)
+            pt[j*stepComp]=*srcPt;
+      }
+    else
+      {
+        for(int i=0;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
+          {
+            const T*srcPt2=srcPt;
+            for(int j=0;j<newNbOfComp;j++,srcPt2++)
+              pt[j*stepComp]=*srcPt2;
+          }
+      }
+  }
+  
+  /*!
+ * Assign a given value to values at specified tuples and components of \a this array.
+ * The tree parameters defining set of indices of tuples and components are similar to
+ * the tree parameters of the Python function \c range(\c start,\c stop,\c step)..
+ *  \param [in] a - the value to assign.
+ *  \param [in] bgTuples - index of the first tuple of \a this array to assign to.
+ *  \param [in] endTuples - index of the tuple before which the tuples to assign to
+ *              are located.
+ *  \param [in] stepTuples - index increment to get index of the next tuple to assign to.
+ *  \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 parameters specifying tuples and components to assign to, do not give a
+ *            non-empty range of increasing indices or indices are out of a valid range
+ *            for \c this array.
+ *
+ *  \if ENABLE_EXAMPLES
+ *  \ref py_mcdataarraydouble_setpartofvaluessimple1 "Here is a Python example".
+ *  \endif
+ */
+  template<class T>
+  void DataArrayTemplate<T>::setPartOfValuesSimple1(T a, int bgTuples, int endTuples, int stepTuples, int bgComp, int endComp, int stepComp)
+  {
+    const char msg[]="DataArrayTemplate::setPartOfValuesSimple1";
+    checkAllocated();
+    int newNbOfTuples(DataArray::GetNumberOfItemGivenBES(bgTuples,endTuples,stepTuples,msg));
+    int newNbOfComp(DataArray::GetNumberOfItemGivenBES(bgComp,endComp,stepComp,msg));
+    int nbComp(getNumberOfComponents()),nbOfTuples(getNumberOfTuples());
+    DataArray::CheckValueInRangeEx(nbOfTuples,bgTuples,endTuples,"invalid tuple value");
+    DataArray::CheckValueInRangeEx(nbComp,bgComp,endComp,"invalid component value");
+    T *pt=getPointer()+bgTuples*nbComp+bgComp;
+    for(int i=0;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
+      for(int j=0;j<newNbOfComp;j++)
+        pt[j*stepComp]=a;
+  }
+  
+  /*!
+   * Copy all values from another DataArrayDouble (\a a) into specified tuples and 
+   * components of \a this array. Textual data is not copied.
+   * The tuples and components to assign to are defined by C arrays of indices.
+   * 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 <em>(pi)</em> 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 <em>(pi)</em> 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 <em>bgTuples / bgComp</em> is
+   *         out of a valid range for \a this array.
+   *  \throw In the first *mode of usage*, if <em>strictCompoCompare == true </em> and
+   *         if <em> a->getNumberOfComponents() != (endComp - bgComp) </em>.
+   *  \throw In the second *mode of usage*, if \a a->getNumberOfTuples() != 1 or
+   *         <em> a->getNumberOfComponents() != (endComp - bgComp)</em>.
+   *
+   *  \if ENABLE_EXAMPLES
+   *  \ref py_mcdataarraydouble_setpartofvalues2 "Here is a Python example".
+   *  \endif
+   */
+  template<class T>
+  void DataArrayTemplate<T>::setPartOfValues2(const typename Traits<T>::ArrayType *a, const int *bgTuples, const int *endTuples, const int *bgComp, const int *endComp, bool strictCompoCompare)
+  {
+    if(!a)
+      throw INTERP_KERNEL::Exception("DataArrayDouble::setPartOfValues2 : input DataArrayDouble is NULL !");
+    const char msg[]="DataArrayTemplate::setPartOfValues2";
+    checkAllocated();
+    a->checkAllocated();
+    int nbComp(getNumberOfComponents()),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;
+      }
+    T *pt(getPointer());
+    const T *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 T *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 <em>bgTuples / bgComp</em> is
+   *         out of a valid range for \a this array.
+   *
+   *  \if ENABLE_EXAMPLES
+   *  \ref py_mcdataarraydouble_setpartofvaluessimple2 "Here is a Python example".
+   *  \endif
+   */
+  template<class T>
+  void DataArrayTemplate<T>::setPartOfValuesSimple2(T a, const int *bgTuples, const int *endTuples, const int *bgComp, const int *endComp)
+  {
+    checkAllocated();
+    int nbComp(getNumberOfComponents()),nbOfTuples(getNumberOfTuples());
+    for(const int *z=bgComp;z!=endComp;z++)
+      DataArray::CheckValueInRange(nbComp,*z,"invalid component id");
+    T *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 DataArrayDouble (\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 <em>(pi)</em> 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 <em>strictCompoCompare == true </em> and
+   *         if <em> a->getNumberOfComponents()</em> is unequal to the number of components
+   *         defined by <em>(bgComp,endComp,stepComp)</em>.
+   *  \throw In the second *mode of usage*, if \a a->getNumberOfTuples() != 1 or
+   *         <em> a->getNumberOfComponents()</em> is unequal to the number of components
+   *         defined by <em>(bgComp,endComp,stepComp)</em>.
+   *  \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 \c this array.
+   *
+   *  \if ENABLE_EXAMPLES
+   *  \ref py_mcdataarraydouble_setpartofvalues3 "Here is a Python example".
+   *  \endif
+   */
+  template<class T>
+  void DataArrayTemplate<T>::setPartOfValues3(const typename Traits<T>::ArrayType *a, const int *bgTuples, const int *endTuples, int bgComp, int endComp, int stepComp, bool strictCompoCompare)
+  {
+    if(!a)
+      throw INTERP_KERNEL::Exception("DataArrayTemplate::setPartOfValues3 : input DataArrayDouble is NULL !");
+    const char msg[]="DataArrayTemplate::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;
+      }
+    T *pt(getPointer()+bgComp);
+    const T *srcPt(a->getConstPointer());
+    if(assignTech)
+      {
+        for(const int *w=bgTuples;w!=endTuples;w++)
+          for(int j=0;j<newNbOfComp;j++,srcPt++)
+            {
+              DataArray::CheckValueInRange(nbOfTuples,*w,"invalid tuple id");
+              pt[(std::size_t)(*w)*nbComp+j*stepComp]=*srcPt;
+            }
+      }
+    else
+      {
+        for(const int *w=bgTuples;w!=endTuples;w++)
+          {
+            const T *srcPt2=srcPt;
+            for(int j=0;j<newNbOfComp;j++,srcPt2++)
+              {
+                DataArray::CheckValueInRange(nbOfTuples,*w,"invalid tuple id");
+                pt[(std::size_t)(*w)*nbComp+j*stepComp]=*srcPt2;
+              }
+          }
+      }
+  }
+  
+  /*!
+   * Assign a given value to values at specified tuples and components of \a this array.
+   * 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).
+   *  \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 <em>(pi)</em> 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 \c this array.
+   *
+   *  \if ENABLE_EXAMPLES
+   *  \ref py_mcdataarraydouble_setpartofvaluessimple3 "Here is a Python example".
+   *  \endif
+   */
+  template<class T>
+  void DataArrayTemplate<T>::setPartOfValuesSimple3(T a, const int *bgTuples, const int *endTuples, int bgComp, int endComp, int stepComp)
+  {
+    const char msg[]="DataArrayTemplate::setPartOfValuesSimple3";
+    checkAllocated();
+    int newNbOfComp(DataArray::GetNumberOfItemGivenBES(bgComp,endComp,stepComp,msg));
+    int nbComp(getNumberOfComponents()),nbOfTuples(getNumberOfTuples());
+    DataArray::CheckValueInRangeEx(nbComp,bgComp,endComp,"invalid component value");
+    T *pt(getPointer()+bgComp);
+    for(const int *w=bgTuples;w!=endTuples;w++)
+      for(int j=0;j<newNbOfComp;j++)
+        {
+          DataArray::CheckValueInRange(nbOfTuples,*w,"invalid tuple id");
+          pt[(std::size_t)(*w)*nbComp+j*stepComp]=a;
+        }
+  }
+
+  /*!
+   * Copy all values from another DataArrayDouble into specified tuples and components
+   * of \a this array. Textual data is not copied.
+   * The tree parameters defining set of indices of tuples and components are similar to
+   * the tree parameters of the Python function \c range(\c start,\c stop,\c step).
+   *  \param [in] a - the array to copy values from.
+   *  \param [in] bgTuples - index of the first tuple of \a this array to assign values to.
+   *  \param [in] endTuples - index of the tuple before which the tuples to assign to
+   *              are located.
+   *  \param [in] stepTuples - index increment to get index of the next tuple to assign to.
+   *  \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.
+   *  \param [in] strictCompoCompare - if \a true (by default), then \a a->getNumberOfComponents() 
+   *              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)).
+   *
+   */
+  template<class T>
+  void DataArrayTemplate<T>::setPartOfValues4(const typename Traits<T>::ArrayType *a, int bgTuples, int endTuples, int stepTuples, const int *bgComp, const int *endComp, bool strictCompoCompare)
+  {if(!a)
+      throw INTERP_KERNEL::Exception("DataArrayTemplate::setPartOfValues4 : input DataArrayTemplate is NULL !");
+    const char msg[]="DataArrayTemplate::setPartOfValues4";
+    checkAllocated();
+    a->checkAllocated();
+    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 T *srcPt(a->getConstPointer());
+    T *pt(getPointer()+bgTuples*nbComp);
+    if(assignTech)
+      {
+        for(int i=0;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
+          for(const int *z=bgComp;z!=endComp;z++,srcPt++)
+            pt[*z]=*srcPt;
+      }
+    else
+      {
+      for(int i=0;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
+        {
+          const T *srcPt2(srcPt);
+          for(const int *z=bgComp;z!=endComp;z++,srcPt2++)
+            pt[*z]=*srcPt2;
+        }
+      }
+  }
+
+  template<class T>
+  void DataArrayTemplate<T>::setPartOfValuesSimple4(T a, int bgTuples, int endTuples, int stepTuples, const int *bgComp, const int *endComp)
+  {
+    const char msg[]="DataArrayTemplate::setPartOfValuesSimple4";
+    checkAllocated();
+    int newNbOfTuples(DataArray::GetNumberOfItemGivenBES(bgTuples,endTuples,stepTuples,msg));
+    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");
+    T *pt=getPointer()+bgTuples*nbComp;
+    for(int i=0;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
+      for(const int *z=bgComp;z!=endComp;z++)
+        pt[*z]=a;
+  }
+  
+  /*!
+   * Copy some tuples from another DataArrayDouble into specified tuples
+   * of \a this array. Textual data is not copied. Both arrays must have equal number of
+   * components.
+   * Both the tuples to assign and the tuples to assign to are defined by a DataArrayInt.
+   * All components of selected tuples are copied.
+   *  \param [in] a - the array to copy values from.
+   *  \param [in] tuplesSelec - the array specifying both source tuples of \a a and
+   *              target tuples of \a this. \a tuplesSelec has two components, and the
+   *              first component specifies index of the source tuple and the second
+   *              one specifies index of the target tuple.
+   *  \throw If \a this is not allocated.
+   *  \throw If \a a is NULL.
+   *  \throw If \a a is not allocated.
+   *  \throw If \a tuplesSelec is NULL.
+   *  \throw If \a tuplesSelec is not allocated.
+   *  \throw If <em>this->getNumberOfComponents() != a->getNumberOfComponents()</em>.
+   *  \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.
+   */
+  template<class T>
+  void DataArrayTemplate<T>::setPartOfValuesAdv(const typename Traits<T>::ArrayType *a, const DataArrayInt *tuplesSelec)
+  {
+    if(!a || !tuplesSelec)
+      throw INTERP_KERNEL::Exception("DataArrayTemplate::setPartOfValuesAdv : input DataArrayTemplate is NULL !");
+    checkAllocated();
+    a->checkAllocated();
+    tuplesSelec->checkAllocated();
+    int nbOfComp=getNumberOfComponents();
+    if(nbOfComp!=a->getNumberOfComponents())
+      throw INTERP_KERNEL::Exception("DataArrayTemplate::setPartOfValuesAdv : This and a do not have the same number of components !");
+    if(tuplesSelec->getNumberOfComponents()!=2)
+      throw INTERP_KERNEL::Exception("DataArrayTemplate::setPartOfValuesAdv : Expecting to have a tuple selector DataArrayInt instance with exactly 2 components !");
+    int thisNt(getNumberOfTuples());
+    int aNt(a->getNumberOfTuples());
+    T *valsToSet(getPointer());
+    const T *valsSrc(a->getConstPointer());
+    for(const int *tuple=tuplesSelec->begin();tuple!=tuplesSelec->end();tuple+=2)
+    {
+      if(tuple[1]>=0 && tuple[1]<aNt)
+        {
+          if(tuple[0]>=0 && tuple[0]<thisNt)
+            std::copy(valsSrc+nbOfComp*tuple[1],valsSrc+nbOfComp*(tuple[1]+1),valsToSet+nbOfComp*tuple[0]);
+          else
+            {
+              std::ostringstream oss; oss << "DataArrayTemplate::setPartOfValuesAdv : Tuple #" << std::distance(tuplesSelec->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 << "DataArrayTemplate::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 DataArrayDouble (\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 DataArrayInt.
+   * 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 a 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 <em>this->getNumberOfComponents() != aBase->getNumberOfComponents()</em>.
+   *  \throw If \a tuplesSelec->getNumberOfComponents() != 1.
+   *  \throw If <em>tupleIdStart + tuplesSelec->getNumberOfTuples() > this->getNumberOfTuples().</em>
+   *  \throw If any tuple index given by \a tuplesSelec is out of a valid range for 
+   *         \a aBase array.
+ */
+  template<class T>
+  void DataArrayTemplate<T>::setContigPartOfSelectedValues(int tupleIdStart, const DataArray *aBase, const DataArrayInt *tuplesSelec)
+  {
+    if(!aBase || !tuplesSelec)
+      throw INTERP_KERNEL::Exception("DataArrayTemplate::setContigPartOfSelectedValues : input DataArray is NULL !");
+    const typename Traits<T>::ArrayType *a(dynamic_cast<const typename Traits<T>::ArrayType *>(aBase));
+    if(!a)
+      throw INTERP_KERNEL::Exception("DataArrayTemplate::setContigPartOfSelectedValues : input DataArray aBase is not a DataArrayDouble !");
+    checkAllocated();
+    a->checkAllocated();
+    tuplesSelec->checkAllocated();
+    int nbOfComp(getNumberOfComponents());
+    if(nbOfComp!=a->getNumberOfComponents())
+      throw INTERP_KERNEL::Exception("DataArrayTemplate::setContigPartOfSelectedValues : This and a do not have the same number of components !");
+    if(tuplesSelec->getNumberOfComponents()!=1)
+      throw INTERP_KERNEL::Exception("DataArrayTemplate::setContigPartOfSelectedValues : Expecting to have a tuple selector DataArrayInt instance with exactly 1 component !");
+    int thisNt(getNumberOfTuples());
+    int aNt(a->getNumberOfTuples());
+    int nbOfTupleToWrite(tuplesSelec->getNumberOfTuples());
+    T *valsToSet(getPointer()+tupleIdStart*nbOfComp);
+    if(tupleIdStart+nbOfTupleToWrite>thisNt)
+      throw INTERP_KERNEL::Exception("DataArrayTemplate::setContigPartOfSelectedValues : invalid number range of values to write !");
+    const T *valsSrc=a->getConstPointer();
+    for(const int *tuple=tuplesSelec->begin();tuple!=tuplesSelec->end();tuple++,valsToSet+=nbOfComp)
+      {
+        if(*tuple>=0 && *tuple<aNt)
+          {
+            std::copy(valsSrc+nbOfComp*(*tuple),valsSrc+nbOfComp*(*tuple+1),valsToSet);
+          }
+        else
+          {
+            std::ostringstream oss; oss << Traits<T>::ArrayTypeName << "::setContigPartOfSelectedValues : Tuple #" << std::distance(tuplesSelec->begin(),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 DataArrayDouble (\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 <em>this->getNumberOfComponents() != aBase->getNumberOfComponents()</em>.
+   *  \throw If <em>tupleIdStart + len(range(bg,end2,step)) > this->getNumberOfTuples().</em>
+   *  \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.
+   */
+  template<class T>
+  void DataArrayTemplate<T>::setContigPartOfSelectedValuesSlice(int tupleIdStart, const DataArray *aBase, int bg, int end2, int step)
+  {
+    if(!aBase)
+      {
+        std::ostringstream oss; oss << Traits<T>::ArrayTypeName << "::setContigPartOfSelectedValuesSlice : input DataArray is NULL !";
+        throw INTERP_KERNEL::Exception(oss.str().c_str());
+      }
+    const typename Traits<T>::ArrayType *a(dynamic_cast<const typename Traits<T>::ArrayType *>(aBase));
+    if(!a)
+      throw INTERP_KERNEL::Exception("DataArrayTemplate::setContigPartOfSelectedValuesSlice : input DataArray aBase is not a DataArrayDouble !");
+    checkAllocated();
+    a->checkAllocated();
+    int nbOfComp(getNumberOfComponents());
+    const char msg[]="DataArrayDouble::setContigPartOfSelectedValuesSlice";
+    int nbOfTupleToWrite(DataArray::GetNumberOfItemGivenBES(bg,end2,step,msg));
+    if(nbOfComp!=a->getNumberOfComponents())
+      throw INTERP_KERNEL::Exception("DataArrayTemplate::setContigPartOfSelectedValuesSlice : This and a do not have the same number of components !");
+    int thisNt(getNumberOfTuples()),aNt(a->getNumberOfTuples());
+    T *valsToSet(getPointer()+tupleIdStart*nbOfComp);
+    if(tupleIdStart+nbOfTupleToWrite>thisNt)
+      throw INTERP_KERNEL::Exception("DataArrayTemplate::setContigPartOfSelectedValuesSlice : invalid number range of values to write !");
+    if(end2>aNt)
+      throw INTERP_KERNEL::Exception("DataArrayTemplate::setContigPartOfSelectedValuesSlice : invalid range of values to read !");
+    const T *valsSrc(a->getConstPointer()+bg*nbOfComp);
+    for(int i=0;i<nbOfTupleToWrite;i++,valsToSet+=nbOfComp,valsSrc+=step*nbOfComp)
+      {
+        std::copy(valsSrc,valsSrc+nbOfComp,valsToSet);
+      }
+  }
+
+  /*!
+   * Returns a shorten copy of \a this array. The new DataArrayDouble contains ranges
+   * of tuples specified by \a ranges parameter.
+   * For more info on renumbering see \ref numbering.
+   *  \param [in] ranges - std::vector of std::pair's each of which defines a range
+   *              of tuples in [\c begin,\c end) format.
+   *  \return DataArrayDouble * - the new instance of DataArrayDouble that the caller
+   *          is to delete using decrRef() as it is no more needed.
+   *  \throw If \a end < \a begin.
+   *  \throw If \a end > \a this->getNumberOfTuples().
+   *  \throw If \a this is not allocated.
+   */
+  template<class T>
+  typename Traits<T>::ArrayType *DataArrayTemplate<T>::mySelectByTupleRanges(const std::vector<std::pair<int,int> >& ranges) const
+  {
+    checkAllocated();
+    int nbOfComp(getNumberOfComponents()),nbOfTuplesThis(getNumberOfTuples());
+    if(ranges.empty())
+      {
+        MCAuto<DataArray> ret0(buildNewEmptyInstance());
+        MCAuto< typename Traits<T>::ArrayType > ret(DynamicCastSafe<DataArray,typename Traits<T>::ArrayType>(ret0));
+        ret->alloc(0,nbOfComp);
+        ret->copyStringInfoFrom(*this);
+        return ret.retn();
+      }
+    int ref(ranges.front().first),nbOfTuples(0);
+    bool isIncreasing(true);
+    for(std::vector<std::pair<int,int> >::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 << "DataArrayTemplate::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 << "DataArrayTemplate::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 static_cast<typename Traits<T>::ArrayType *>(deepCopy());
+    MCAuto<DataArray> ret0(buildNewEmptyInstance());
+    MCAuto< typename Traits<T>::ArrayType > ret(DynamicCastSafe<DataArray,typename Traits<T>::ArrayType>(ret0));
+    ret->alloc(nbOfTuples,nbOfComp);
+    ret->copyStringInfoFrom(*this);
+    const T *src(getConstPointer());
+    T *work(ret->getPointer());
+    for(std::vector<std::pair<int,int> >::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 the first value of \a this. 
+   *  \return double - 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.
+   */
+  template<class T>
+  T DataArrayTemplate<T>::front() const
+  {
+    checkAllocated();
+    if(getNumberOfComponents()!=1)
+      throw INTERP_KERNEL::Exception("DataArrayTemplate::front : number of components not equal to one !");
+    int nbOfTuples(getNumberOfTuples());
+    if(nbOfTuples<1)
+      throw INTERP_KERNEL::Exception("DataArrayTemplate::front : number of tuples must be >= 1 !");
+    return *(getConstPointer());
+  }
+  
+  /*!
+   * Returns the last value of \a this. 
+   *  \return double - 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.
+   */
+  template<class T>
+  T DataArrayTemplate<T>::back() const
+  {
+    checkAllocated();
+    if(getNumberOfComponents()!=1)
+      throw INTERP_KERNEL::Exception("DataArrayTemplate::back : number of components not equal to one !");
+    int nbOfTuples(getNumberOfTuples());
+    if(nbOfTuples<1)
+      throw INTERP_KERNEL::Exception("DataArrayTemplate::back : number of tuples must be >= 1 !");
+    return *(getConstPointer()+nbOfTuples-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 double - the maximal value among all values of \a this array.
+   *  \throw If \a this->getNumberOfComponents() != 1
+   *  \throw If \a this->getNumberOfTuples() < 1
+   */
+  template<class T>
+  T DataArrayTemplate<T>::getMaxValue(int& tupleId) const
+  {
+    checkAllocated();
+    if(getNumberOfComponents()!=1)
+      throw INTERP_KERNEL::Exception("DataArrayDouble::getMaxValue : must be applied on DataArrayDouble with only one component, you can call 'rearrange' method before or call 'getMaxValueInArray' method !");
+    int nbOfTuples(getNumberOfTuples());
+    if(nbOfTuples<=0)
+      throw INTERP_KERNEL::Exception("DataArrayDouble::getMaxValue : array exists but number of tuples must be > 0 !");
+    const T *vals(getConstPointer());
+    const T *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 double - the maximal value among all values of \a this array.
+   *  \throw If \a this is not allocated.
+   */
+  template<class T>
+  T DataArrayTemplate<T>::getMaxValueInArray() const
+  {
+    checkAllocated();
+    const T *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 double - the minimal value among all values of \a this array.
+   *  \throw If \a this->getNumberOfComponents() != 1
+   *  \throw If \a this->getNumberOfTuples() < 1
+   */
+  template<class T>
+  T DataArrayTemplate<T>::getMinValue(int& tupleId) const
+  {
+    checkAllocated();
+    if(getNumberOfComponents()!=1)
+      throw INTERP_KERNEL::Exception("DataArrayDouble::getMinValue : must be applied on DataArrayDouble with only one component, you can call 'rearrange' method before call 'getMinValueInArray' method !");
+    int nbOfTuples(getNumberOfTuples());
+    if(nbOfTuples<=0)
+      throw INTERP_KERNEL::Exception("DataArrayDouble::getMinValue : array exists but number of tuples must be > 0 !");
+    const T *vals(getConstPointer());
+    const T *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 double - the minimal value among all values of \a this array.
+   *  \throw If \a this is not allocated.
+   */
+  template<class T>
+  T DataArrayTemplate<T>::getMinValueInArray() const
+  {
+    checkAllocated();
+    const T *loc=std::min_element(begin(),end());
+    return *loc;
+  }
+  
 }
 
 #endif
index 2557bc4421985d934cc0aa172e3461a383f7d5b3..d318fd81ae0ce7a16ae7239f8d772ad1226e8e02 100644 (file)
@@ -139,156 +139,6 @@ DataArrayInt *DataArrayChar::convertToIntArr() const
   return ret;
 }
 
-/*!
- * 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, subArray() or selectByTupleId() should be used.
- * For more info on renumbering see \ref numbering.
- *  \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();
-  MCAuto<DataArrayChar> ret=buildEmptySpecializedDAChar();
-  ret->alloc(nbTuples,nbOfCompo);
-  ret->copyStringInfoFrom(*this);
-  const char *iptr=getConstPointer();
-  char *optr=ret->getPointer();
-  for(int i=0;i<nbTuples;i++)
-    std::copy(iptr+nbOfCompo*new2Old[i],iptr+nbOfCompo*(new2Old[i]+1),optr+nbOfCompo*i);
-  ret->copyStringInfoFrom(*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 numbering.
- *  \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();
-  MCAuto<DataArrayChar> ret=buildEmptySpecializedDAChar();
-  ret->alloc(newNbOfTuple,nbOfCompo);
-  const char *iptr=getConstPointer();
-  char *optr=ret->getPointer();
-  for(int i=0;i<nbTuples;i++)
-    {
-      int w=old2New[i];
-      if(w>=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 numbering.
- *  \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 numbering.
- *  \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();
-  MCAuto<DataArrayChar> 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 && *w<oldNbOfTuples)
-      std::copy(srcPt+(*w)*nbComp,srcPt+((*w)+1)*nbComp,pt+i*nbComp);
-    else
-      throw INTERP_KERNEL::Exception("DataArrayChar::selectByTupleIdSafe : some ids has been detected to be out of [0,this->getNumberOfTuples) !");
-  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 numbering.
- *  \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::selectByTupleIdSafeSlice(int bg, int end2, int step) const
-{
-  checkAllocated();
-  MCAuto<DataArrayChar> ret=buildEmptySpecializedDAChar();
-  int nbComp=getNumberOfComponents();
-  int newNbOfTuples=GetNumberOfItemGivenBESRelative(bg,end2,step,"DataArrayInt::selectByTupleIdSafeSlice : ");
-  ret->alloc(newNbOfTuples,nbComp);
-  char *pt=ret->getPointer();
-  const char *srcPt=getConstPointer()+bg*nbComp;
-  for(int i=0;i<newNbOfTuples;i++,srcPt+=step*nbComp)
-    std::copy(srcPt,srcPt+nbComp,pt+i*nbComp);
-  ret->copyStringInfoFrom(*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.
@@ -310,144 +160,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<int>::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::subArray().
- * This method is a specialization of selectByTupleIdSafeSlice().
- *  \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::selectByTupleIdSafeSlice
- */
-DataArrayChar *DataArrayChar::subArray(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();
-  MCAuto<DataArrayChar> 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();
-  MCAuto<DataArrayChar> 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;i<nbOfTuples;i++)
-    {
-      int j=0;
-      for(;j<dim;j++)
-        nc[newNbOfComp*i+j]=oldc[i*oldNbOfComp+j];
-      for(;j<newNbOfComp;j++)
-        nc[newNbOfComp*i+j]=dftValue;
-    }
-  ret->setName(getName());
-  for(int i=0;i<dim;i++)
-    ret->setInfoOnComponent(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<int>& compoIds) const
-{
-  checkAllocated();
-  MCAuto<DataArrayChar> ret(buildEmptySpecializedDAChar());
-  int newNbOfCompo=(int)compoIds.size();
-  int oldNbOfCompo=getNumberOfComponents();
-  for(std::vector<int>::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;i<nbOfTuples;i++)
-    for(int j=0;j<newNbOfCompo;j++,nc++)
-      *nc=oldc[i*oldNbOfCompo+compoIds[j]];
-  return ret.retn();
-}
-
 /*!
  * Appends components of another array to components of \a this one, tuple by tuple.
  * So that the number of tuples of \a this array remains the same and the number of 
@@ -489,722 +201,6 @@ void DataArrayChar::meldWith(const DataArrayChar *other)
   copyPartOfStringInfoFrom2(compIds,*other);
 }
 
-/*!
- * Copy all values from another DataArrayChar into specified tuples and components
- * of \a this array. Textual data is not copied.
- * The tree parameters defining set of indices of tuples and components are similar to
- * the tree parameters of the Python function \c range(\c start,\c stop,\c step).
- *  \param [in] a - the array to copy values from.
- *  \param [in] bgTuples - index of the first tuple of \a this array to assign values to.
- *  \param [in] endTuples - index of the tuple before which the tuples to assign to
- *              are located.
- *  \param [in] stepTuples - index increment to get index of the next tuple to assign to.
- *  \param [in] bgComp - index of the first component of \a this array to assign values 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 - if \a true (by default), then \a a->getNumberOfComponents() 
- *              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;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
-        for(int j=0;j<newNbOfComp;j++,srcPt++)
-          pt[j*stepComp]=*srcPt;
-    }
-  else
-    {
-      for(int i=0;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
-        {
-          const char *srcPt2=srcPt;
-          for(int j=0;j<newNbOfComp;j++,srcPt2++)
-            pt[j*stepComp]=*srcPt2;
-        }
-    }
-}
-
-/*!
- * Assign a given value to values at specified tuples and components of \a this array.
- * The tree parameters defining set of indices of tuples and components are similar to
- * the tree parameters of the Python function \c range(\c start,\c stop,\c step)..
- *  \param [in] a - the value to assign.
- *  \param [in] bgTuples - index of the first tuple of \a this array to assign to.
- *  \param [in] endTuples - index of the tuple before which the tuples to assign to
- *              are located.
- *  \param [in] stepTuples - index increment to get index of the next tuple to assign to.
- *  \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 parameters specifying tuples and 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_setpartofvaluessimple1 "Here is a Python example".
- *  \endif
- */
-void DataArrayChar::setPartOfValuesSimple1(char a, int bgTuples, int endTuples, int stepTuples, int bgComp, int endComp, int stepComp)
-{
-  const char msg[]="DataArrayChar::setPartOfValuesSimple1";
-  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");
-  char *pt=getPointer()+bgTuples*nbComp+bgComp;
-  for(int i=0;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
-    for(int j=0;j<newNbOfComp;j++)
-      pt[j*stepComp]=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 and components to assign to are defined by C arrays of indices.
- * 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 <em>(pi)</em> 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 <em>(pi)</em> 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 <em>bgTuples / bgComp</em> is
- *         out of a valid range for \a this array.
- *  \throw In the first *mode of usage*, if <em>strictCompoCompare == true </em> and
- *         if <em> a->getNumberOfComponents() != (endComp - bgComp) </em>.
- *  \throw In the second *mode of usage*, if \a a->getNumberOfTuples() != 1 or
- *         <em> a->getNumberOfComponents() != (endComp - bgComp)</em>.
- *
- *  \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 <em>bgTuples / bgComp</em> 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 <em>(pi)</em> 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 <em>strictCompoCompare == true </em> and
- *         if <em> a->getNumberOfComponents()</em> is unequal to the number of components
- *         defined by <em>(bgComp,endComp,stepComp)</em>.
- *  \throw In the second *mode of usage*, if \a a->getNumberOfTuples() != 1 or
- *         <em> a->getNumberOfComponents()</em> is unequal to the number of components
- *         defined by <em>(bgComp,endComp,stepComp)</em>.
- *  \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<newNbOfComp;j++,srcPt++)
-          {
-            DataArray::CheckValueInRange(nbOfTuples,*w,"invalid tuple id");
-            pt[(std::size_t)(*w)*nbComp+j*stepComp]=*srcPt;
-          }
-    }
-  else
-    {
-      for(const int *w=bgTuples;w!=endTuples;w++)
-        {
-          const char *srcPt2=srcPt;
-          for(int j=0;j<newNbOfComp;j++,srcPt2++)
-            {
-              DataArray::CheckValueInRange(nbOfTuples,*w,"invalid tuple id");
-              pt[(std::size_t)(*w)*nbComp+j*stepComp]=*srcPt2;
-            }
-        }
-    }
-}
-
-/*!
- * Assign a given value to values at specified tuples and components of \a this array.
- * 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).
- *  \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 <em>(pi)</em> 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;j<newNbOfComp;j++)
-      {
-        DataArray::CheckValueInRange(nbOfTuples,*w,"invalid tuple id");
-        pt[(*w)*nbComp+j*stepComp]=a;
-      }
-}
-
-void DataArrayChar::setPartOfValues4(const DataArrayChar *a, int bgTuples, int endTuples, int stepTuples, const int *bgComp, const int *endComp, bool strictCompoCompare)
-{
-  if(!a)
-    throw INTERP_KERNEL::Exception("DataArrayInt::setPartOfValues4 : input DataArrayInt is NULL !");
-  const char msg[]="DataArrayInt::setPartOfValues4";
-  checkAllocated();
-  a->checkAllocated();
-  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;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
-        for(const int *z=bgComp;z!=endComp;z++,srcPt++)
-          pt[*z]=*srcPt;
-    }
-  else
-    {
-      for(int i=0;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
-        {
-          const char *srcPt2=srcPt;
-          for(const int *z=bgComp;z!=endComp;z++,srcPt2++)
-            pt[*z]=*srcPt2;
-        }
-    }
-}
-
-void DataArrayChar::setPartOfValuesSimple4(char a, int bgTuples, int endTuples, int stepTuples, const int *bgComp, const int *endComp)
-{
-  const char msg[]="DataArrayInt::setPartOfValuesSimple4";
-  checkAllocated();
-  int newNbOfTuples=DataArray::GetNumberOfItemGivenBES(bgTuples,endTuples,stepTuples,msg);
-  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");
-  char *pt=getPointer()+bgTuples*nbComp;
-  for(int i=0;i<newNbOfTuples;i++,pt+=stepTuples*nbComp)
-    for(const int *z=bgComp;z!=endComp;z++)
-      pt[*z]=a;
-}
-
-/*!
- * Copy some tuples from another DataArrayChar into specified tuples
- * of \a this array. Textual data is not copied. Both arrays must have equal number of
- * components.
- * Both the tuples to assign and the tuples to assign to are defined by a DataArrayChar.
- * All components of selected tuples are copied.
- *  \param [in] a - the array to copy values from.
- *  \param [in] tuplesSelec - the array specifying both source tuples of \a a and
- *              target tuples of \a this. \a tuplesSelec has two components, and the
- *              first component specifies index of the source tuple and the second
- *              one specifies index of the target tuple.
- *  \throw If \a this is not allocated.
- *  \throw If \a a is NULL.
- *  \throw If \a a is not allocated.
- *  \throw If \a tuplesSelec is NULL.
- *  \throw If \a tuplesSelec is not allocated.
- *  \throw If <em>this->getNumberOfComponents() != a->getNumberOfComponents()</em>.
- *  \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]<aNt)
-        {
-          if(tuple[0]>=0 && tuple[0]<thisNt)
-            std::copy(valsSrc+nbOfComp*tuple[1],valsSrc+nbOfComp*(tuple[1]+1),valsToSet+nbOfComp*tuple[0]);
-          else
-            {
-              std::ostringstream oss; oss << "DataArrayChar::setPartOfValuesAdv : Tuple #" << std::distance(tuplesSelec->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 <em>this->getNumberOfComponents() != aBase->getNumberOfComponents()</em>.
- *  \throw If \a tuplesSelec->getNumberOfComponents() != 1.
- *  \throw If <em>tupleIdStart + tuplesSelec->getNumberOfTuples() > this->getNumberOfTuples().</em>
- *  \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<const DataArrayChar *>(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 && *tuple<aNt)
-        {
-          std::copy(valsSrc+nbOfComp*(*tuple),valsSrc+nbOfComp*(*tuple+1),valsToSet);
-        }
-      else
-        {
-          std::ostringstream oss; oss << "DataArrayChar::setContigPartOfSelectedValues : Tuple #" << std::distance(tuplesSelec->begin(),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 <em>this->getNumberOfComponents() != aBase->getNumberOfComponents()</em>.
- *  \throw If <em>tupleIdStart + len(range(bg,end2,step)) > this->getNumberOfTuples().</em>
- *  \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::setContigPartOfSelectedValuesSlice(int tupleIdStart, const DataArray *aBase, int bg, int end2, int step)
-{
-  if(!aBase)
-    throw INTERP_KERNEL::Exception("DataArrayChar::setContigPartOfSelectedValuesSlice : input DataArray is NULL !");
-  const DataArrayChar *a=dynamic_cast<const DataArrayChar *>(aBase);
-  if(!a)
-    throw INTERP_KERNEL::Exception("DataArrayChar::setContigPartOfSelectedValuesSlice : input DataArray aBase is not a DataArrayChar !");
-  checkAllocated();
-  a->checkAllocated();
-  int nbOfComp=getNumberOfComponents();
-  const char msg[]="DataArrayChar::setContigPartOfSelectedValuesSlice";
-  int nbOfTupleToWrite=DataArray::GetNumberOfItemGivenBES(bg,end2,step,msg);
-  if(nbOfComp!=a->getNumberOfComponents())
-    throw INTERP_KERNEL::Exception("DataArrayChar::setContigPartOfSelectedValuesSlice : 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::setContigPartOfSelectedValuesSlice : invalid number range of values to write !");
-  if(end2>aNt)
-    throw INTERP_KERNEL::Exception("DataArrayChar::setContigPartOfSelectedValuesSlice : invalid range of values to read !");
-  const char *valsSrc=a->getConstPointer()+bg*nbOfComp;
-  for(int i=0;i<nbOfTupleToWrite;i++,valsToSet+=nbOfComp,valsSrc+=step*nbOfComp)
-    {
-      std::copy(valsSrc,valsSrc+nbOfComp,valsToSet);
-    }
-}
-
-/*!
- * Returns a shorten copy of \a this array. The new DataArrayChar contains ranges
- * of tuples specified by \a ranges parameter.
- * For more info on renumbering see \ref numbering.
- *  \param [in] ranges - std::vector of std::pair's each of which defines a range
- *              of tuples in [\c begin,\c end) format.
- *  \return DataArrayChar * - the new instance of DataArrayChar that the caller
- *          is to delete using decrRef() as it is no more needed.
- *  \throw If \a end < \a begin.
- *  \throw If \a end > \a this->getNumberOfTuples().
- *  \throw If \a this is not allocated.
- */
-DataArray *DataArrayChar::selectByTupleRanges(const std::vector<std::pair<int,int> >& ranges) const
-{
-  checkAllocated();
-  int nbOfComp=getNumberOfComponents();
-  int nbOfTuplesThis=getNumberOfTuples();
-  if(ranges.empty())
-    {
-      MCAuto<DataArrayChar> 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<std::pair<int,int> >::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 deepCopy();
-  MCAuto<DataArrayChar> ret=buildEmptySpecializedDAChar();
-  ret->alloc(nbOfTuples,nbOfComp);
-  ret->copyStringInfoFrom(*this);
-  const char *src=getConstPointer();
-  char *work=ret->getPointer();
-  for(std::vector<std::pair<int,int> >::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 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.
@@ -1386,74 +382,6 @@ int DataArrayChar::findIdFirstEqual(const std::vector<char>& 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
index d30ed5bb6ea67008a908c59a27e6aa549c92b18e..28e239007466b86b415fe73c5d1e6dbd67c45a50 100644 (file)
@@ -4976,7 +4976,7 @@ namespace MEDCoupling
     DataArrayChar *subArray(int tupleIdBg, int tupleIdEnd=-1) const throw(INTERP_KERNEL::Exception);
     DataArrayChar *changeNbOfComponents(int newNbOfComp, char dftValue) const throw(INTERP_KERNEL::Exception);
     void meldWith(const DataArrayChar *other) throw(INTERP_KERNEL::Exception);
-    void setPartOfValuesAdv(const DataArrayChar *a, const DataArrayChar *tuplesSelec) throw(INTERP_KERNEL::Exception);
+    void setPartOfValuesAdv(const DataArrayChar *a, const DataArrayInt *tuplesSelec) throw(INTERP_KERNEL::Exception);
     char front() const throw(INTERP_KERNEL::Exception);
     char back() const throw(INTERP_KERNEL::Exception);
     void setIJ(int tupleId, int compoId, char newVal) throw(INTERP_KERNEL::Exception);