1- { *****************************************************************************
1+ { *****************************************************************************
22  The CircularBuffer team (see file NOTICE.txt) licenses this file 
33  to you under the Apache License, Version 2.0 (the 
44  "License"); you may not use this file except in compliance 
@@ -198,7 +198,7 @@   TRingbuffer<T> = class(TObject)
198198    // /   Appends the given item to the ring buffer
199199    // / </summary>
200200    // / <param name="Item">
201-     // /   Anzuhängendes Element
201+     // /   Anzuhängendes Element
202202    // / </param>
203203    // / <exception cref="EBufferFullException">
204204    // /   not enough capacity
@@ -242,7 +242,7 @@   TRingbuffer<T> = class(TObject)
242242    // /   Number of elements to retrieve
243243    // / </param>
244244    // / <returns>
245-     // /   Array mit einer maximalen Länge von Count
245+     // /   Array mit einer maximalen Länge von Count
246246    // / </returns>
247247    // / <exception cref="EBufferEmptyException">
248248    // /   buffer is empty
@@ -378,7 +378,7 @@ implementation
378378
379379procedure  TRingbuffer <T>.Add(Item: T);
380380begin 
381-   //  nur hinzufügen wenn entweder noch Platz im Puffer oder wenn Puffer ganz
381+   //  nur hinzufügen wenn entweder noch Platz im Puffer oder wenn Puffer ganz
382382  //  leer (dann sind Start- und Ende Zeiger gleich, aber das FContaisData Flag
383383  //  ist noch false
384384  if  (Count < Size) or  ((Count = Size) and  not  FContainsData) then 
@@ -403,19 +403,19 @@ procedure TRingbuffer<T>.Add(Items: TRingbufferArray);
403403                              //  Ende des Arrays
404404  i                 : UInt32;
405405begin 
406-   assert(length(Items) > 0 , ' Hinzufügen eines leeren Arrays ist nicht sinnvoll' 
406+   assert(length(Items) > 0 , ' Hinzufügen eines leeren Arrays ist nicht sinnvoll' 
407407
408-   //  ist überhaupt noch soviel Platz im Puffer?
409-   //  Typecast nach Int64 um W1023 Warnung zu unterdrücken
408+   //  ist überhaupt noch soviel Platz im Puffer?
409+   //  Typecast nach Int64 um W1023 Warnung zu unterdrücken
410410  if  (length(Items) <= Int64(Size-Count)) then 
411411  begin 
412412    //  leeres Array sollte eigentlich nicht vorkommen, aber falls im Release
413-     //  Build Assertions aus sind sollte es auch nicht abstürzen
413+     //  Build Assertions aus sind sollte es auch nicht abstürzen
414414    if  (length(Items) > 0 ) then 
415415    begin 
416-       //  Passt das übergebene Array im Stück in den Puffer und der Puffer Inhalt
417-       //  geht derzeit auch nicht über die obere Grenze hinaus, oder muss es
418-       //  gesplittet werden? Typecast nach Int64 um W1023 Warnung zu unterdrücken
416+       //  Passt das übergebene Array im Stück in den Puffer und der Puffer Inhalt
417+       //  geht derzeit auch nicht über die obere Grenze hinaus, oder muss es
418+       //  gesplittet werden? Typecast nach Int64 um W1023 Warnung zu unterdrücken
419419      if  (Int64(Size-FNextFree) >= length(Items)) then 
420420      begin 
421421        if  not  IsManagedType(T) then 
@@ -447,7 +447,7 @@ procedure TRingbuffer<T>.Add(Items: TRingbufferArray);
447447        end ;
448448      end ;
449449
450-       //  Endeindex erhöhen
450+       //  Endeindex erhöhen
451451      AdvanceNextFree(length(Items));
452452      FContainsData := true;
453453
@@ -463,12 +463,12 @@ procedure TRingbuffer<T>.Add(Items: TRingbufferArray);
463463
464464procedure  TRingbuffer <T>.AdvanceNextFree(Increment: UInt32);
465465var 
466-   Remaining : UInt32; //  Verbleibende Speicherplätze bis zur oberen Array Grenze
466+   Remaining : UInt32; //  Verbleibende Speicherplätze bis zur oberen Array Grenze
467467begin 
468468  Remaining := Size-FNextFree;
469469
470470  inc(FNextFree, Increment);
471-   //  Ende Marker über das Array-Ende hinaus erhöht
471+   //  Ende Marker über das Array-Ende hinaus erhöht
472472  if  (FNextFree > Size-1 ) then 
473473    FNextFree := (Increment-Remaining);
474474end ;
@@ -481,7 +481,8 @@ procedure TRingbuffer<T>.Clear;
481481  FNextFree     := 0 ;
482482  FContainsData := false;
483483
484-   FreeObjectsIfOwned(FStart, Size - 1 );
484+   if  (Size > 0 ) then 
485+     FreeObjectsIfOwned(FStart, Size - 1 );
485486
486487  //  We exceet the upper end of the buffer so we need to clear the remaining
487488  //  objects from the beginning
@@ -516,21 +517,22 @@ constructor TRingbuffer<T>.Create(Size: UInt32);
516517
517518procedure  TRingbuffer <T>.Delete(Count: UInt32);
518519var 
519-   Remaining : UInt32; //  Verbleibende Speicherplätze bis zur oberen Array Grenze
520+   Remaining : UInt32; //  Verbleibende Speicherplätze bis zur oberen Array Grenze
520521  i         : Integer;
521522begin 
522523  if  (Count <= Size) then 
523524  begin 
524-     //  Puffer nur teilweise zu löschen?
525+     //  Puffer nur teilweise zu löschen?
525526    if  (Count < self.Count) then 
526527    begin 
527528      Remaining := Size - FStart;
528-       //  Pufferinhalt geht nicht über obere Array Grenze hinaus?
529+       //  Pufferinhalt geht nicht über obere Array Grenze hinaus?
529530      if  (Count < Remaining) then 
530531      begin 
531532        if  (Count > 0 ) then 
532533        begin 
533-           FreeObjectsIfOwned(FStart, FStart + Count - 1 );
534+           if  ((FStart+Count) > 0 ) then 
535+             FreeObjectsIfOwned(FStart, FStart + Count - 1 );
534536
535537          if  IsManagedType(T) then 
536538            for  i := FStart to  FStart + Count - 1  do 
@@ -544,8 +546,11 @@ procedure TRingbuffer<T>.Delete(Count: UInt32);
544546      begin 
545547        if  (Count > 0 ) then 
546548        begin 
547-           FreeObjectsIfOwned(FStart, FStart + Remaining - 1 );
548-           FreeObjectsIfOwned(0 , Count - Remaining - 1 );
549+           if  ((FStart+Remaining) > 0 ) then 
550+             FreeObjectsIfOwned(FStart, FStart + Remaining - 1 );
551+ 
552+           if  ((Count-Remaining) > 0 ) then 
553+             FreeObjectsIfOwned(0 , Count - Remaining - 1 );
549554
550555          if  IsManagedType(T) then 
551556          begin 
@@ -564,12 +569,12 @@ procedure TRingbuffer<T>.Delete(Count: UInt32);
564569        end ;
565570      end ;
566571
567-       //  nur benachrichtigen wenn überhaupt was gelöscht werden sollte
572+       //  nur benachrichtigen wenn überhaupt was gelöscht werden sollte
568573      if  assigned(FNotify) and  (Count > 0 ) then 
569574        FNotify(Count, evRemove);
570575    end 
571576    else 
572-       //  alles zu löschen
577+       //  alles zu löschen
573578      Clear;
574579  end 
575580  else 
@@ -580,7 +585,8 @@ procedure TRingbuffer<T>.Delete(Count: UInt32);
580585
581586destructor  TRingbuffer<T>.Destroy;
582587begin 
583-   FreeObjectsIfOwned(0 , Size-1 );
588+   if  (Size > 0 ) then 
589+     FreeObjectsIfOwned(0 , Size-1 );
584590
585591  SetLength(FItems, 0 );
586592
@@ -599,19 +605,19 @@ function TRingbuffer<T>.GetCount: UInt32;
599605  //  Puffer ist weder komplett leer noch komplett voll
600606  if  (FNextFree <> FStart) then 
601607  begin 
602-     //  Je nach dem ob der Puffer gerade über das Ende hinaus geht und am Anfang
608+     //  Je nach dem ob der Puffer gerade über das Ende hinaus geht und am Anfang
603609    //  weiter geht
604610    if  (FNextFree > FStart) then 
605611      result := FNextFree-FStart
606612    else 
607613    begin 
608-       //  Puffer geht über das Ende hinaus und beginnt am Array Anfang wieder
614+       //  Puffer geht über das Ende hinaus und beginnt am Array Anfang wieder
609615      l := (length(FItems)-Int64(FStart))+FNextFree;
610616      result := abs(l);
611617    end ;
612618  end 
613619  else 
614-     //  Start = Ende aber es sind daten da? Dann ist Puffer maximal gefüllt
620+     //  Start = Ende aber es sind daten da? Dann ist Puffer maximal gefüllt
615621    if  FContainsData then 
616622      result := Size
617623    else 
@@ -675,7 +681,7 @@ function TRingbuffer<T>.Peek(Index, Count: UInt32): TRingbufferArray;
675681  //  Is the index in the valid range?
676682  if  (Count <= Size) and  (Index < self.Count) then 
677683  begin 
678-     //  Ist überhaupt was im Puffer?
684+     //  Ist überhaupt was im Puffer?
679685    if  (self.Count > 0 ) then 
680686    begin 
681687      //  there are as many items in the buffer as shall be copied
@@ -732,31 +738,31 @@ function TRingbuffer<T>.Remove(RemoveCount: UInt32): TRingbufferArray;
732738var 
733739  RemoveableCount   : UInt32;  //  Anzahl entfernbarer Elemente, meist Count
734740  RemainingCount    : UInt32;  //  Anzahl Elemente von Start bis Pufferende
735-   StillContainsData : Boolean; //  Enthält der Puffer nach der Remove Operation
741+   StillContainsData : Boolean; //  Enthält der Puffer nach der Remove Operation
736742                               //  immer noch Daten?
737743  i                 : UInt32;
738744begin 
739745  if  (RemoveCount > 0 ) then 
740746  begin 
741-     //  wurden mehr Elemente angefordert als überhaupt je in den Puffer passen?
747+     //  wurden mehr Elemente angefordert als überhaupt je in den Puffer passen?
742748    if  (RemoveCount <= Size) then 
743749    begin 
744-       //  Ist überhaupt was im Puffer?
750+       //  Ist überhaupt was im Puffer?
745751      if  (Count > 0 ) then 
746752      begin 
747753        //  es sind soviele Elemente im Puffer wie entfernt werden sollen
748754        if  (RemoveCount <= Count) then 
749755          RemoveableCount := RemoveCount
750756        else 
751-           //  Nein, also nur soviele entfernen wie überhaupt möglich
757+           //  Nein, also nur soviele entfernen wie überhaupt möglich
752758          RemoveableCount := Count;
753759
754760        SetLength(result, RemoveableCount);
755761        //  wenn alle Elemente entfernt werden sollen muss Flag hinterher auf False
756762        //  gesetzt werden
757763        StillContainsData := RemoveCount <> Count;
758764
759-         //  geht der aktuelle Puffer inhalt über die obere Grenze (d.h. klappt um)?
765+         //  geht der aktuelle Puffer inhalt über die obere Grenze (d.h. klappt um)?
760766        if  ((FStart + RemoveableCount) <= Size)  then 
761767        begin 
762768          //  Nein, also Elemente direkt kopierbar
@@ -775,7 +781,7 @@ function TRingbuffer<T>.Remove(RemoveCount: UInt32): TRingbufferArray;
775781        end 
776782        else 
777783        begin 
778-           //  2 Kopieroperationen nötig
784+           //  2 Kopieroperationen nötig
779785          RemainingCount := (Size-FStart);
780786
781787          //  von Startzeiger bis Pufferende
@@ -827,7 +833,7 @@ function TRingbuffer<T>.Remove: T;
827833var 
828834  i : UInt32;
829835begin 
830-   //  ist überhaupt was im Puffer?
836+   //  ist überhaupt was im Puffer?
831837  if  Count > 0  then 
832838  begin 
833839    result := FItems[FStart];
@@ -838,7 +844,7 @@ function TRingbuffer<T>.Remove: T;
838844
839845    //  Anfangsmarker verschieben
840846    inc(FStart);
841-     //  obere Grenze überschritten?
847+     //  obere Grenze überschritten?
842848    if  (FStart = Size) then 
843849      FStart := 0 ;
844850
0 commit comments