Quellcode durchsuchen

* fpslist.deleterange mantis #32807

git-svn-id: trunk@37871 -
marco vor 7 Jahren
Ursprung
Commit
b20dd5cdbb
1 geänderte Dateien mit 30 neuen und 0 gelöschten Zeilen
  1. 30 0
      rtl/objpas/fgl.pp

+ 30 - 0
rtl/objpas/fgl.pp

@@ -71,6 +71,7 @@ type
     function Add(Item: Pointer): Integer;
     procedure Clear;
     procedure Delete(Index: Integer);
+    procedure DeleteRange(IndexFrom, IndexTo : Integer);
     class procedure Error(const Msg: string; Data: PtrInt);
     procedure Exchange(Index1, Index2: Integer);
     function Expand: TFPSList;
@@ -578,6 +579,35 @@ begin
   FillChar(InternalItems[FCount]^, (FCapacity+1-FCount) * FItemSize, #0);
 end;
 
+procedure TFPSList.DeleteRange(IndexFrom, IndexTo : Integer);
+var
+  ListItem: Pointer;
+  I: Integer;
+  OldCnt : Integer;
+begin
+  CheckIndex(IndexTo);
+  CheckIndex(IndexFrom);
+  OldCnt:=FCount;
+  Dec(FCount,IndexTo-IndexFrom+1);
+  For I :=IndexFrom To Indexto Do
+    begin
+      ListItem := InternalItems[I];
+      Deref(ListItem);
+    end;
+  System.Move(InternalItems[IndexTo+1]^, InternalItems[IndexFrom]^, (OldCnt - IndexTo-1) * FItemSize);
+  // Shrink the list if appropriate
+  if (FCapacity > 256) and (FCount < FCapacity shr 2) then
+  begin
+    FCapacity := FCapacity shr 1;
+    ReallocMem(FList, (FCapacity+1) * FItemSize);
+  end;
+  { Keep the ending of the list filled with zeros, don't leave garbage data
+    there. Otherwise, we could accidentally have there a copy of some item
+    on the list, and accidentally Deref it too soon.
+    See http://bugs.freepascal.org/view.php?id=20005. }
+  FillChar(InternalItems[FCount]^, (FCapacity+1-FCount) * FItemSize, #0);
+end;
+
 procedure TFPSList.Extract(Item: Pointer; ResultPtr: Pointer);
 var
   i : Integer;