0024911: Avoid using virtual functions in NCollection classes
[occt.git] / src / NCollection / NCollection_BaseVector.cxx
index 2750cf4..961fd63 100755 (executable)
@@ -2,20 +2,16 @@
 // Created by: Alexander GRIGORIEV
 // Copyright (c) 2002-2013 OPEN CASCADE SAS
 //
-// The content of this file is subject to the Open CASCADE Technology Public
-// License Version 6.5 (the "License"). You may not use the content of this file
-// except in compliance with the License. Please obtain a copy of the License
-// at http://www.opencascade.org and read it completely before using this file.
+// This file is part of Open CASCADE Technology software library.
 //
-// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
-// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
 //
-// The Original Code and all software distributed under the License is
-// distributed on an "AS IS" basis, without warranty of any kind, and the
-// Initial Developer hereby disclaims all such warranties, including without
-// limitation, any warranties of merchantability, fitness for a particular
-// purpose or non-infringement. Please see the License for the specific terms
-// and conditions governing the rights and limitations under the License.
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
 
 #include <NCollection_BaseVector.hxx>
 #include <Standard_RangeError.hxx>
@@ -40,20 +36,24 @@ void NCollection_BaseVector::Iterator::copyV (const NCollection_BaseVector::Iter
 //purpose  : Initialisation of iterator by a vector
 //=======================================================================
 
-void NCollection_BaseVector::Iterator::initV (const NCollection_BaseVector& theVector)
+void NCollection_BaseVector::Iterator::initV (const NCollection_BaseVector& theVector, Standard_Boolean theToEnd)
 {
-  myVector    = &theVector;
-  myICurBlock = 0;
-  myCurIndex  = 0;
+  myVector = &theVector;
+
   if (theVector.myNBlocks == 0)
   {
-    myIEndBlock = 0;
+    myCurIndex  = 0;
     myEndIndex  = 0;
+    myICurBlock = 0;
+    myIEndBlock = 0;
   }
   else
   {
     myIEndBlock = theVector.myNBlocks - 1;
     myEndIndex  = theVector.myData[myIEndBlock].Length;
+
+    myICurBlock = !theToEnd ? 0 : myIEndBlock;
+    myCurIndex  = !theToEnd ? 0 : myEndIndex;
   }
 }
 
@@ -63,12 +63,11 @@ void NCollection_BaseVector::Iterator::initV (const NCollection_BaseVector& theV
 //=======================================================================
 
 NCollection_BaseVector::MemBlock* NCollection_BaseVector
-  ::allocMemBlocks (Handle(NCollection_BaseAllocator)& theAllocator,
-                    const Standard_Integer             theCapacity,
+  ::allocMemBlocks (const Standard_Integer             theCapacity,
                     MemBlock*                          theSource,
                     const Standard_Integer             theSourceSize)
 {
-  MemBlock* aData = (MemBlock* )theAllocator->Allocate (theCapacity * sizeof(MemBlock));
+  MemBlock* aData = (MemBlock* )myAllocator->Allocate (theCapacity * sizeof(MemBlock));
 
   // copy content from source array
   Standard_Integer aCapacity = 0;
@@ -76,7 +75,7 @@ NCollection_BaseVector::MemBlock* NCollection_BaseVector
   {
     memcpy (aData, theSource, theSourceSize * sizeof(MemBlock));
     aCapacity = theSourceSize;
-    theAllocator->Free (theSource);
+    myAllocator->Free (theSource);
   }
 
   // Nullify newly allocated blocks
@@ -110,8 +109,7 @@ void NCollection_BaseVector::Clear()
 //purpose  : returns the pointer where the new data item is supposed to be put
 //=======================================================================
 
-void* NCollection_BaseVector::expandV (Handle(NCollection_BaseAllocator)& theAllocator,
-                                       const Standard_Integer             theIndex)
+void* NCollection_BaseVector::expandV (const Standard_Integer theIndex)
 {
   const Standard_Integer aNewLength = theIndex + 1;
   if (myNBlocks > 0)
@@ -140,7 +138,7 @@ void* NCollection_BaseVector::expandV (Handle(NCollection_BaseAllocator)& theAll
     // Reallocate the array myData 
     do myCapacity += GetCapacity(myIncrement); while (myCapacity <= nNewBlock);
 
-    myData = allocMemBlocks (theAllocator, myCapacity, myData, myNBlocks);
+    myData = allocMemBlocks (myCapacity, myData, myNBlocks);
   }
   if (myNBlocks > 0)
   {