无所事事,写一个循环Buffer 证明自己还没有老年痴呆。
Delphi`
unit ringbuffer;
interface
uses
SysUtils, Generics.Collections;
type
TringbufferUnit = record
index: integer;
data: ^T;
next: ^TringbufferUnit;
end;
TringbufferUnitlist = array of TringbufferUnit;
Tringbuffer = class(Tobject)
private
FrealData: TArray;
Fcapcity: integer;
Ffillcount: integer;
Fhead: ^TringbufferUnit;
Fbuffer: TringbufferUnitlist;
Fcurrentindex: ^TringbufferUnit;
function getCount: integer;
public
constructor Create(Maxnumber: integer);
procedure Add(data: T); // : T;
procedure Clear;
function Peek(i: integer): T;
function Alldata(var datas: TArray): integer;
published
property Count: integer read Ffillcount;
end;
implementation
{ Tringbuffer }
procedure Tringbuffer.Add(data: T);
begin
if Ffillcount <> Fcapcity then
begin
Move(data, Fbuffer[Fcurrentindex.index].data^, sizeof(T));
Fcurrentindex := Fcurrentindex.next; // +1;
Ffillcount := Ffillcount + 1;
end
else
begin
Fhead := Fhead.next;
Move(data, Fbuffer[Fcurrentindex.index].data^, sizeof(T));
Fcurrentindex := Fcurrentindex.next; // +1;
end;
end;
function Tringbuffer.Alldata(var datas: TArray): integer;
var
head: ^TringbufferUnit;
begin
if Ffillcount <> Fcapcity then
begin
Result := Ffillcount;
SetLength(datas, Ffillcount);
Move(FrealData[0], datas[0], sizeof(T) * Ffillcount);
end
else
begin
Result := Fcapcity;
SetLength(datas, Fcapcity);
head := Fhead;
Move(FrealData[head.index], datas[0], sizeof(T) * (Fcapcity - head.index));
Move(FrealData[0], datas[Fcapcity - head.index], sizeof(T) * (head.index));
end;
end;
procedure Tringbuffer.Clear;
begin
Fcurrentindex := @Fbuffer[0];
Fhead := @Fbuffer[0];
Ffillcount := 0;
end;
constructor Tringbuffer.Create(Maxnumber: integer);
var
i: integer;
begin
if Maxnumber <= 0 then
Maxnumber := 5;
SetLength(FrealData, Maxnumber);
SetLength(Fbuffer, Maxnumber);
for i := Low(Fbuffer) to High(Fbuffer) do
begin
Fbuffer[i].index := i; // index
Fbuffer[i].data := @FrealData[i];
if i = High(Fbuffer) then
begin
Fbuffer[i].next := @Fbuffer[0];
end
else
begin
Fbuffer[i].next := @Fbuffer[i + 1];
end;
end;
Fcurrentindex := @Fbuffer[0];
Fhead := @Fbuffer[0]; //
Fcapcity := Maxnumber;
end;
function Tringbuffer.getCount: integer;
begin
Result := Ffillcount;
end;
function Tringbuffer.Peek(i: integer): T;
var
head: ^TringbufferUnit;
u: integer;
begin
head := Fhead;
u := i + head.index;
if u >= Fcapcity then
u := u mod Fcapcity;
Move(FrealData[u], Result, sizeof(T));
end;
end.