X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FMEDCoupling%2FMEDCouplingMemArray.hxx;h=ba49d508476d757d1fcb6bb943b4f7cd37c668bc;hb=84031c1872103b9a0c9546ea12c4ebd03838034d;hp=66323346ab88258c9d6501423cfd1c2c12d2f5e0;hpb=0cd5e17ee88b52874c559c21d8162d395f286678;p=tools%2Fmedcoupling.git diff --git a/src/MEDCoupling/MEDCouplingMemArray.hxx b/src/MEDCoupling/MEDCouplingMemArray.hxx index 66323346a..ba49d5084 100755 --- a/src/MEDCoupling/MEDCouplingMemArray.hxx +++ b/src/MEDCoupling/MEDCouplingMemArray.hxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2019 CEA/DEN, EDF R&D +// Copyright (C) 2007-2020 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -18,8 +18,7 @@ // // Author : Anthony Geay (EDF R&D) -#ifndef __MEDCOUPLING_MEDCOUPLINGMEMARRAY_HXX__ -#define __MEDCOUPLING_MEDCOUPLINGMEMARRAY_HXX__ +#pragma once #include "MEDCoupling.hxx" #include "MCType.hxx" @@ -134,8 +133,11 @@ namespace MEDCoupling static mcIdType GetPosOfItemGivenBESRelativeNoThrow(T value, T begin, T end, T step); }; + class DataArray; class DataArrayByte; + MEDCOUPLING_EXPORT void DACheckNbOfTuplesAndComp(const DataArray *da, mcIdType nbOfTuples, std::size_t nbOfCompo, const std::string& msg); + class MEDCOUPLING_EXPORT DataArray : public RefCountObject, public TimeLabel { public: @@ -163,6 +165,7 @@ namespace MEDCoupling void setPartOfValuesBase3(const DataArray *aBase, const mcIdType *bgTuples, const mcIdType *endTuples, mcIdType bgComp, mcIdType endComp, mcIdType stepComp, bool strictCompoCompare=true); virtual void *getVoidStarPointer() = 0; virtual DataArray *deepCopy() const = 0; + virtual DataArray *copySorted(bool asc=true) const = 0; virtual DataArray *buildNewEmptyInstance() const = 0; virtual bool isAllocated() const = 0; virtual void checkAllocated() const = 0; @@ -229,8 +232,16 @@ namespace MEDCoupling typedef T Type; public: static MCAuto< typename Traits::ArrayTypeCh > NewFromStdVector(const typename std::vector& v); + static MCAuto< typename Traits::ArrayTypeCh > NewFromArray(const T *arrBegin, const T *arrEnd); std::vector< MCAuto< typename Traits::ArrayTypeCh > > explodeComponents() const; // + void printForDebug(std::ostream& oss) const + { + this->checkAllocated(); + char comma[3] = {'\0',' ','\0'}; + std::for_each(this->begin(),this->end(),[&comma,&oss](const T& elt) { oss << comma << elt; comma[0]=','; } ); + oss << std::endl; + } std::size_t getHeapMemorySizeWithoutChildren() const; void updateTime() const { } // @@ -250,7 +261,8 @@ namespace MEDCoupling T getIJ(std::size_t tupleId, std::size_t compoId) const { return _mem[tupleId*_info_on_compo.size()+compoId]; } void setIJ(std::size_t tupleId, std::size_t compoId, T newVal) { _mem[tupleId*_info_on_compo.size()+compoId]=newVal; declareAsNew(); } void setIJSilent(std::size_t tupleId, std::size_t compoId, T newVal) { _mem[tupleId*_info_on_compo.size()+compoId]=newVal; } - T *getPointer() { return _mem.getPointer(); declareAsNew(); } + T *getPointer() { declareAsNew(); return getPointerSilent(); } + T *getPointerSilent() { return _mem.getPointer(); } void pack() const; bool isAllocated() const override; void checkAllocated() const; @@ -308,6 +320,7 @@ namespace MEDCoupling MemArray& accessToMemArray() { return _mem; } const MemArray& accessToMemArray() const { return _mem; } protected: + typename Traits::ArrayTypeCh *copySortedImpl(bool asc) const; typename Traits::ArrayType *mySelectByTupleId(const mcIdType *new2OldBg, const mcIdType *new2OldEnd) const; typename Traits::ArrayType *mySelectByTupleId(const DataArrayIdType& di) const; typename Traits::ArrayType *mySelectByTupleIdSafe(const mcIdType *new2OldBg, const mcIdType *new2OldEnd) const; @@ -390,6 +403,8 @@ namespace MEDCoupling static DataArrayFloat *New(); public:// abstract method overload DataArrayFloat *deepCopy() const; + DataArrayFloat *copySorted(bool asc=true) const override { return this->copySortedImpl(asc); } + std::string getClassName() const override { return std::string("DataArrayFloat"); } DataArrayFloat *buildNewEmptyInstance() const { return DataArrayFloat::New(); } DataArrayFloat *selectByTupleRanges(const std::vector >& ranges) const { return DataArrayTemplateFP::mySelectByTupleRanges(ranges); } DataArrayFloat *keepSelectedComponents(const std::vector& compoIds) const { return DataArrayTemplateFP::myKeepSelectedComponents(compoIds); } @@ -420,6 +435,8 @@ namespace MEDCoupling static DataArrayDouble *New(); double doubleValue() const; DataArrayDouble *deepCopy() const; + DataArrayDouble *copySorted(bool asc=true) const override { return this->copySortedImpl(asc); } + std::string getClassName() const override { return std::string("DataArrayDouble"); } DataArrayDouble *buildNewEmptyInstance() const { return DataArrayDouble::New(); } void checkMonotonic(bool increasing, double eps) const; bool isMonotonic(bool increasing, double eps) const; @@ -537,7 +554,7 @@ namespace MEDCoupling class DataArrayDiscrete : public DataArrayTemplateClassic { public: - typedef typename Traits::ArrayType DataArrayType; + using DataArrayType = typename Traits::ArrayType; public: static DataArrayType *New(); T intValue() const; @@ -547,6 +564,7 @@ namespace MEDCoupling bool isEqualWithoutConsideringStrAndOrder(const typename Traits::ArrayType& other) const; void switchOnTupleEqualTo(T val, std::vector& vec) const; void switchOnTupleNotEqualTo(T val, std::vector& vec) const; + DataArrayIdType *occurenceRankInThis() const; DataArrayIdType *buildPermutationArr(const DataArrayDiscrete& other) const; DataArrayIdType *indicesOfSubPart(const DataArrayDiscrete& partOfThis) const; void checkMonotonic(bool increasing) const; @@ -563,7 +581,7 @@ namespace MEDCoupling DataArrayIdType *findIdsEqual(T val) const; DataArrayIdType *transformWithIndArrR(const T *indArr2Bg, const T *indArrEnd) const; void splitByValueRange(const T *arrBg, const T *arrEnd, - DataArrayType *& castArr, DataArrayType *& rankInsideCast, DataArrayType *& castsPresent) const; + DataArrayType *& castArr, DataArrayType *& rankInsideCast, DataArrayType *& castsPresent) const; bool isRange(T& strt, T& sttoopp, T& stteepp) const; DataArrayIdType *invertArrayO2N2N2O(mcIdType newNbOfElem) const; DataArrayIdType *invertArrayN2O2O2N(mcIdType oldNbOfElem) const; @@ -616,6 +634,7 @@ namespace MEDCoupling DataArrayType *buildSubstractionOptimized(const DataArrayType *other) const; DataArrayType *buildUnion(const DataArrayType *other) const; DataArrayType *buildIntersection(const DataArrayType *other) const; + DataArrayIdType *indexOfSameConsecutiveValueGroups() const; DataArrayType *buildUnique() const; DataArrayType *buildUniqueNotSorted() const; DataArrayType *deltaShiftIndex() const; @@ -639,6 +658,7 @@ namespace MEDCoupling //const MemArray& accessToMemArray() const { return _mem; } public: static DataArrayIdType *FindPermutationFromFirstToSecond(const DataArrayType *ids1, const DataArrayType *ids2); + static DataArrayIdType *FindPermutationFromFirstToSecondDuplicate(const DataArrayType *ids1, const DataArrayType *ids2); static mcIdType *CheckAndPreparePermutation(const T *start, const T *end); static DataArrayType *BuildListOfSwitchedOn(const std::vector& v); static DataArrayType *BuildListOfSwitchedOff(const std::vector& v); @@ -695,8 +715,9 @@ namespace MEDCoupling { friend class DataArrayDiscrete; public: - DataArrayInt32 *deepCopy() const;//ok - DataArrayInt32 *buildNewEmptyInstance() const { return DataArrayInt32::New(); }//ok + DataArrayInt32 *deepCopy() const; + DataArrayInt32 *copySorted(bool asc=true) const override { return this->copySortedImpl(asc); } + DataArrayInt32 *buildNewEmptyInstance() const { return DataArrayInt32::New(); } public: DataArrayInt32 *selectByTupleId(const mcIdType *new2OldBg, const mcIdType *new2OldEnd) const { return this->mySelectByTupleId(new2OldBg,new2OldEnd); } DataArrayInt32 *selectByTupleId(const DataArrayIdType& di) const { return this->mySelectByTupleId(di); } @@ -704,6 +725,7 @@ namespace MEDCoupling DataArrayInt32 *keepSelectedComponents(const std::vector& compoIds) const { return this->myKeepSelectedComponents(compoIds); } DataArrayInt32 *selectByTupleIdSafeSlice(mcIdType bg, mcIdType end2, mcIdType step) const { return this->mySelectByTupleIdSafeSlice(bg,end2,step); } DataArrayInt32 *selectByTupleRanges(const std::vector >& ranges) const { return this->mySelectByTupleRanges(ranges); } + std::string getClassName() const override { return std::string("DataArrayInt32"); } public: DataArrayInt32Iterator *iterator(); private: @@ -716,6 +738,7 @@ namespace MEDCoupling friend class DataArrayDiscrete; public: DataArrayInt64 *deepCopy() const; + DataArrayInt64 *copySorted(bool asc=true) const override { return this->copySortedImpl(asc); } DataArrayInt64 *buildNewEmptyInstance() const { return DataArrayInt64::New(); }//ok public: DataArrayInt64 *selectByTupleId(const mcIdType *new2OldBg, const mcIdType *new2OldEnd) const { return this->mySelectByTupleId(new2OldBg,new2OldEnd); } @@ -724,6 +747,7 @@ namespace MEDCoupling DataArrayInt64 *keepSelectedComponents(const std::vector& compoIds) const { return DataArrayTemplate::myKeepSelectedComponents(compoIds); } DataArrayInt64 *selectByTupleIdSafeSlice(mcIdType bg, mcIdType end2, mcIdType step) const { return DataArrayTemplate::mySelectByTupleIdSafeSlice(bg,end2,step); } DataArrayInt64 *selectByTupleRanges(const std::vector >& ranges) const { return DataArrayTemplate::mySelectByTupleRanges(ranges); } + std::string getClassName() const override { return std::string("DataArrayInt64"); } public: DataArrayInt64Iterator *iterator(); private: @@ -804,6 +828,7 @@ namespace MEDCoupling DataArrayChar *buildEmptySpecializedDAChar() const; DataArrayByteIterator *iterator(); DataArrayByte *deepCopy() const; + DataArrayByte *copySorted(bool asc=true) const override { return this->copySortedImpl(asc); } DataArrayByte *performCopyOrIncrRef(bool deepCopy) const; DataArrayByte *buildNewEmptyInstance() const { return DataArrayByte::New(); } char byteValue() const; @@ -816,6 +841,7 @@ namespace MEDCoupling void reprQuickOverviewData(std::ostream& stream, std::size_t maxNbOfByteInRepr) const; bool isEqualIfNotWhy(const DataArrayChar& other, std::string& reason) const; std::vector toVectorOfBool() const; + std::string getClassName() const override { return std::string("DataArrayByte"); } private: ~DataArrayByte() { } DataArrayByte() { } @@ -832,6 +858,7 @@ namespace MEDCoupling DataArrayChar *buildEmptySpecializedDAChar() const; DataArrayAsciiCharIterator *iterator(); DataArrayAsciiChar *deepCopy() const; + DataArrayAsciiChar *copySorted(bool asc=true) const override { throw INTERP_KERNEL::Exception("DataArrayAsciiChar::copySorted : not implemented for DataArrayByte"); } DataArrayAsciiChar *performCopyOrIncrRef(bool deepCopy) const; DataArrayAsciiChar *buildNewEmptyInstance() const { return DataArrayAsciiChar::New(); } char asciiCharValue() const; @@ -843,6 +870,7 @@ namespace MEDCoupling void reprQuickOverview(std::ostream& stream) const; void reprQuickOverviewData(std::ostream& stream, std::size_t maxNbOfByteInRepr) const; bool isEqualIfNotWhy(const DataArrayChar& other, std::string& reason) const; + std::string getClassName() const override { return std::string("DataArrayAsciiChar"); } private: ~DataArrayAsciiChar() { } DataArrayAsciiChar() { } @@ -1049,5 +1077,3 @@ namespace MEDCoupling throw INTERP_KERNEL::Exception("DataArrayDouble::insertAtTheEnd : not available for DataArrayDouble with number of components different than 1 !"); } } - -#endif