From 43c219aae919fe4bb8abad1eabdcef666e386b37 Mon Sep 17 00:00:00 2001 From: eap Date: Wed, 18 Mar 2020 15:42:47 +0300 Subject: [PATCH] Optimize work with std::map --- src/GEOM/GEOM_BaseDriver.cxx | 3 +- src/GEOMClient/GEOM_Client.cxx | 65 ++++++++++++++-------------------- 2 files changed, 28 insertions(+), 40 deletions(-) diff --git a/src/GEOM/GEOM_BaseDriver.cxx b/src/GEOM/GEOM_BaseDriver.cxx index 6328fd425..1e48dc623 100644 --- a/src/GEOM/GEOM_BaseDriver.cxx +++ b/src/GEOM/GEOM_BaseDriver.cxx @@ -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; diff --git a/src/GEOMClient/GEOM_Client.cxx b/src/GEOMClient/GEOM_Client.cxx index dd98d097f..28d459dcc 100644 --- a/src/GEOMClient/GEOM_Client.cxx +++ b/src/GEOMClient/GEOM_Client.cxx @@ -25,8 +25,6 @@ #include -#include - #include #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() )); + std::vector & 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; }