mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-12-26 01:10:35 +05:00
Improve SMDS: replace std::map with NCollection_DataMap for storage of elements
This commit is contained in:
parent
e9f2fd0ea8
commit
eab9bcb035
@ -25,6 +25,9 @@
|
||||
// Author : Jean-Michel BOULCOURT
|
||||
// Module : SMESH
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable:4786)
|
||||
#endif
|
||||
|
||||
#include "SMDS_MeshElementIDFactory.hxx"
|
||||
#include "SMDS_MeshElement.hxx"
|
||||
@ -35,7 +38,9 @@ using namespace std;
|
||||
//function : SMDS_MeshElementIDFactory
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
SMDS_MeshElementIDFactory::SMDS_MeshElementIDFactory():SMDS_MeshIDFactory()
|
||||
SMDS_MeshElementIDFactory::SMDS_MeshElementIDFactory():
|
||||
SMDS_MeshIDFactory(),
|
||||
myMin(0), myMax(0)
|
||||
{
|
||||
}
|
||||
|
||||
@ -45,10 +50,12 @@ SMDS_MeshElementIDFactory::SMDS_MeshElementIDFactory():SMDS_MeshIDFactory()
|
||||
//=======================================================================
|
||||
bool SMDS_MeshElementIDFactory::BindID(int ID, SMDS_MeshElement * elem)
|
||||
{
|
||||
bool bound=myIDElements.insert(
|
||||
map<int, SMDS_MeshElement*>::value_type(ID,elem)).second;
|
||||
if(bound) elem->myID=ID;
|
||||
return bound;
|
||||
if (myIDElements.IsBound(ID))
|
||||
return false;
|
||||
myIDElements.Bind(ID,elem);
|
||||
elem->myID=ID;
|
||||
updateMinMax (ID);
|
||||
return true;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
@ -57,8 +64,9 @@ bool SMDS_MeshElementIDFactory::BindID(int ID, SMDS_MeshElement * elem)
|
||||
//=======================================================================
|
||||
SMDS_MeshElement* SMDS_MeshElementIDFactory::MeshElement(int ID)
|
||||
{
|
||||
map<int, SMDS_MeshElement*>::iterator it=myIDElements.find(ID);
|
||||
if(it==myIDElements.end()) return NULL; else return (*it).second;
|
||||
if (!myIDElements.IsBound(ID))
|
||||
return NULL;
|
||||
return myIDElements.Find(ID);
|
||||
}
|
||||
|
||||
|
||||
@ -71,7 +79,7 @@ int SMDS_MeshElementIDFactory::GetFreeID()
|
||||
int ID;
|
||||
do {
|
||||
ID = SMDS_MeshIDFactory::GetFreeID();
|
||||
} while (myIDElements.find(ID) != myIDElements.end());
|
||||
} while (myIDElements.IsBound(ID));
|
||||
return ID;
|
||||
}
|
||||
|
||||
@ -81,8 +89,12 @@ int SMDS_MeshElementIDFactory::GetFreeID()
|
||||
//=======================================================================
|
||||
void SMDS_MeshElementIDFactory::ReleaseID(const int ID)
|
||||
{
|
||||
myIDElements.erase(ID);
|
||||
myIDElements.UnBind(ID);
|
||||
SMDS_MeshIDFactory::ReleaseID(ID);
|
||||
if (ID == myMax)
|
||||
myMax = 0;
|
||||
if (ID == myMin)
|
||||
myMin = 0;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
@ -92,11 +104,9 @@ void SMDS_MeshElementIDFactory::ReleaseID(const int ID)
|
||||
|
||||
int SMDS_MeshElementIDFactory::GetMaxID() const
|
||||
{
|
||||
map<int, SMDS_MeshElement*>::const_reverse_iterator it = myIDElements.rbegin();
|
||||
if ( it != myIDElements.rend() )
|
||||
return (*it).first;
|
||||
|
||||
return 0;
|
||||
if (myMax == 0)
|
||||
updateMinMax();
|
||||
return myMax;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
@ -106,10 +116,54 @@ int SMDS_MeshElementIDFactory::GetMaxID() const
|
||||
|
||||
int SMDS_MeshElementIDFactory::GetMinID() const
|
||||
{
|
||||
map<int, SMDS_MeshElement*>::const_iterator it = myIDElements.begin();
|
||||
if ( it != myIDElements.end() )
|
||||
return (*it).first;
|
||||
|
||||
return 0;
|
||||
if (myMin == 0)
|
||||
updateMinMax();
|
||||
return myMin;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : updateMinMax
|
||||
//purpose :
|
||||
//=======================================================================
|
||||
|
||||
void SMDS_MeshElementIDFactory::updateMinMax() const
|
||||
{
|
||||
myMin = IntegerLast();
|
||||
myMax = 0;
|
||||
SMDS_IdElementMap::Iterator it(myIDElements);
|
||||
for (; it.More(); it.Next())
|
||||
updateMinMax (it.Key());
|
||||
if (myMin == IntegerLast())
|
||||
myMin = 0;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
//function : elementsIterator
|
||||
//purpose : Return an iterator on elements of the factory
|
||||
//=======================================================================
|
||||
|
||||
class SMDS_Fact_MyElemIterator:public SMDS_ElemIterator
|
||||
{
|
||||
SMDS_IdElementMap::Iterator myIterator;
|
||||
public:
|
||||
SMDS_Fact_MyElemIterator(const SMDS_IdElementMap& s):myIterator(s)
|
||||
{}
|
||||
|
||||
bool more()
|
||||
{
|
||||
return myIterator.More() != Standard_False;
|
||||
}
|
||||
|
||||
const SMDS_MeshElement* next()
|
||||
{
|
||||
const SMDS_MeshElement* current = myIterator.Value();
|
||||
myIterator.Next();
|
||||
return current;
|
||||
}
|
||||
};
|
||||
|
||||
SMDS_ElemIteratorPtr SMDS_MeshElementIDFactory::elementsIterator() const
|
||||
{
|
||||
return SMDS_ElemIteratorPtr
|
||||
(new SMDS_Fact_MyElemIterator(myIDElements));
|
||||
}
|
||||
|
@ -28,26 +28,35 @@
|
||||
#define _SMDS_MeshElementIDFactory_HeaderFile
|
||||
|
||||
#include "SMDS_MeshIDFactory.hxx"
|
||||
#include "SMDS_ElemIterator.hxx"
|
||||
|
||||
#include <map>
|
||||
#include <NCollection_DataMap.hxx>
|
||||
|
||||
class SMDS_MeshElement;
|
||||
|
||||
typedef std::map<int, SMDS_MeshElement *> SMDS_IdElementMap;
|
||||
typedef NCollection_DataMap<int, SMDS_MeshElement *> SMDS_IdElementMap;
|
||||
|
||||
class SMDS_MeshElementIDFactory:public SMDS_MeshIDFactory
|
||||
{
|
||||
public:
|
||||
SMDS_MeshElementIDFactory();
|
||||
bool BindID(int ID, SMDS_MeshElement * elem);
|
||||
SMDS_MeshElement * MeshElement(int ID);
|
||||
virtual int GetFreeID();
|
||||
virtual void ReleaseID(int ID);
|
||||
int GetMaxID() const;
|
||||
int GetMinID() const;
|
||||
const SMDS_IdElementMap & GetIdElementMap() const { return myIDElements; }
|
||||
private:
|
||||
SMDS_IdElementMap myIDElements;
|
||||
public:
|
||||
SMDS_MeshElementIDFactory();
|
||||
bool BindID(int ID, SMDS_MeshElement * elem);
|
||||
SMDS_MeshElement * MeshElement(int ID);
|
||||
virtual int GetFreeID();
|
||||
virtual void ReleaseID(int ID);
|
||||
int GetMaxID() const;
|
||||
int GetMinID() const;
|
||||
SMDS_ElemIteratorPtr elementsIterator() const;
|
||||
private:
|
||||
void updateMinMax() const;
|
||||
void updateMinMax(int id) const
|
||||
{
|
||||
if (id > myMax) myMax = id;
|
||||
if (id < myMin) myMin = id;
|
||||
}
|
||||
|
||||
SMDS_IdElementMap myIDElements;
|
||||
mutable int myMin, myMax;
|
||||
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user