Я просто работаю над очередью 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;
Мой вопрос:
Это эффективный способ сделать FIFOочередь (для типов данных, таких как строки, потоки, записи) размером от нескольких байтов до 1 МБ (в случае потока)?
Большое спасибо