⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hash.pas

📁 解码器是基于短语的统计机器翻译系统的核心模块
💻 PAS
📖 第 1 页 / 共 2 页
字号:
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 + -