X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMEDCoupling%2FMEDCouplingMemArray.hxx;h=ba49d508476d757d1fcb6bb943b4f7cd37c668bc;hb=8f2a28585bcf231a8f976f36b7fb1d2eed8801c2;hp=e5f4a3873e28f03da14186d483d6e78216c8876a;hpb=f014e72b8511050572b7020e545c3927d4e76732;p=tools%2Fmedcoupling.git diff --git a/src/MEDCoupling/MEDCouplingMemArray.hxx b/src/MEDCoupling/MEDCouplingMemArray.hxx index e5f4a3873..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,7 @@ 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); } @@ -421,6 +435,7 @@ 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; @@ -539,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; @@ -549,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; @@ -565,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; @@ -618,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; @@ -641,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); @@ -697,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); } @@ -719,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); } @@ -808,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; @@ -837,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; @@ -1055,5 +1077,3 @@ namespace MEDCoupling throw INTERP_KERNEL::Exception("DataArrayDouble::insertAtTheEnd : not available for DataArrayDouble with number of components different than 1 !"); } } - -#endif