Понимаю. Было бы очень уродливо поместить его в строку необработанных тестов, а затем попытаться выяснить, является ли это записью или чем-то еще, если вы хотите просмотреть и выбросить элементы в очередь после того, как вы сгладили ее.

сто работаю над очередью 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 МБ (в случае потока)?

большое спасибо

Ответы на вопрос(3)

Ваш ответ на вопрос