52704.fb2
for Inx := 0 to pred(FHashTable.Count) do
LZHashNodeManager.FreeNode(FHashTable.List^[Inx]);
FHashTable.Free;
end;
inherited Destroy;
end;
procedure TtdLZHashTable.Empty;
var
Inx : integer;
begin
for Inx := 0 to pred(FHashTable.Count) do htFreeChain(PtdLZHashNode(FHashTable.List^[Inx]));
end;
function TtdLZHashTable.EnumMatches( const aSignature : TtdLZSignature;
aCutOffset : longint;
aAction : TtdLZSigEnumProc;
aExtraData : pointer): boolean;
var
Inx : integer;
Temp : PtdLZHashNode;
Dad : PtdLZHashNode;
begin
{предположим, что ни один элемент не найден}
Result := false;
{вычислить индекс хеш-таблицы для этой сигнатуры}
Inx := (aSignature.AsLong shr 8) mod LZHashTableSize;
{выполнить обход цепочки, расположенной в позиции с этим индексом}
Dad := PtdLZHashNode (FHashTable.List^[Inx]);
Temp := Dad^.hnNext;
while (Temp <> nil) do
begin
{если смещение этого узла меньше значения смещения, по которому выполняется усечение, остальная часть цепочки удаляется, и выполняется выход из подпрограммы}
if (Temp^.hn0ffset < aCutOffset) then begin
htFreeChain(Dad);
Exit;
end;
{если сигнатура узла совпадает с данной сигнатурой, выполняется вызов подпрограммы, выполняющей действие}
if (Temp^.hnSig.AsLong = aSignature.AsLong) then begin
Result true;
aAction(aExtraData, aSignature, Temp^.hnOffset);
end;
(перешли к следующему узлу) Dad := Temp;
Temp := Dad^.hnNext;
end;
end;
procedure TtdLZHashTable.htFreeChain(aParentNode : PtdLZHashNode);
var
Walker, Temp : PtdLZHashNo4e;
begin
Walker := aParentNode^.hnNext;