Salome HOME
Movement of examples to CVS EXAMPLES SAMPLES_SRC.
[modules/smesh.git] / src / SMDS / SMDS_MeshIDFactory.cxx
index 6e02557e08b771936625113e0c6bcae92a4873ac..536b2f7835974448c9f8af4f2dc8a1297508e09b 100644 (file)
 //  Author : Jean-Michel BOULCOURT
 //  Module : SMESH
 
-using namespace std;
-#include "SMDS_MeshIDFactory.ixx"
 
+#include "SMDS_MeshIDFactory.hxx"
+
+using namespace std;
 
 //=======================================================================
 //function : SMDS_MeshIDFactory
 //purpose  : 
 //=======================================================================
 
-SMDS_MeshIDFactory::SMDS_MeshIDFactory() : myMaxID(0)
+SMDS_MeshIDFactory::SMDS_MeshIDFactory():myMaxID(0)
+{
+}
+
+int SMDS_MeshIDFactory::GetFreeID()
 {
+       if (myPoolOfID.empty()) return ++myMaxID;
+       else
+       {
+                set<int>::iterator i = myPoolOfID.begin();
+               int ID = *i;//myPoolOfID.top();
+               myPoolOfID.erase( i );//myPoolOfID.pop();
+               return ID;
+       }
 }
 
+//=======================================================================
+//function : ReleaseID
+//purpose  : 
+//=======================================================================
+void SMDS_MeshIDFactory::ReleaseID(const int ID)
+{
+  if ( ID > 0 )
+  {
+    if ( ID < myMaxID )
+    {
+      myPoolOfID.insert(ID);
+    }
+    else if ( ID == myMaxID )
+    {
+      --myMaxID;
+      if ( !myPoolOfID.empty() ) // assure that myMaxID is not in myPoolOfID
+      {
+        set<int>::iterator i = --myPoolOfID.end();
+        while ( i != myPoolOfID.begin() && myMaxID == *i ) {
+          --myMaxID; --i;
+        }
+        if ( myMaxID == *i )
+          --myMaxID; // begin of myPoolOfID reached
+        else
+          ++i;
+        myPoolOfID.erase( i, myPoolOfID.end() );
+      }
+    }
+  }
+}