Salome HOME
Fix 32bits config bug
[tools/medcoupling.git] / src / MEDCoupling / MEDCouplingMemArray.hxx
index 66323346ab88258c9d6501423cfd1c2c12d2f5e0..ba49d508476d757d1fcb6bb943b4f7cd37c668bc 100755 (executable)
@@ -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<T>::ArrayTypeCh > NewFromStdVector(const typename std::vector<T>& v);
+    static MCAuto< typename Traits<T>::ArrayTypeCh > NewFromArray(const T *arrBegin, const T *arrEnd);
     std::vector< MCAuto< typename Traits<T>::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<T>& accessToMemArray() { return _mem; }
     const MemArray<T>& accessToMemArray() const { return _mem; }
   protected:
+    typename Traits<T>::ArrayTypeCh *copySortedImpl(bool asc) const;
     typename Traits<T>::ArrayType *mySelectByTupleId(const mcIdType *new2OldBg, const mcIdType *new2OldEnd) const;
     typename Traits<T>::ArrayType *mySelectByTupleId(const DataArrayIdType& di) const;
     typename Traits<T>::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<std::pair<mcIdType,mcIdType> >& ranges) const { return DataArrayTemplateFP<float>::mySelectByTupleRanges(ranges); }
     DataArrayFloat *keepSelectedComponents(const std::vector<std::size_t>& compoIds) const { return DataArrayTemplateFP<float>::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<T>
   {
   public:
-    typedef typename Traits<T>::ArrayType DataArrayType;
+    using DataArrayType = typename Traits<T>::ArrayType;
   public:
     static DataArrayType *New();
     T intValue() const;
@@ -547,6 +564,7 @@ namespace MEDCoupling
     bool isEqualWithoutConsideringStrAndOrder(const typename Traits<T>::ArrayType& other) const;
     void switchOnTupleEqualTo(T val, std::vector<bool>& vec) const;
     void switchOnTupleNotEqualTo(T val, std::vector<bool>& vec) const;
+    DataArrayIdType *occurenceRankInThis() const;
     DataArrayIdType *buildPermutationArr(const DataArrayDiscrete<T>& other) const;
     DataArrayIdType *indicesOfSubPart(const DataArrayDiscrete<T>& 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<T>& 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<bool>& v);
     static DataArrayType *BuildListOfSwitchedOff(const std::vector<bool>& v);
@@ -695,8 +715,9 @@ namespace MEDCoupling
   {
     friend class DataArrayDiscrete<Int32>;
   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<std::size_t>& 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<std::pair<mcIdType,mcIdType> >& 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<Int64>;
   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<std::size_t>& compoIds) const { return DataArrayTemplate<Int64>::myKeepSelectedComponents(compoIds); }
     DataArrayInt64 *selectByTupleIdSafeSlice(mcIdType bg, mcIdType end2, mcIdType step) const { return DataArrayTemplate<Int64>::mySelectByTupleIdSafeSlice(bg,end2,step); }
     DataArrayInt64 *selectByTupleRanges(const std::vector<std::pair<mcIdType,mcIdType> >& ranges) const { return DataArrayTemplate<Int64>::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<bool> 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