52704.fb2
procedure htlGrowTable;
function htlIndexOf( const aKey : string; var aSlot : pointer): integer;
public
constructor Create(aTableSize : integer;
aHashFunc : TtdHashFunc;
aDispose : TtdDisposeProc);
destructor Destroy; override;
procedure Delete(const aKey : string);
procedure Empty;
function Find(const aKey : string; var aItem : pointer): boolean;
procedure Insert(const aKey : string; aItem : pointer);
property Count : integer read FCount;
property Name : TtdNameString read FName write FName;
end;
С этим общедоступным интерфейсом не связаны какие-то неожиданности. Он содержит метод для вставки элемента вместе с его ключом, удаления элемента посредством использования его ключа и поиска элемента по его известному ключу. Метод Clear позволяет освободить хеш-таблицу от всех элементов.
Как видите, для хранения самой хеш-таблицы будет использоваться экземпляр TtdRecordList. Интерфейс класса не дает никакого представления о структуре элементов хеш-таблицы, т.е. ячеек. Эта информация скрыта в разделе реализации модуля.
type
PHashSlot = ^THashSlot;
THashSlot = packed record
{$IFDEF Delphi1}
hsKey : PString;
{$ELSE}
hsKey : string;
{$ENDIF}
hsItem : pointer;
hsInUse: boolean;
end;
Ячейка представляет собой запись с тремя полями: ключом, собственно элементом и состоянием ячейки (независимо от того, используется оно или нет). В Delphi1 ключ - это указатель строки, в то время как в последующих версиях он является длинной строкой (которая, естественно, представляет собой замаскированный указатель).
Конструктор Create выделяет экземпляр списка записей, а деструктор Destroy освобождает его.
Листинг 7.4. Конструктор и деструктор класса TtdHashTableLinear
constructor TtdHashTableLinear.Create( aTableSize : integer;
aHashFunc : TtdHashFunc;
aDispose : TtdDisposeProc );
begin
inherited Create;
FDispose := aDispose;
if not Assigned(aHashFunc) then
htlError(tdeHashTblNoHashFunc, 'Create');
FHashFunc := aHashFunc;
FTable := TtdRecordList.Create(sizeof(THashSlot));
FTable.Name := ClassName + 1 : hash table1;
FTable.Count := TDGetClosestPrime(aTableSize);
end;
destructor TtdHashTableLinear.Destroy;
begin
if (FTable <> nil) then begin
Clear;
FTable.Destroy;
end;