X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMEDCoupling%2FMEDCouplingMemArray.hxx;h=d70be4d273dfebab3911a6ea885c988e9500fb93;hb=9abc40a840f69fd7f07b356cd31876b64dc81e14;hp=e5f4a3873e28f03da14186d483d6e78216c8876a;hpb=f014e72b8511050572b7020e545c3927d4e76732;p=tools%2Fmedcoupling.git diff --git a/src/MEDCoupling/MEDCouplingMemArray.hxx b/src/MEDCoupling/MEDCouplingMemArray.hxx index e5f4a3873..d70be4d27 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-2022 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" @@ -34,6 +33,7 @@ #include #include #include +#include namespace MEDCoupling { @@ -46,7 +46,7 @@ namespace MEDCoupling // -- WARNING this enum must be synchronized with MEDCouplingCommon.i file ! -- class PartDefinition; - + template class MEDCouplingPointer { @@ -134,8 +134,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 +166,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; @@ -194,6 +198,7 @@ namespace MEDCoupling static mcIdType GetNumberOfItemGivenBES(mcIdType begin, mcIdType end, mcIdType step, const std::string& msg); static mcIdType GetNumberOfItemGivenBESRelative(mcIdType begin, mcIdType end, mcIdType step, const std::string& msg); static mcIdType GetPosOfItemGivenBESRelativeNoThrow(mcIdType value, mcIdType begin, mcIdType end, mcIdType step); + static std::vector SplitStringInChuncks(const std::string st, std::size_t sz); static std::string GetVarNameFromInfo(const std::string& info); static std::string GetUnitFromInfo(const std::string& info); static std::string BuildInfoFromVarAndUnit(const std::string& var, const std::string& unit); @@ -229,8 +234,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 +263,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 +322,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; @@ -324,6 +339,7 @@ namespace MEDCoupling public: MCAuto convertToDblArr() const; MCAuto convertToIntArr() const; + MCAuto convertToInt64Arr() const; MCAuto convertToFloatArr() const; void applyLin(T a, T b, std::size_t compoId); void applyLin(T a, T b); @@ -372,7 +388,7 @@ namespace MEDCoupling template void somethingEqual(const typename Traits::ArrayType *other); }; - + template class DataArrayTemplateFP : public DataArrayTemplateClassic { @@ -390,6 +406,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 +438,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; @@ -480,6 +498,7 @@ namespace MEDCoupling DataArrayDouble *trace() const; DataArrayDouble *deviator() const; DataArrayDouble *magnitude() const; + DataArrayDouble *minPerTuple() const; DataArrayDouble *maxPerTuple() const; DataArrayDouble *maxPerTupleWithCompoId(DataArrayIdType* &compoIdOfMaxPerTuple) const; DataArrayDouble *buildEuclidianDistanceDenseMatrix() const; @@ -520,13 +539,15 @@ namespace MEDCoupling bool resizeForUnserialization(const std::vector& tinyInfoI); void finishUnserialization(const std::vector& tinyInfoI, const std::vector& tinyInfoS); public: - template + template void findCommonTuplesAlg(const double *bbox, mcIdType nbNodes, mcIdType limitNodeId, double prec, DataArrayIdType *c, DataArrayIdType *cI) const; - template + template static void FindClosestTupleIdAlg(const BBTreePts& myTree, double dist, const double *pos, mcIdType nbOfTuples, const double *thisPt, mcIdType thisNbOfTuples, mcIdType *res); - template + template static void FindTupleIdsNearTuplesAlg(const BBTreePts& myTree, const double *pos, mcIdType nbOfTuples, double eps, DataArrayIdType *c, DataArrayIdType *cI); + private: + DataArrayDouble *operatePerTuple(std::function func) const; private: ~DataArrayDouble() { } DataArrayDouble() { } @@ -539,7 +560,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 +570,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 +587,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; @@ -581,6 +603,7 @@ namespace MEDCoupling T checkUniformAndGuess() const; bool hasUniqueValues() const; void setSelectedComponents(const DataArrayType *a, const std::vector& compoIds); + DataArrayIdType *locateComponentId(const DataArrayType *valToSearchIntoTuples, const DataArrayIdType *tupleIdHint) const; DataArrayIdType *findIdsNotEqual(T val) const; DataArrayIdType *findIdsEqualTuple(const T *tupleBg, const T *tupleEnd) const; DataArrayIdType *findIdsEqualList(const T *valsBg, const T *valsEnd) const; @@ -618,6 +641,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; @@ -629,6 +653,7 @@ namespace MEDCoupling DataArrayIdType *findRangeIdForEachTuple(const DataArrayType *ranges) const; DataArrayType *findIdInRangeForEachTuple(const DataArrayType *ranges) const; void sortEachPairToMakeALinkedList(); + void sortToHaveConsecutivePairs(); MCAuto fromLinkedListOfPairToList() const; DataArrayType *getDifferentValues() const; std::vector partitionByDifferentValues(std::vector& differentIds) const; @@ -641,6 +666,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); @@ -681,7 +707,7 @@ namespace MEDCoupling protected: ~DataArrayDiscrete() { } }; - + template class DataArrayDiscreteSigned : public DataArrayDiscrete { @@ -697,8 +723,10 @@ 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(); } + MCAuto convertToInt64Arr() const; 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,7 +747,9 @@ 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 + MCAuto convertToInt32Arr() const; public: DataArrayInt64 *selectByTupleId(const mcIdType *new2OldBg, const mcIdType *new2OldEnd) const { return this->mySelectByTupleId(new2OldBg,new2OldEnd); } DataArrayInt64 *selectByTupleId(const DataArrayIdType& di) const { return this->mySelectByTupleId(di); } @@ -808,6 +838,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 +868,7 @@ namespace MEDCoupling DataArrayChar *buildEmptySpecializedDAChar() const; DataArrayAsciiCharIterator *iterator(); DataArrayAsciiChar *deepCopy() const; + DataArrayAsciiChar *copySorted(bool asc=true) const override { (void)asc;throw INTERP_KERNEL::Exception("DataArrayAsciiChar::copySorted : not implemented for DataArrayByte"); } DataArrayAsciiChar *performCopyOrIncrRef(bool deepCopy) const; DataArrayAsciiChar *buildNewEmptyInstance() const { return DataArrayAsciiChar::New(); } char asciiCharValue() const; @@ -923,7 +955,7 @@ namespace MEDCoupling float floatValue() const; DataArrayFloat *buildDAFloat(std::size_t nbOfTuples, std::size_t nbOfCompo) const; }; - + class MEDCOUPLING_EXPORT DataArrayInt32Iterator : public DataArrayIterator { public: @@ -988,7 +1020,7 @@ namespace MEDCoupling char *_pt; std::size_t _nb_of_compo; }; - + class DataArrayByteTuple; class MEDCOUPLING_EXPORT DataArrayByteIterator @@ -1055,5 +1087,3 @@ namespace MEDCoupling throw INTERP_KERNEL::Exception("DataArrayDouble::insertAtTheEnd : not available for DataArrayDouble with number of components different than 1 !"); } } - -#endif