Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 36 additions & 30 deletions Source/Ringbuffer.pas
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ TRingbuffer<T> = class(TObject)
/// Appends the given item to the ring buffer
/// </summary>
/// <param name="Item">
/// Anzuh�ngendes Element
/// Anzuhängendes Element
/// </param>
/// <exception cref="EBufferFullException">
/// not enough capacity
Expand Down Expand Up @@ -242,7 +242,7 @@ TRingbuffer<T> = class(TObject)
/// Number of elements to retrieve
/// </param>
/// <returns>
/// Array mit einer maximalen L�nge von Count
/// Array mit einer maximalen Länge von Count
/// </returns>
/// <exception cref="EBufferEmptyException">
/// buffer is empty
Expand Down Expand Up @@ -378,7 +378,7 @@ implementation

procedure TRingbuffer<T>.Add(Item: T);
begin
// nur hinzuf�gen wenn entweder noch Platz im Puffer oder wenn Puffer ganz
// nur hinzufügen wenn entweder noch Platz im Puffer oder wenn Puffer ganz
// leer (dann sind Start- und Ende Zeiger gleich, aber das FContaisData Flag
// ist noch false
if (Count < Size) or ((Count = Size) and not FContainsData) then
Expand All @@ -403,19 +403,19 @@ procedure TRingbuffer<T>.Add(Items: TRingbufferArray);
// Ende des Arrays
i : UInt32;
begin
assert(length(Items) > 0, 'Hinzuf�gen eines leeren Arrays ist nicht sinnvoll');
assert(length(Items) > 0, 'Hinzufügen eines leeren Arrays ist nicht sinnvoll');

// ist �berhaupt noch soviel Platz im Puffer?
// Typecast nach Int64 um W1023 Warnung zu unterdr�cken
// ist überhaupt noch soviel Platz im Puffer?
// Typecast nach Int64 um W1023 Warnung zu unterdrücken
if (length(Items) <= Int64(Size-Count)) then
begin
// leeres Array sollte eigentlich nicht vorkommen, aber falls im Release
// Build Assertions aus sind sollte es auch nicht abst�rzen
// Build Assertions aus sind sollte es auch nicht abstürzen
if (length(Items) > 0) then
begin
// Passt das �bergebene Array im St�ck in den Puffer und der Puffer Inhalt
// geht derzeit auch nicht �ber die obere Grenze hinaus, oder muss es
// gesplittet werden? Typecast nach Int64 um W1023 Warnung zu unterdr�cken
// Passt das übergebene Array im Stück in den Puffer und der Puffer Inhalt
// geht derzeit auch nicht über die obere Grenze hinaus, oder muss es
// gesplittet werden? Typecast nach Int64 um W1023 Warnung zu unterdrücken
if (Int64(Size-FNextFree) >= length(Items)) then
begin
if not IsManagedType(T) then
Expand Down Expand Up @@ -447,7 +447,7 @@ procedure TRingbuffer<T>.Add(Items: TRingbufferArray);
end;
end;

// Endeindex erh�hen
// Endeindex erhöhen
AdvanceNextFree(length(Items));
FContainsData := true;

Expand All @@ -463,12 +463,12 @@ procedure TRingbuffer<T>.Add(Items: TRingbufferArray);

procedure TRingbuffer<T>.AdvanceNextFree(Increment: UInt32);
var
Remaining : UInt32; // Verbleibende Speicherpl�tze bis zur oberen Array Grenze
Remaining : UInt32; // Verbleibende Speicherplätze bis zur oberen Array Grenze
begin
Remaining := Size-FNextFree;

inc(FNextFree, Increment);
// Ende Marker �ber das Array-Ende hinaus erh�ht
// Ende Marker über das Array-Ende hinaus erhöht
if (FNextFree > Size-1) then
FNextFree := (Increment-Remaining);
end;
Expand Down Expand Up @@ -517,16 +517,16 @@ constructor TRingbuffer<T>.Create(Size: UInt32);

procedure TRingbuffer<T>.Delete(Count: UInt32);
var
Remaining : UInt32; // Verbleibende Speicherpl�tze bis zur oberen Array Grenze
Remaining : UInt32; // Verbleibende Speicherplätze bis zur oberen Array Grenze
i : Integer;
begin
if (Count <= Size) then
begin
// Puffer nur teilweise zu l�schen?
// Puffer nur teilweise zu löschen?
if (Count < self.Count) then
begin
Remaining := Size - FStart;
// Pufferinhalt geht nicht �ber obere Array Grenze hinaus?
// Pufferinhalt geht nicht über obere Array Grenze hinaus?
if (Count < Remaining) then
begin
if (Count > 0) then
Expand All @@ -540,6 +540,9 @@ procedure TRingbuffer<T>.Delete(Count: UInt32);

// Startmarker verschieben
FStart := FStart + Count;
// check for wrap around
if FStart=Size then
FStart:=0;
end;
end
else
Expand Down Expand Up @@ -569,12 +572,12 @@ procedure TRingbuffer<T>.Delete(Count: UInt32);
end;
end;

// nur benachrichtigen wenn �berhaupt was gel�scht werden sollte
// nur benachrichtigen wenn überhaupt was gelöscht werden sollte
if assigned(FNotify) and (Count > 0) then
FNotify(Count, evRemove);
end
else
// alles zu l�schen
// alles zu löschen
Clear;
end
else
Expand Down Expand Up @@ -605,19 +608,19 @@ function TRingbuffer<T>.GetCount: UInt32;
// Puffer ist weder komplett leer noch komplett voll
if (FNextFree <> FStart) then
begin
// Je nach dem ob der Puffer gerade �ber das Ende hinaus geht und am Anfang
// Je nach dem ob der Puffer gerade über das Ende hinaus geht und am Anfang
// weiter geht
if (FNextFree > FStart) then
result := FNextFree-FStart
else
begin
// Puffer geht �ber das Ende hinaus und beginnt am Array Anfang wieder
// Puffer geht über das Ende hinaus und beginnt am Array Anfang wieder
l := (length(FItems)-Int64(FStart))+FNextFree;
result := abs(l);
end;
end
else
// Start = Ende aber es sind daten da? Dann ist Puffer maximal gef�llt
// Start = Ende aber es sind daten da? Dann ist Puffer maximal gefüllt
if FContainsData then
result := Size
else
Expand Down Expand Up @@ -681,7 +684,7 @@ function TRingbuffer<T>.Peek(Index, Count: UInt32): TRingbufferArray;
// Is the index in the valid range?
if (Count <= Size) and (Index < self.Count) then
begin
// Ist �berhaupt was im Puffer?
// Ist überhaupt was im Puffer?
if (self.Count > 0) then
begin
// there are as many items in the buffer as shall be copied
Expand Down Expand Up @@ -738,31 +741,31 @@ function TRingbuffer<T>.Remove(RemoveCount: UInt32): TRingbufferArray;
var
RemoveableCount : UInt32; // Anzahl entfernbarer Elemente, meist Count
RemainingCount : UInt32; // Anzahl Elemente von Start bis Pufferende
StillContainsData : Boolean; // Enth�lt der Puffer nach der Remove Operation
StillContainsData : Boolean; // Enthält der Puffer nach der Remove Operation
// immer noch Daten?
i : UInt32;
begin
if (RemoveCount > 0) then
begin
// wurden mehr Elemente angefordert als �berhaupt je in den Puffer passen?
// wurden mehr Elemente angefordert als überhaupt je in den Puffer passen?
if (RemoveCount <= Size) then
begin
// Ist �berhaupt was im Puffer?
// Ist überhaupt was im Puffer?
if (Count > 0) then
begin
// es sind soviele Elemente im Puffer wie entfernt werden sollen
if (RemoveCount <= Count) then
RemoveableCount := RemoveCount
else
// Nein, also nur soviele entfernen wie �berhaupt m�glich
// Nein, also nur soviele entfernen wie überhaupt möglich
RemoveableCount := Count;

SetLength(result, RemoveableCount);
// wenn alle Elemente entfernt werden sollen muss Flag hinterher auf False
// gesetzt werden
StillContainsData := RemoveCount <> Count;

// geht der aktuelle Puffer inhalt �ber die obere Grenze (d.h. klappt um)?
// geht der aktuelle Puffer inhalt über die obere Grenze (d.h. klappt um)?
if ((FStart + RemoveableCount) <= Size) then
begin
// Nein, also Elemente direkt kopierbar
Expand All @@ -778,10 +781,13 @@ function TRingbuffer<T>.Remove(RemoveCount: UInt32): TRingbufferArray;
end;

inc(FStart, RemoveableCount);
// check for wrap around
if FStart=Size then
FStart:=0; // TG
end
else
begin
// 2 Kopieroperationen n�tig
// 2 Kopieroperationen nötig
RemainingCount := (Size-FStart);

// von Startzeiger bis Pufferende
Expand Down Expand Up @@ -833,7 +839,7 @@ function TRingbuffer<T>.Remove: T;
var
i : UInt32;
begin
// ist �berhaupt was im Puffer?
// ist überhaupt was im Puffer?
if Count > 0 then
begin
result := FItems[FStart];
Expand All @@ -844,7 +850,7 @@ function TRingbuffer<T>.Remove: T;

// Anfangsmarker verschieben
inc(FStart);
// obere Grenze �berschritten?
// obere Grenze überschritten?
if (FStart = Size) then
FStart := 0;

Expand Down