Browse Source

--- Merging r40213 into '.':
U packages/fcl-stl/src/gdeque.pp
U packages/fcl-stl/src/gstack.pp
--- Recording mergeinfo for merge of r40213 into '.':
U .
--- Merging r40214 into '.':
U packages/fcl-stl/src/gvector.pp
G packages/fcl-stl/src/gdeque.pp
--- Recording mergeinfo for merge of r40214 into '.':
G .
--- Merging r40292 into '.':
G packages/fcl-stl/src/gdeque.pp
--- Recording mergeinfo for merge of r40292 into '.':
G .

# revisions: 40213,40214,40292

git-svn-id: branches/fixes_3_2@40301 -

marco 6 years ago
parent
commit
cddd8fbbf5
3 changed files with 51 additions and 10 deletions
  1. 28 8
      packages/fcl-stl/src/gdeque.pp
  2. 6 0
      packages/fcl-stl/src/gstack.pp
  3. 17 2
      packages/fcl-stl/src/gvector.pp

+ 28 - 8
packages/fcl-stl/src/gdeque.pp

@@ -34,6 +34,7 @@ type
   public
     function Size():SizeUInt;inline;
     constructor Create();
+    Procedure  Clear;
     procedure PushBack(value:T);inline;
     procedure PushFront(value:T);inline;
     procedure PopBack();inline;
@@ -58,6 +59,12 @@ begin
   FStart:=0;
 end;
 
+procedure TDeque.Clear;
+begin
+ FDataSize:=0;
+ FStart:=0;
+end;
+
 function TDeque.Size():SizeUInt;inline;
 begin
   Size:=FDataSize;
@@ -65,10 +72,7 @@ end;
 
 function TDeque.IsEmpty():boolean;inline;
 begin
-  if Size()=0 then 
-    IsEmpty:=true
-  else 
-    IsEmpty:=false;
+  IsEmpty:=Size()=0;
 end;
 
 procedure TDeque.PushBack(value:T);inline;
@@ -139,13 +143,29 @@ begin
 end;
 
 procedure TDeque.IncreaseCapacity;inline;
-var i,OldEnd:SizeUInt;
+const
+  // if size is small, multiply by 2;
+  // if size bigger but <256M, inc by 1/8*size;
+  // otherwise inc by 1/16*size
+  cSizeSmall = 1*1024*1024;
+  cSizeBig = 256*1024*1024;
+var
+  i,OldEnd,
+  DataSize:SizeUInt;
 begin
   OldEnd:=FCapacity;
-  if(FCapacity=0) then
-    FCapacity:=1
+  DataSize:=FCapacity*SizeOf(T);
+  if FCapacity=0 then
+    FCapacity:=4
+  else
+  if DataSize<cSizeSmall then
+    FCapacity:=FCapacity*2
   else
-    FCapacity:=FCapacity*2;
+  if DataSize<cSizeBig then
+    FCapacity:=FCapacity+FCapacity div 8
+  else
+    FCapacity:=FCapacity+FCapacity div 16;
+
   SetLength(FData, FCapacity);
   if (FStart>0) then 
     for i:=0 to FStart-1 do

+ 6 - 0
packages/fcl-stl/src/gstack.pp

@@ -24,6 +24,7 @@ type
     type TContainer= specialize TVector<T>;
     var FData:TContainer;
     public
+    Procedure Clear;
     procedure Push(x:T);inline;
     procedure Pop();inline;
     function Top():T;inline;
@@ -40,6 +41,11 @@ begin
   FData:=TContainer.Create;
 end;
 
+Procedure TStack.Clear;
+begin
+  FData.Clear;
+end;
+
 destructor TStack.Destroy;
 begin
   FData.Destroy;

+ 17 - 2
packages/fcl-stl/src/gvector.pp

@@ -157,11 +157,26 @@ begin
 end;
 
 procedure TVector.IncreaseCapacity();
+const
+  // if size is small, multiply by 2;
+  // if size bigger but <256M, inc by 1/8*size;
+  // otherwise inc by 1/16*size
+  cSizeSmall = 1*1024*1024;
+  cSizeBig = 256*1024*1024;
+var
+  DataSize:SizeUInt;
 begin
+  DataSize:=FCapacity*SizeOf(T);
   if FCapacity=0 then
-    FCapacity:=1
+    FCapacity:=4
+  else
+  if DataSize<cSizeSmall then
+    FCapacity:=FCapacity*2
+  else
+  if DataSize<cSizeBig then
+    FCapacity:=FCapacity+FCapacity div 8
   else
-    FCapacity:=FCapacity*2;
+    FCapacity:=FCapacity+FCapacity div 16;
   SetLength(FData, FCapacity);
 end;