可変データサイズの FIFO キュー (単純なもの、最初にプッシュされたもの、最初にポップ) に取り組んでいますが、設計方法がよくわかりません。そこに格納するデータ型は事前にわかっており、このクラスの各インスタンスで同じになるとしましょう。次の定義を持つレコードが格納される TList を使用することを考えていました (@David - D2007 用であるため、利用可能なGenerics.Collectionsがありません:)
type
PListItem = ^TListItem;
TListItem = record
Size: Integer; // size of the data pointed by the following member
Data: Pointer; // pointer to the target data reserved in memory
end;
このような実装を使用します (ここでは、すべてが正常に機能するふりをしているので、例外処理は使用されません)
type
TListQueue = class
private
FList: TList;
public
constructor Create;
destructor Destroy; override;
procedure Clear;
procedure Push(const Value; const Size: Integer);
procedure Pop(var Value; var Size: Integer);
end;
constructor TListQueue.Create;
begin
inherited;
FList := TList.Create;
end;
destructor TListQueue.Destroy;
begin
Clear;
FList.Free;
inherited;
end;
procedure TListQueue.Push(const Value; const Size: Integer);
var ListItem: PListItem;
begin
New(ListItem);
ListItem.Size := Size;
ListItem.Data := AllocMem(Size);
Move(Value, ListItem.Data^, Size);
FList.Add(ListItem);
end;
procedure TListQueue.Pop(var Value; var Size: Integer);
var ListItem: PListItem;
begin
if FList.Count > 0 then
begin
ListItem := FList.Items[0];
Size := ListItem^.Size;
Move(ListItem.Data^, Value, ListItem.Size);
FreeMem(ListItem.Data, ListItem.Size);
Dispose(ListItem);
FList.Delete(0);
end;
end;
procedure TListQueue.Clear;
var I: Integer;
ListItem: PListItem;
begin
for I := 0 to FList.Count - 1 do
begin
ListItem := FList.Items[I];
FreeMem(ListItem.Data, ListItem.Size);
Dispose(ListItem);
end;
FList.Clear;
end;
私の質問は:
これは、数バイトから約 1MB (ストリームの場合) のサイズの FIFO キュー (文字列、ストリーム、レコードなどのデータ型) を作成する効率的な方法ですか?
どうもありがとう