Salome HOME
bos #20256: [CEA 18523] Porting SMESH to int 64 bits
[modules/smesh.git] / src / SMESHDS / SMESHDS_GroupOnFilter.cxx
index 7653e176ce6811b594cd62b99d60e335bf8d7079..1672ff0691ac2c223d5586e73744dde7edaf11e1 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2021  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
 #include "SMESHDS_GroupOnFilter.hxx"
 
 #include "SMDS_SetIterator.hxx"
+#include "ObjectPool.hxx"
 #include "SMESHDS_Mesh.hxx"
 
 #include <numeric>
 #include <limits>
 
+#include <boost/make_shared.hpp>
+
 using namespace std;
 
 //#undef WITH_TBB
@@ -45,11 +48,12 @@ SMESHDS_GroupOnFilter::SMESHDS_GroupOnFilter (const int                 theID,
                                               const SMESHDS_Mesh*       theMesh,
                                               const SMDSAbs_ElementType theType,
                                               const SMESH_PredicatePtr& thePredicate)
-  : SMESHDS_GroupBase(theID,theMesh,theType),
+  : SMESHDS_GroupBase( theID, theMesh, theType ),
+    SMDS_ElementHolder( theMesh ),
     myMeshInfo( SMDSEntity_Last, 0 ),
-    myMeshModifTime(0),
-    myPredicateTic(0),
-    myNbElemToSkip(0)
+    myMeshModifTime( 0 ),
+    myPredicateTic( 0 ),
+    myNbElemToSkip( 0 )
 {
   SetPredicate( thePredicate );
 }
@@ -75,7 +79,7 @@ void SMESHDS_GroupOnFilter::SetPredicate( const SMESH_PredicatePtr& thePredicate
  */
 //================================================================================
 
-int SMESHDS_GroupOnFilter::Extent() const
+smIdType SMESHDS_GroupOnFilter::Extent() const
 {
   update();
   return std::accumulate( myMeshInfo.begin(), myMeshInfo.end(), 0 );
@@ -116,7 +120,7 @@ bool SMESHDS_GroupOnFilter::IsEmpty()
  */
 //================================================================================
 
-bool SMESHDS_GroupOnFilter::Contains (const int theID)
+bool SMESHDS_GroupOnFilter::Contains (const smIdType theID)
 {
   return myPredicate && myPredicate->IsSatisfy( theID );
 }
@@ -143,6 +147,7 @@ namespace // Iterator
     size_t                            myNbToFind, myNbFound, myTotalNb;
     vector< const SMDS_MeshElement*>& myFoundElems;
     bool &                            myFoundElemsOK;
+    bool                              myFoundElemsChecked;
 
     TIterator( const SMESH_PredicatePtr&         filter,
                SMDS_ElemIteratorPtr&             elems,
@@ -157,14 +162,15 @@ namespace // Iterator
       myNbFound( 0 ),
       myTotalNb( totalNb ),
       myFoundElems( foundElems ),
-      myFoundElemsOK( foundElemsOK )
+      myFoundElemsOK( foundElemsOK ),
+      myFoundElemsChecked( false )
     {
       myFoundElemsOK = false;
       next();
     }
     ~TIterator()
     {
-      if ( !myFoundElemsOK )
+      if ( !myFoundElemsChecked && !myFoundElemsOK )
         clearVector( myFoundElems );
     }
     virtual bool more()
@@ -221,6 +227,8 @@ namespace // Iterator
       }
       if ( !myFoundElemsOK )
         clearVector( myFoundElems );
+
+      myFoundElemsChecked = true; // in destructor: not to clearVector() which may already die
     }
   };
 
@@ -280,7 +288,7 @@ SMDS_ElemIteratorPtr SMESHDS_GroupOnFilter::GetElements() const
  */
 //================================================================================
 
-std::vector< int > SMESHDS_GroupOnFilter::GetMeshInfo() const
+std::vector< smIdType > SMESHDS_GroupOnFilter::GetMeshInfo() const
 {
   update();
   return myMeshInfo;
@@ -307,7 +315,7 @@ int SMESHDS_GroupOnFilter::getElementIds( void* ids, size_t idSize ) const
     if ( IsUpToDate() )
     {
       for ( ; elIt->more(); curID += idSize )
-        (*(int*) curID) = elIt->next()->GetID();
+        (*(smIdType*) curID) = elIt->next()->GetID();
     }
     else
     {
@@ -317,11 +325,11 @@ int SMESHDS_GroupOnFilter::getElementIds( void* ids, size_t idSize ) const
       me->myMeshInfo.assign( SMDSEntity_Last, 0 );
       me->myMeshInfo[ firstOkElem->GetEntityType() ]++;
 
-      (*(int*) curID) = firstOkElem->GetID();
+      (*(smIdType*) curID) = firstOkElem->GetID();
       for ( curID += idSize; elIt->more(); curID += idSize )
       {
         const SMDS_MeshElement* e = elIt->next();
-        (*(int*) curID) = e->GetID();
+        (*(smIdType*) curID) = e->GetID();
         me->myMeshInfo[ e->GetEntityType() ]++;
       }
     }
@@ -387,6 +395,14 @@ void SMESHDS_GroupOnFilter::update() const
 //================================================================================
 #ifdef WITH_TBB
 
+#ifdef WIN32
+// See https://docs.microsoft.com/en-gb/cpp/porting/modifying-winver-and-win32-winnt?view=vs-2019
+// Windows 10 = 0x0A00  
+#define WINVER 0x0A00
+#define _WIN32_WINNT 0x0A00
+
+#endif
+
 #include <tbb/parallel_for.h>
 #include "tbb/enumerable_thread_specific.h"
 
@@ -427,7 +443,7 @@ bool SMESHDS_GroupOnFilter::updateParallel() const
     return false; // no sense in parallel work
 
   SMDS_ElemIteratorPtr elemIt = GetMesh()->elementsIterator( GetType() );
-  const int minID = elemIt->next()->GetID();
+  const smIdType minID = elemIt->next()->GetID();
   myPredicate->IsSatisfy( minID ); // make myPredicate fully initialized for clone()
   SMESH_PredicatePtr clone( myPredicate->clone() );
   if ( !clone )
@@ -436,7 +452,7 @@ bool SMESHDS_GroupOnFilter::updateParallel() const
   TLocalPredicat threadPredicates;
   threadPredicates.local() = clone;
 
-  int maxID = ( GetType() == SMDSAbs_Node ) ? GetMesh()->MaxNodeID() : GetMesh()->MaxElementID();
+  smIdType maxID = ( GetType() == SMDSAbs_Node ) ? GetMesh()->MaxNodeID() : GetMesh()->MaxElementID();
   vector< char > isElemOK( 1 + maxID );
 
   tbb::parallel_for ( tbb::blocked_range<size_t>( 0, isElemOK.size() ),
@@ -532,3 +548,38 @@ SMESHDS_GroupOnFilter::setNbElemToSkip( SMDS_ElemIteratorPtr& okElemIt )
   }
   return firstOkElem;
 }
+
+//================================================================================
+/*!
+ * \brief Return elements before mesh compacting
+ */
+//================================================================================
+
+SMDS_ElemIteratorPtr SMESHDS_GroupOnFilter::getElements()
+{
+  return boost::make_shared< SMDS_ElementVectorIterator >( myElements.begin(), myElements.end() );
+}
+
+//================================================================================
+/*!
+ * \brief clear myElements before re-filling after mesh compacting
+ */
+//================================================================================
+
+void SMESHDS_GroupOnFilter::tmpClear()
+{
+  std::vector< const SMDS_MeshElement*> newElems( myElements.size() );
+  myElements.swap( newElems );
+  myElements.clear();
+}
+
+//================================================================================
+/*!
+ * \brief Re-fill myElements after mesh compacting
+ */
+//================================================================================
+
+void SMESHDS_GroupOnFilter::add( const SMDS_MeshElement* element )
+{
+  myElements.push_back( element );
+}