Delphiでこんなクラスを書いてみた。
interface
type
TMessage = record
Something...
end;
PEntry = ^TEntry;
TEntry = record
Message: TMessage;
Next: PEntry;
end;
TMessageQueue = class(TObject)
private
FHead: PEntry;
FTail: PEntry;
FCount: Integer;
public
constructor Create;
destructor Destroy; override;
procedure Push(Message: TMessage);
function Pop(): TMessage;
property Count: Integer read FCount;
end;
implementation
constructor TMessageQueue.Create;
begin
FHead := nil;
FTail := nil;
FCount := 0;
end;
destructor TMessageQueue.Destroy;
var
temp: PEntry;
begin
while true do
begin
if FHead = nil then Break;
temp := FHead.Next;
Dispose(FHead);
FHead := temp;
end;
end;
procedure TMessageQueue.Push(Message: TMessage);
begin
if FHead = nil then
begin
New(FHead);
FHead.Message := Message;
FHead.Next := nil;
FTail := FHead;
end
else
begin
New(FTail.Next);
FTail := FTail.Next;
FTail.Next := nil;
FTail.Message := Message;
end;
Inc(FCount);
end;
function TMessageQueue.Pop(): TMessage;
var
temp: PEntry;
begin
if FHead = nil then Assert(false)
else
begin
Dec(FCount);
Result := FHead.Message;
temp := FHead.Next;
Dispose(FHead);
FHead := temp;
end;
end;
まぁ、エラーチェックや例外対策がないのは置いといて^^;
簡単な構造体用のキュークラスですね。
Delphiでももちろん標準でキューやリストは装備されてますが、
構造体はどうも扱いがクラスオブジェクトなどと違うようで、
うまくいかなかったので、構造体用のを作ってみました。
いやはや、C++で覚えたリンクリストの知識がDelphiの方で役に立つとは。
うーん、使わなさそうなものでも覚えておくものですねぇ、
いつどこで使えるかなんか、使えないとわかりませんもんね。