From 90b804f439579ee0791a35032522678ca9f3fb17 Mon Sep 17 00:00:00 2001 From: Anthony Geay Date: Mon, 29 May 2017 22:27:31 +0200 Subject: [PATCH] First IdType abstraction 130 methods remaining in DataArray --- src/MEDCoupling/MCType.hxx | 10 +++-- src/MEDCoupling/MEDCouplingMemArray.cxx | 52 ------------------------ src/MEDCoupling/MEDCouplingMemArray.hxx | 4 +- src/MEDCoupling/MEDCouplingMemArray.txx | 53 +++++++++++++++++++++++++ 4 files changed, 63 insertions(+), 56 deletions(-) diff --git a/src/MEDCoupling/MCType.hxx b/src/MEDCoupling/MCType.hxx index 8b8fe5417..01e2dd1f9 100644 --- a/src/MEDCoupling/MCType.hxx +++ b/src/MEDCoupling/MCType.hxx @@ -21,11 +21,15 @@ #ifndef __MEDCOUPLING_MCTYPE_HXX__ #define __MEDCOUPLING_MCTYPE_HXX__ -typedef long Int64; - -typedef int Int32; +namespace MEDCoupling +{ + typedef long Int64; + typedef int Int32; + typedef int mcIdType; +} #define DataArrayInt DataArrayInt32 +#define DataArrayIdType DataArrayInt32 #define DataArrayIntIterator DataArrayInt32Iterator diff --git a/src/MEDCoupling/MEDCouplingMemArray.cxx b/src/MEDCoupling/MEDCouplingMemArray.cxx index 211e39df7..7eb1baf14 100644 --- a/src/MEDCoupling/MEDCouplingMemArray.cxx +++ b/src/MEDCoupling/MEDCouplingMemArray.cxx @@ -4481,58 +4481,6 @@ void DataArrayInt::checkStrictlyMonotonic(bool increasing) const } } -/*! - * Creates a new one-dimensional DataArrayInt of the same size as \a this and a given - * one-dimensional arrays that must be of the same length. The result array describes - * correspondence between \a this and \a other arrays, so that - * other.getIJ(i,0) == this->getIJ(ret->getIJ(i),0). If such a permutation is - * not possible because some element in \a other is not in \a this, an exception is thrown. - * \param [in] other - an array to compute permutation to. - * \return DataArrayInt * - a new instance of DataArrayInt, which is a permutation array - * from \a this to \a other. The caller is to delete this array using decrRef() as it is - * no more needed. - * \throw If \a this->getNumberOfComponents() != 1. - * \throw If \a other->getNumberOfComponents() != 1. - * \throw If \a this->getNumberOfTuples() != \a other->getNumberOfTuples(). - * \throw If \a other includes a value which is not in \a this array. - * - * \if ENABLE_EXAMPLES - * \ref cpp_mcdataarrayint_buildpermutationarr "Here is a C++ example". - * - * \ref py_mcdataarrayint_buildpermutationarr "Here is a Python example". - * \endif - */ -DataArrayInt *DataArrayInt::buildPermutationArr(const DataArrayInt& other) const -{ - checkAllocated(); - if(getNumberOfComponents()!=1 || other.getNumberOfComponents()!=1) - throw INTERP_KERNEL::Exception("DataArrayInt::buildPermutationArr : 'this' and 'other' have to have exactly ONE component !"); - int nbTuple=getNumberOfTuples(); - other.checkAllocated(); - if(nbTuple!=other.getNumberOfTuples()) - throw INTERP_KERNEL::Exception("DataArrayInt::buildPermutationArr : 'this' and 'other' must have the same number of tuple !"); - MCAuto ret=DataArrayInt::New(); - ret->alloc(nbTuple,1); - ret->fillWithValue(-1); - const int *pt=getConstPointer(); - std::map mm; - for(int i=0;igetPointer(); - for(int i=0;i::const_iterator it=mm.find(pt[i]); - if(it==mm.end()) - { - std::ostringstream oss; oss << "DataArrayInt::buildPermutationArr : Arrays mismatch : element (" << pt[i] << ") in 'other' not findable in 'this' !"; - throw INTERP_KERNEL::Exception(oss.str().c_str()); - } - retToFill[i]=(*it).second; - } - return ret.retn(); -} - /*! * Elements of \a partOfThis are expected to be included in \a this. * The returned array \a ret is so that this[ret]==partOfThis diff --git a/src/MEDCoupling/MEDCouplingMemArray.hxx b/src/MEDCoupling/MEDCouplingMemArray.hxx index 462cd5343..99fbf6db1 100644 --- a/src/MEDCoupling/MEDCouplingMemArray.hxx +++ b/src/MEDCoupling/MEDCouplingMemArray.hxx @@ -218,6 +218,8 @@ namespace MEDCoupling template class DataArrayTemplate : public DataArray { + public: + typedef T Type; public: MEDCOUPLING_EXPORT static MCAuto< typename Traits::ArrayTypeCh > NewFromStdVector(const typename std::vector& v); MEDCOUPLING_EXPORT std::vector< MCAuto< typename Traits::ArrayTypeCh > > explodeComponents() const; @@ -530,6 +532,7 @@ namespace MEDCoupling MEDCOUPLING_EXPORT bool isEqualWithoutConsideringStrAndOrder(const typename Traits::ArrayType& other) const; MEDCOUPLING_EXPORT void switchOnTupleEqualTo(T val, std::vector& vec) const; MEDCOUPLING_EXPORT void switchOnTupleNotEqualTo(T val, std::vector& vec) const; + MEDCOUPLING_EXPORT DataArrayIdType *buildPermutationArr(const DataArrayDiscrete& other) const; protected: template void switchOnTupleAlg(T val, std::vector& vec, ALG algo) const; @@ -556,7 +559,6 @@ namespace MEDCoupling MEDCOUPLING_EXPORT int getHashCode() const; MEDCOUPLING_EXPORT DataArrayInt32 *deepCopy() const;//ok MEDCOUPLING_EXPORT DataArrayInt32 *buildNewEmptyInstance() const { return DataArrayInt32::New(); }//ok - MEDCOUPLING_EXPORT DataArrayInt32 *buildPermutationArr(const DataArrayInt32& other) const; MEDCOUPLING_EXPORT DataArrayInt32 *indicesOfSubPart(const DataArrayInt32& partOfThis) const; MEDCOUPLING_EXPORT DataArrayInt32 *sumPerTuple() const; MEDCOUPLING_EXPORT void checkMonotonic(bool increasing) const; diff --git a/src/MEDCoupling/MEDCouplingMemArray.txx b/src/MEDCoupling/MEDCouplingMemArray.txx index aaec5ed8e..2f05e5cbe 100644 --- a/src/MEDCoupling/MEDCouplingMemArray.txx +++ b/src/MEDCoupling/MEDCouplingMemArray.txx @@ -3350,6 +3350,59 @@ struct NotInRange switchOnTupleAlg(val,vec,std::not_equal_to()); } + /*! + * Creates a new one-dimensional DataArrayInt of the same size as \a this and a given + * one-dimensional arrays that must be of the same length. The result array describes + * correspondence between \a this and \a other arrays, so that + * other.getIJ(i,0) == this->getIJ(ret->getIJ(i),0). If such a permutation is + * not possible because some element in \a other is not in \a this, an exception is thrown. + * \param [in] other - an array to compute permutation to. + * \return DataArrayInt * - a new instance of DataArrayInt, which is a permutation array + * from \a this to \a other. The caller is to delete this array using decrRef() as it is + * no more needed. + * \throw If \a this->getNumberOfComponents() != 1. + * \throw If \a other->getNumberOfComponents() != 1. + * \throw If \a this->getNumberOfTuples() != \a other->getNumberOfTuples(). + * \throw If \a other includes a value which is not in \a this array. + * + * \if ENABLE_EXAMPLES + * \ref cpp_mcdataarrayint_buildpermutationarr "Here is a C++ example". + * + * \ref py_mcdataarrayint_buildpermutationarr "Here is a Python example". + * \endif + */ + template + DataArrayIdType *DataArrayDiscrete::buildPermutationArr(const DataArrayDiscrete& other) const + { + this->checkAllocated(); + if(this->getNumberOfComponents()!=1 || other.getNumberOfComponents()!=1) + throw INTERP_KERNEL::Exception("DataArrayInt::buildPermutationArr : 'this' and 'other' have to have exactly ONE component !"); + int nbTuple(this->getNumberOfTuples()); + other.checkAllocated(); + if(nbTuple!=other.getNumberOfTuples()) + throw INTERP_KERNEL::Exception("DataArrayInt::buildPermutationArr : 'this' and 'other' must have the same number of tuple !"); + MCAuto ret(DataArrayIdType::New()); + ret->alloc(nbTuple,1); + ret->fillWithValue(-1); + const T *pt(this->begin()); + std::map mm; + for(int i=0;igetPointer()); + for(int i=0;i::const_iterator it=mm.find(pt[i]); + if(it==mm.end()) + { + std::ostringstream oss; oss << "DataArrayInt::buildPermutationArr : Arrays mismatch : element (" << pt[i] << ") in 'other' not findable in 'this' !"; + throw INTERP_KERNEL::Exception(oss.str().c_str()); + } + retToFill[i]=(*it).second; + } + return ret.retn(); + } + /*! * This method compares content of input vector \a v and \a this. * If for each id in \a this v[id]==True and for all other ids id2 not in \a this v[id2]==False, true is returned. -- 2.39.2