贴一个自己写的循环Buffer实现

无所事事,写一个循环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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值