52704.fb2
FRecord : pointer;
protected
procedure hteCreateNewHashTable;
procedure hteError(aErrorCode : integer;
const aMethodName : TtdNameString);
function hteErrorMsg(aErrorCode : integer;
const aMethodName : TtdNameString): string;
function hteFindBucket(const aKey : string; var aFindInfo): boolean;
procedure hteSplitBucket(var aFindlnfo);
public
constructor Create(aHashFunc : TtdHashFuncEx;
aCompare : TtdCompareRecordKey;
aDirStream : TStream;
aBucketStream : TtdRecordStream;
aRecordStream : TtdRecordStream);
destructor Destroy; override;
function Find(const aKey : string; var aRecord): boolean;
procedure Insert(const aKey : string; var aRecord);
property Count : longint read FCount;
property Name : TtdNameString read FName write FName;
end;
Этот класс поддерживает обычные методы конструктора и деструктора, а также возможность вставки записи и ее ключа и последующего поиска записи по ее ключу.
Как показано в листинге 7.26, конструктору Create передаются три потока и два указателя на функции. Три потока предназначены для каталога, групп и записей. Первая функция - обычная функция хеширования (хотя для этой хеш-таблицы функции хеширования должны создавать 32-разрядные значения;
в данном случае никакое деление по модулю на размер таблицы не выполняется). Вторая функция -функция сравнения значения ключа Key с записью, которая считывается из потока записей.
Листинг 7.26. Создание экземпляра класса TtdHashTableExtendible
constructor TtdHashTableExtendible.Create(
aHashFunc : TtdHashFuncEx;
aCompare : TtdCompareRecordKey;
aDirStream : TStream;
aBucketStream : TtdRecordStream;
aRecordStream : TtdRecordStream);
begin
{создать предка}
inherited Create;
{создать каталог}
FDirectory := TtdHashDirectory.Create(aDirStream);
{сохранить параметры}
FHashFunc := aHashFunc;
FCompare := aCompare;
FBuckets := aBucketStream;
FRecords := aRecordStream;
{получить буфер для любой записи, которую нужно считать}
GetMem(FRecord, FRecords.RecordLength);
{если поток групп пуст, создать первую группу}
if (FBuckets.Count = 0) then
hteCreateNewHashTable;
end;
procedure TtdHashTableExtendible.hteCreateNewHashTable;
var