Salome HOME
Optimize work with std::map
authoreap <eap@opencascade.com>
Wed, 18 Mar 2020 12:42:47 +0000 (15:42 +0300)
committereap <eap@opencascade.com>
Wed, 18 Mar 2020 12:42:47 +0000 (15:42 +0300)
src/GEOM/GEOM_BaseDriver.cxx
src/GEOMClient/GEOM_Client.cxx

index 6328fd425065d3d12f6177b1770eddefe62939d5..1e48dc623216294e62bb354f6928d8a9aaca6585 100644 (file)
@@ -119,7 +119,8 @@ GEOM_Param & GEOM_Param::operator<<( const Handle(TColStd_HSequenceOfTransient)&
   {
     if ( funs->Length() > 1 )
       (*this) << funs->Length() << " objects: ";
-    for ( int i = 1; i <= funs->Length(); ++i )
+    int nb = Min( 100, funs->Length() ); // don't show huge lists
+    for ( int i = 1; i <= nb; ++i )
       (*this) << funs->Value( i ) << " ";
   }
   return *this;
index dd98d097fcd04f0be670e7ca874edf327d98c17a..28d459dccf9fa6a530a50755d0830d22d0c720cc 100644 (file)
@@ -25,8 +25,6 @@
 
 #include <Standard_Stream.hxx>
 
-#include <Standard_Stream.hxx>
-
 #include <sstream>
 
 #include "GEOM_Client.hxx"
@@ -141,8 +139,9 @@ GEOM_Client GEOM_Client::get_client()
 //=======================================================================
 Standard_Boolean GEOM_Client::Find (const TCollection_AsciiString& IOR, TopoDS_Shape& S)
 {
-  if (myShapesMap.count(IOR) != 0) {
-    S = myShapesMap[IOR];
+  std::map< TCollection_AsciiString , TopoDS_Shape >::iterator i2s = myShapesMap.find( IOR );
+  if ( i2s != myShapesMap.end() ) {
+    S = i2s->second;
     return Standard_True;
   }
   return Standard_False;
@@ -179,13 +178,8 @@ void GEOM_Client::Bind( const TCollection_AsciiString& IOR, const TopoDS_Shape&
 //=======================================================================
 void GEOM_Client::RemoveShapeFromBuffer( const TCollection_AsciiString& IOR)
 {
-  if (myShapesMap.size() == 0)
-    return;
-
-  if (myShapesMap.count(IOR) != 0) {
-    myShapesMap.erase(IOR);
-    _mySubShapes.erase(IOR);
-  }
+  if ( myShapesMap.erase( IOR ))
+    _mySubShapes.erase( IOR );
 }
 
 //=======================================================================
@@ -194,9 +188,6 @@ void GEOM_Client::RemoveShapeFromBuffer( const TCollection_AsciiString& IOR)
 //=======================================================================
 void GEOM_Client::ClearClientBuffer()
 {
-  if (myShapesMap.size() == 0)
-    return;
-
   _mySubShapes.clear();
   myShapesMap.clear();
 }
@@ -217,14 +208,13 @@ unsigned int GEOM_Client::BufferLength()
 TopoDS_Shape GEOM_Client::GetShape( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_ptr aShape )
 {
   TopoDS_Shape S;
-  CORBA::String_var anIOR = geom->GetStringFromIOR(aShape);
-  TCollection_AsciiString IOR = (char*)anIOR.in();
-  Standard_Boolean anIndex = Find(IOR, S);
-
-  if (anIndex) return S;
+  CORBA::String_var     anIOR = geom->GetStringFromIOR(aShape);
+  TCollection_AsciiString IOR = anIOR.in();
+  if ( Find( IOR, S ))
+    return S;
 
   /******* in case of a MAIN GEOM::SHAPE ********/
-  if (aShape->IsMainShape()) {
+  if ( aShape->IsMainShape() ) {
     S = Load(geom, aShape);
     Bind(IOR, S);
     return S;
@@ -232,38 +222,35 @@ TopoDS_Shape GEOM_Client::GetShape( GEOM::GEOM_Gen_ptr geom, GEOM::GEOM_Object_p
 
   /******* in case of SUB GEOM::SHAPE ***********/
   // Load and Explore the Main Shape
-  TopoDS_Shape aMainShape = GetShape (geom, aShape->GetMainShape());
-  GEOM::ListOfLong_var list = aShape->GetSubShapeIndices();
+  GEOM::GEOM_Object_var mainGO = aShape->GetMainShape();
+  TopoDS_Shape      aMainShape = GetShape( geom, mainGO );
+  GEOM::ListOfLong_var    list = aShape->GetSubShapeIndices();
 
-  CORBA::String_var aMainIOR = geom->GetStringFromIOR(aShape->GetMainShape());
-  TCollection_AsciiString mainIOR = (char*)aMainIOR.in();
+  CORBA::String_var      aMainIOR = geom->GetStringFromIOR( mainGO );
+  TCollection_AsciiString mainIOR = aMainIOR.in();
 
   //find subshapes only one time
-  if (_mySubShapes.count(mainIOR) == 0)
+  auto pos2isnew = _mySubShapes.insert( std::make_pair( mainIOR, std::vector<TopoDS_Shape>() ));
+  std::vector<TopoDS_Shape> & subShapes = pos2isnew.first->second;
+  if ( pos2isnew.second )
   {
     TopTools_IndexedMapOfShape anIndices;
-    TopExp::MapShapes(aMainShape, anIndices);
-    Standard_Integer ii = 1, nbSubSh = anIndices.Extent();
-    for (; ii <= nbSubSh; ii++)
-    {
-      _mySubShapes[mainIOR].push_back(anIndices.FindKey(ii));
-    }
+    TopExp::MapShapes( aMainShape, anIndices );
+    subShapes.insert( subShapes.end(), anIndices.cbegin(), anIndices.cend() );
   }
 
   /* Case of only one subshape */
-  if (list->length() == 1 && list[0] > 0) {
-    S = _mySubShapes[mainIOR][list[0]-1];
+  if ( list->length() == 1 && list[0] > 0 ) {
+    S = subShapes[list[0]-1];
   }
   else {
     BRep_Builder B;
     TopoDS_Compound aCompound;
     B.MakeCompound(aCompound);
-    for (size_t i = 0; i < list->length(); i++) {
-      if (0 < list[i] && list[i] <= (CORBA::Long)_mySubShapes[mainIOR].size()) {
-        TopoDS_Shape aSubShape = _mySubShapes[mainIOR][list[i]-1];
-        B.Add(aCompound, aSubShape);
-      }
-    }
+    CORBA::Long nbSub = subShapes.size();
+    for ( size_t i = 0; i < list->length(); i++ )
+      if ( 0 < list[i] && list[i] <= nbSub )
+        B.Add(aCompound, subShapes[list[i]-1] );
 
     S = aCompound;
   }