📄 hash.pas
字号:
END;
PROCEDURE THash.Sort(lscAction: TListSortCompare);
BEGIN
lscUSERAction:=lscAction;
lstTable.Sort(@HashCompare);
END;
PROCEDURE THash.Sort;
BEGIN
lstTable.Sort(@HashCompareKey);
END;
FUNCTION THash.Insert(Key: STRING; Value: Pointer; iPos: Integer=POS_NOTDEF): Integer;
VAR iLooper, iIndex, Count: Integer; phrTemp: TPHashRec;
BEGIN
Count:=HashSize;
IF (iPos>=0) AND (iPos<=Count-1) AND (lstTable.Items[iPos]=NIL) THEN
BEGIN
New(phrTemp);
phrTemp.Key:=Key;
phrTemp.Value:=Value;
lstTable.Items[iPos]:=phrTemp;
Result:=HASH_OK;
Inc(FRecCount);
Exit;
END;
IF iPos=POS_OUTOFSIZE THEN
BEGIN
IF GrowSize THEN Result:=Insert(Key, Value)
ELSE Result:=EHASH_OUTOFSIZE;
Exit;
END;
iIndex:=Hash(Key);
IF lstTable.Items[iIndex]=NIL THEN
BEGIN
IF (FRecCount/lstTable.Count>=RATIO) AND GrowSize THEN
BEGIN
Result:=Insert(Key, Value);
Exit;
END;
New(phrTemp);
phrTemp.Key:=Key;
phrTemp.Value:=Value;
lstTable.Items[iIndex]:=phrTemp;
END
ELSE
BEGIN
phrTemp:=lstTable.Items[iIndex];
IF phrTemp.Key=Key THEN
BEGIN
Result:=EHASH_KEYEXISTS;
Exit;
END
ELSE
BEGIN
iLooper:=iIndex+1;
IF iLooper>=Count THEN iLooper:=0;
WHILE iLooper<>iIndex DO
BEGIN
phrTemp:=lstTable.Items[iLooper];
IF (phrTemp=NIL) OR (phrTemp.Key=Key) THEN Break;
Inc(iLooper);
IF iLooper>=Count THEN iLooper:=0;
END;
IF iLooper=iIndex THEN
BEGIN
IF GrowSize THEN Result:=Insert(Key, Value)
ELSE Result:=EHASH_OUTOFSIZE;
Exit;
END
ELSE IF phrTemp=NIL THEN
BEGIN
IF (FRecCount/lstTable.Count>=RATIO) AND GrowSize THEN
BEGIN
Result:=Insert(Key, Value);
Exit;
END;
New(phrTemp);
phrTemp.Key:=Key;
phrTemp.Value:=Value;
lstTable.Items[iLooper]:=phrTemp;
END
ELSE {phrTemp.Key=Key}
BEGIN
Result:=EHASH_KEYEXISTS;
Exit;
END;
END;
END;
Result:=HASH_OK;
Inc(FRecCount);
END;
FUNCTION Thash.Search(Key: STRING; VAR Value: Pointer; VAR iPos: Integer): Integer;
VAR iLooper, iIndex, Count: Integer; phrTemp: TPHashRec;
BEGIN
Count:=HashSize;
iIndex:=Hash(Key);
phrTemp:=lstTable.Items[iIndex];
IF phrTemp=NIL THEN
BEGIN
Value:=NIL;
iPos:=iIndex;
Result:=EHASH_KEYNOTFND;
IF FRecCount/lstTable.Count>=RATIO THEN iPos:=POS_OUTOFSIZE;
Exit;
END;
iLooper:=iIndex; //for the last iPos=... statement
IF phrTemp.Key<>Key THEN
BEGIN
iLooper:=iIndex+1;
IF iLooper>=Count THEN iLooper:=0;
WHILE iLooper<>iIndex DO
BEGIN
phrTemp:=lstTable.Items[iLooper];
IF (phrTemp=NIL) OR (phrTemp.Key=Key) THEN Break;
Inc(iLooper);
IF iLooper>=Count THEN iLooper:=0;
END;
IF iLooper=iIndex THEN
BEGIN
iPos:=POS_OUTOFSIZE;
Value:=NIL;
Result:=EHASH_KEYNOTFND;
Exit;
END;
IF phrTemp=NIL THEN
BEGIN
iPos:=iLooper;
Value:=NIL;
Result:=EHASH_KEYNOTFND;
IF FRecCount/lstTable.Count>=RATIO THEN iPos:=POS_OUTOFSIZE;
Exit;
END;
END;
//iPos:=POS_USELESS; changed on 2005.05.17 for meeting the need of SetValue
iPos:=iLooper;
Value:=phrTemp.Value;
Result:=HASH_OK;
END;
FUNCTION Thash.Search(Key: STRING; VAR Value: Pointer): Integer;
VAR iLooper, iIndex, Count: Integer; phrTemp: TPHashRec;
BEGIN
Count:=HashSize;
iIndex:=Hash(Key);
phrTemp:=lstTable.Items[iIndex];
IF phrTemp=NIL THEN
BEGIN
Value:=NIL;
Result:=EHASH_KEYNOTFND;
Exit;
END;
IF phrTemp.Key<>Key THEN
BEGIN
iLooper:=iIndex+1;
IF iLooper>=Count THEN iLooper:=0;
WHILE iLooper<>iIndex DO
BEGIN
phrTemp:=lstTable.Items[iLooper];
IF (phrTemp=NIL) OR (phrTemp.Key=Key) THEN Break;
Inc(iLooper);
IF iLooper>=Count THEN iLooper:=0;
END;
IF (iLooper=iIndex) OR (phrTemp=NIL) THEN
BEGIN
Value:=NIL;
Result:=EHASH_KEYNOTFND;
Exit;
END;
END;
Value:=phrTemp.Value;
Result:=HASH_OK;
END;
PROCEDURE THash.SetValue(iPos: Integer; Value: Pointer);
VAR Count: Integer; phrTemp: TPHashRec;
BEGIN
Count:=HashSize;
IF (iPos>=0) AND (iPos<=Count-1) AND (lstTable.Items[iPos]<>NIL) THEN
BEGIN
phrTemp:=lstTable.Items[iPos];
phrTemp.Value:=Value;
END;
END;
FUNCTION THash.DoEach(Key: STRING; dpeAction: TDoPerEntry): Integer;
VAR iLooper, iIndex, Count: Integer; phrTemp: TPHashRec;
BEGIN
Count:=HashSize;
iIndex:=Hash(Key);
phrTemp:=lstTable.Items[iIndex];
IF phrTemp=NIL THEN
BEGIN
Result:=EHASH_KEYNOTFND;
Exit;
END;
IF phrTemp.Key<>Key THEN
BEGIN
iLooper:=iIndex+1;
IF iLooper>=Count THEN iLooper:=0;
WHILE iLooper<>iIndex DO
BEGIN
phrTemp:=lstTable.Items[iLooper];
IF (phrTemp=NIL) OR (phrTemp.Key=Key) THEN Break;
Inc(iLooper);
IF iLooper>=Count THEN iLooper:=0;
END;
IF (iLooper=iIndex) OR (phrTemp=NIL) THEN
BEGIN
Result:=EHASH_KEYNOTFND;
Exit;
END;
END;
dpeAction(Key, phrTemp.Value);
Result:=HASH_OK;
END;
FUNCTION THash.DoEach(Key: STRING; dpeoAction: TDoPerEntryObject): Integer;
VAR iLooper, iIndex, Count: Integer; phrTemp: TPHashRec;
BEGIN
Count:=HashSize;
iIndex:=Hash(Key);
phrTemp:=lstTable.Items[iIndex];
IF phrTemp=NIL THEN
BEGIN
Result:=EHASH_KEYNOTFND;
Exit;
END;
IF phrTemp.Key<>Key THEN
BEGIN
iLooper:=iIndex+1;
IF iLooper>=Count THEN iLooper:=0;
WHILE iLooper<>iIndex DO
BEGIN
phrTemp:=lstTable.Items[iLooper];
IF (phrTemp=NIL) OR (phrTemp.Key=Key) THEN Break;
Inc(iLooper);
IF iLooper>=Count THEN iLooper:=0;
END;
IF (iLooper=iIndex) OR (phrTemp=NIL) THEN
BEGIN
Result:=EHASH_KEYNOTFND;
Exit;
END;
END;
dpeoAction(Key, phrTemp.Value);
Result:=HASH_OK;
END;
FUNCTION THash.DoEach(Key: STRING; dpenkAction: TDoPerEntryNoKey): Integer;
VAR iLooper, iIndex, Count: Integer; phrTemp: TPHashRec;
BEGIN
Count:=HashSize;
iIndex:=Hash(Key);
phrTemp:=lstTable.Items[iIndex];
IF phrTemp=NIL THEN
BEGIN
Result:=EHASH_KEYNOTFND;
Exit;
END;
IF phrTemp.Key<>Key THEN
BEGIN
iLooper:=iIndex+1;
IF iLooper>=Count THEN iLooper:=0;
WHILE iLooper<>iIndex DO
BEGIN
phrTemp:=lstTable.Items[iLooper];
IF (phrTemp=NIL) OR (phrTemp.Key=Key) THEN Break;
Inc(iLooper);
IF iLooper>=Count THEN iLooper:=0;
END;
IF (iLooper=iIndex) OR (phrTemp=NIL) THEN
BEGIN
Result:=EHASH_KEYNOTFND;
Exit;
END;
END;
dpenkAction(phrTemp.Value);
Result:=HASH_OK;
END;
FUNCTION THash.DoEach(Key: STRING; dpenkoAction: TDoPerEntryNoKeyObject): Integer;
VAR iLooper, iIndex, Count: Integer; phrTemp: TPHashRec;
BEGIN
Count:=HashSize;
iIndex:=Hash(Key);
phrTemp:=lstTable.Items[iIndex];
IF phrTemp=NIL THEN
BEGIN
Result:=EHASH_KEYNOTFND;
Exit;
END;
IF phrTemp.Key<>Key THEN
BEGIN
iLooper:=iIndex+1;
IF iLooper>=Count THEN iLooper:=0;
WHILE iLooper<>iIndex DO
BEGIN
phrTemp:=lstTable.Items[iLooper];
IF (phrTemp=NIL) OR (phrTemp.Key=Key) THEN Break;
Inc(iLooper);
IF iLooper>=Count THEN iLooper:=0;
END;
IF (iLooper=iIndex) OR (phrTemp=NIL) THEN
BEGIN
Result:=EHASH_KEYNOTFND;
Exit;
END;
END;
dpenkoAction(phrTemp.Value);
Result:=HASH_OK;
END;
PROCEDURE THash.DoEach(dpeAction: TDoPerEntry);
VAR iLooper, Count: Integer; phrTemp: TPHashRec;
BEGIN
Count:=lstTable.Count-1;
FOR iLooper:=0 TO Count DO
BEGIN
phrTemp:=lstTable.Items[iLooper];
IF phrTemp<>NIL THEN dpeAction(phrTemp.Key, phrTemp.Value);
END;
END;
PROCEDURE THash.DoEach(dpeoAction: TDoPerEntryObject);
VAR iLooper, Count: Integer; phrTemp: TPHashRec;
BEGIN
Count:=lstTable.Count-1;
FOR iLooper:=0 TO Count DO
BEGIN
phrTemp:=lstTable.Items[iLooper];
IF phrTemp<>NIL THEN dpeoAction(phrTemp.Key, phrTemp.Value);
END;
END;
PROCEDURE THash.DoEach(dpenkAction: TDoPerEntryNoKey);
VAR iLooper, Count: Integer; phrTemp: TPHashRec;
BEGIN
Count:=lstTable.Count-1;
FOR iLooper:=0 TO Count DO
BEGIN
phrTemp:=lstTable.Items[iLooper];
IF phrTemp<>NIL THEN dpenkAction(phrTemp.Value);
END;
END;
PROCEDURE THash.DoEach(dpenkoAction: TDoPerEntryNoKeyObject);
VAR iLooper, Count: Integer; phrTemp: TPHashRec;
BEGIN
Count:=lstTable.Count-1;
FOR iLooper:=0 TO Count DO
BEGIN
phrTemp:=lstTable.Items[iLooper];
IF phrTemp<>NIL THEN dpenkoAction(phrTemp.Value);
END;
END;
DESTRUCTOR THash.Destroy;
BEGIN
Clear;
lstTable.Free;
INHERITED Destroy;
END;
END.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -