亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? hwstrhashmap.pas

?? 用于Delphi程序中嵌入公式解析
?? PAS
?? 第 1 頁 / 共 3 頁
字號:
    if not Result then
      Exit;

    Result := IterateMethodNode(ANode^.Right, AUserData, AIterateMethod);
    if not Result then
      Exit;
  end else
    Result := True;
end;

procedure TStringHashMap.NodeIterate(ANode: PPHashNode; AUserData: Pointer;
  AIterateFunc: TNodeIterateFunc);
begin
  if ANode^ <> nil then
  begin
    AIterateFunc(AUserData, ANode);
    NodeIterate(@ANode^.Left, AUserData, AIterateFunc);
    NodeIterate(@ANode^.Right, AUserData, AIterateFunc);
  end;
end;

procedure TStringHashMap.DeleteNode(var q: PHashNode);
var
  t, r, s: PHashNode;
begin
  { we must delete node q without destroying binary tree }
  { Knuth 6.2.2 D (pg 432 Vol 3 2nd ed) }

  { alternating between left / right delete to preserve decent
    performance over multiple insertion / deletion }
  FLeftDelete := not FLeftDelete;

  { t will be the node we delete }
  t := q;

  if FLeftDelete then
  begin
    if t^.Right = nil then
      q := t^.Left
    else
    begin
      r := t^.Right;
      if r^.Left = nil then
      begin
        r^.Left := t^.Left;
        q := r;
      end else
      begin
        s := r^.Left;
        if s^.Left <> nil then
          repeat
            r := s;
            s := r^.Left;
          until s^.Left = nil;
        { now, s = symmetric successor of q }
        s^.Left := t^.Left;
        r^.Left :=  s^.Right;
        s^.Right := t^.Right;
        q := s;
      end;
    end;
  end else
  begin
    if t^.Left = nil then
      q := t^.Right
    else
    begin
      r := t^.Left;
      if r^.Right = nil then
      begin
        r^.Right := t^.Right;
        q := r;
      end else
      begin
        s := r^.Right;
        if s^.Right <> nil then
          repeat
            r := s;
            s := r^.Right;
          until s^.Right = nil;
        { now, s = symmetric predecessor of q }
        s^.Right := t^.Right;
        r^.Right := s^.Left;
        s^.Left := t^.Left;
        q := s;
      end;
    end;
  end;

  { we decrement before because the tree is already adjusted
    => any exception in FreeNode MUST be ignored.

    It's unlikely that FreeNode would raise an exception anyway. }
  Dec(FCount);
  FreeNode(t);
end;

procedure TStringHashMap.DeleteNodes(var q: PHashNode);
begin
  if q^.Left <> nil then
    DeleteNodes(q^.Left);
  if q^.Right <> nil then
    DeleteNodes(q^.Right);
  FreeNode(q);
  q := nil;
end;

function TStringHashMap.AllocNode: PHashNode;
begin
  New(Result);
  Result^.Left := nil;
  Result^.Right := nil;
end;

procedure TStringHashMap.FreeNode(ANode: PHashNode);
begin
  Dispose(ANode);
end;

{
  property access
}
function TStringHashMap.GetData(const s: string): Pointer;
var
  ppn: PPHashNode;
begin
  ppn := FindNode(s);

  if ppn^ <> nil then
    Result := ppn^^.Ptr
  else
    Result := nil;
end;

procedure TStringHashMap.SetData(const s: string; p: Pointer);
var
  ppn: PPHashNode;
begin
  ppn := FindNode(s);

  if ppn^ <> nil then
    ppn^^.Ptr := p
  else
  begin
    { add }
    ppn^ := AllocNode;
    { we increment after in case of exception }
    Inc(FCount);
    ppn^^.Str := s;
    ppn^^.Ptr := p;
  end;
end;

{ public methods }

procedure TStringHashMap.Add(const s: string; const p{: Pointer});
var
  ppn: PPHashNode;
begin
  ppn := FindNode(s);

  { if reordered from SetData because ppn^ = nil is more common for Add }
  if ppn^ = nil then
  begin
    { add }
    ppn^ := AllocNode;
    { we increment after in case of exception }
    Inc(FCount);
    ppn^^.Str := s;
    ppn^^.Ptr := Pointer(p);
  end else
    raise EhwStringHashMapError.CreateResRecFmt(@RsStringHashMapDuplicate, [s]);
end;

type
  PListNode = ^TListNode;
  TListNode = record
    Next: PListNode;
    NodeLoc: PPHashNode;
  end;

  PDataParam = ^TDataParam;
  TDataParam = record
    Head: PListNode;
    Data: Pointer;
  end;

procedure NodeIterate_BuildDataList(AUserData: Pointer; ANode: PPHashNode);
var
  dp: PDataParam;
  t: PListNode;
begin
  dp := PDataParam(AUserData);
  if dp.Data = ANode^^.Ptr then
  begin
    New(t);
    t^.Next := dp.Head;
    t^.NodeLoc := ANode;
    dp.Head := t;
  end;
end;

procedure TStringHashMap.RemoveData(const p{: Pointer});
var
  dp: TDataParam;
  i: Integer;
  n, t: PListNode;
begin
  dp.Data := Pointer(p);
  dp.Head := nil;

  for i := 0 to FHashSize - 1 do
    NodeIterate(@FList^[i], @dp, NodeIterate_BuildDataList);

  n := dp.Head;
  while n <> nil do
  begin
    DeleteNode(n^.NodeLoc^);
    t := n;
    n := n^.Next;
    Dispose(t);
  end;
end;

function TStringHashMap.Remove(const s: string): Pointer;
var
  ppn: PPHashNode;
begin
  ppn := FindNode(s);

  if ppn^ <> nil then
  begin
    Result := ppn^^.Ptr;
    DeleteNode(ppn^);
  end
  else
    raise EhwStringHashMapError.CreateResRecFmt(@RsStringHashMapInvalidNode, [s]);
end;

procedure TStringHashMap.IterateMethod(AUserData: Pointer;
  AIterateMethod: TIterateMethod);
var
  i: Integer;
begin
  for i := 0 to FHashSize - 1 do
    if not IterateMethodNode(FList^[i], AUserData, AIterateMethod) then
      Break;
end;

procedure TStringHashMap.Iterate(AUserData: Pointer; AIterateFunc: TIterateFunc);
var
  i: Integer;
begin
  for i := 0 to FHashSize - 1 do
    if not IterateNode(FList^[i], AUserData, AIterateFunc) then
      Break;
end;

function TStringHashMap.Has(const s: string): Boolean;
var
  ppn: PPHashNode;
begin
  ppn := FindNode(s);
  Result := ppn^ <> nil;
end;

function TStringHashMap.Find(const s: string; var p{: Pointer}): Boolean;
var
  ppn: PPHashNode;
begin
  ppn := FindNode(s);
  Result := ppn^ <> nil;
  if Result then
    Pointer(p) := ppn^^.Ptr;
end;

type
  PFindDataResult = ^TFindDataResult;
  TFindDataResult = record
    Found: Boolean;
    ValueToFind: Pointer;
    Key: string;
  end;

function Iterate_FindData(AUserData: Pointer; const AStr: string;
  var APtr: Pointer): Boolean;
var
  pfdr: PFindDataResult;
begin
  pfdr := PFindDataResult(AUserData);
  pfdr^.Found := (APtr = pfdr^.ValueToFind);
  Result := not pfdr^.Found;
  if pfdr^.Found then
    pfdr^.Key := AStr;
end;

function TStringHashMap.FindData(const p{: Pointer}; var s: string): Boolean;
var
  pfdr: PFindDataResult;
begin
  New(pfdr);
  try
    pfdr^.Found := False;
    pfdr^.ValueToFind := Pointer(p);
    Iterate(pfdr, Iterate_FindData);
    Result := pfdr^.Found;
    if Result then
      s := pfdr^.Key;
  finally
    Dispose(pfdr);
  end;
end;

procedure TStringHashMap.Clear;
var
  i: Integer;
  ppn: PPHashNode;
begin
  for i := 0 to FHashSize - 1 do
  begin
    ppn := @FList^[i];
    if ppn^ <> nil then
      DeleteNodes(ppn^);
  end;
  FCount := 0;
end;

function TStringHashMap.GetItems(Index: Cardinal): Pointer;
var pn: PHashNode;
    i : Cardinal;
    n: integer;
begin
    if Index > Count -1 then
    raise EhwStringHashMapError.Create('索引超出范圍');
    n:= -1;
    for i := 0 to FHashSize -1 do
    begin
        pn := FList^[i];
        if pn <> nil then
        begin
            Result := pn^.Ptr;
            inc(n);
            if n=Index then Exit;
        end;
    end;
    Result := nil;
end;

function TStringHashMap.GetItemsName(Index: Cardinal): string;
var pn: PHashNode;
    i,n : Integer;
begin
    if Index > Count -1 then
    raise EhwStringHashMapError.Create('索引超出范圍');
    n:= -1;
    for i := 0 to FHashSize -1 do
    begin
        pn := FList^[i];
        if pn <> nil then
        begin
            Result := pn^.Str;
            inc(n);
            if n=Index then Exit;
        end;
    end;
    Result := '';
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美国产日本视频| 亚洲乱码国产乱码精品精98午夜 | 5566中文字幕一区二区电影| 一区二区免费在线| 欧美亚洲国产bt| 肉肉av福利一精品导航| 日韩欧美区一区二| 国产乱子伦视频一区二区三区| 国产日韩在线不卡| www.亚洲激情.com| 亚洲一区二区偷拍精品| 欧美人妇做爰xxxⅹ性高电影| 日日夜夜精品视频免费| 精品国产乱码久久久久久夜甘婷婷| 免费精品视频在线| 久久久美女艺术照精彩视频福利播放| 国产一区二区三区四区五区美女| 日本一区二区三区国色天香 | 日韩av一区二区三区四区| 欧美成人精品3d动漫h| 国产精品99久久久久久宅男| 亚洲国产成人一区二区三区| 色综合久久中文综合久久97| 午夜精品久久久久久久久久久| 欧美成人精品1314www| 北条麻妃国产九九精品视频| 一区二区三区日韩精品视频| 日韩欧美在线网站| 懂色av中文一区二区三区| 亚洲国产婷婷综合在线精品| 欧美精品一区二区在线播放| 91网上在线视频| 久久99精品久久久久久国产越南| 国产精品成人免费在线| 欧美一区二区在线视频| 本田岬高潮一区二区三区| 免费观看久久久4p| 国产精品国产三级国产aⅴ入口 | 美国十次了思思久久精品导航| 国产日本欧洲亚洲| 日韩亚洲欧美一区二区三区| 99r精品视频| 麻豆一区二区99久久久久| 欧美激情一区二区在线| 欧美一区二区三区四区五区| 99久久久国产精品免费蜜臀| 国产精品亚洲视频| 麻豆国产精品777777在线| 亚洲人成网站精品片在线观看| 精品国产免费一区二区三区四区| av不卡在线播放| 九色综合国产一区二区三区| 五月天丁香久久| 一区二区三区欧美日韩| 国产日韩综合av| 成人综合在线观看| 日韩专区中文字幕一区二区| 欧美白人最猛性xxxxx69交| 91视频com| 六月婷婷色综合| 日韩欧美在线影院| 九九精品一区二区| 久久精品欧美日韩| 色嗨嗨av一区二区三区| 麻豆成人在线观看| 国产网站一区二区| 成人中文字幕在线| 亚洲一区中文在线| 国产精品视频在线看| 精品视频色一区| 国产电影一区二区三区| 免费在线视频一区| 最新不卡av在线| 久久亚洲春色中文字幕久久久| 91国产成人在线| 韩国v欧美v日本v亚洲v| 亚洲欧美日韩综合aⅴ视频| 久久精品夜色噜噜亚洲aⅴ| 91精品蜜臀在线一区尤物| 91福利国产成人精品照片| 国产91露脸合集magnet| 免费在线成人网| 亚洲大片精品永久免费| 亚洲麻豆国产自偷在线| 国产精品美女www爽爽爽| 国产精品久久久久一区| 国产欧美日韩另类视频免费观看| 日韩欧美国产一区在线观看| 欧美精品久久久久久久多人混战| 色美美综合视频| 91蝌蚪国产九色| 成人黄色小视频在线观看| 国产呦精品一区二区三区网站| 老色鬼精品视频在线观看播放| 一区二区三区四区av| 国产精品欧美久久久久一区二区| 久久综合久久综合久久| 欧美成人猛片aaaaaaa| 欧美v国产在线一区二区三区| 日韩女同互慰一区二区| 国产精品欧美一区喷水| 国产午夜亚洲精品羞羞网站| 久久久五月婷婷| 国产欧美精品一区二区色综合 | 亚洲免费三区一区二区| 国产精品美日韩| 一区免费观看视频| 一区二区国产视频| 亚洲成人激情av| 蜜臀av性久久久久蜜臀aⅴ| 蜜桃av噜噜一区二区三区小说| 奇米四色…亚洲| 国模娜娜一区二区三区| 丰满少妇在线播放bd日韩电影| 久久99精品久久久久久久久久久久| 久色婷婷小香蕉久久| 国产在线精品视频| 成人美女在线视频| 色婷婷国产精品| 欧美日韩激情在线| 精品99999| 亚洲国产成人私人影院tom| 亚洲视频精选在线| 日韩和的一区二区| 丝袜美腿亚洲色图| av网站免费线看精品| 欧美视频完全免费看| 日韩精品专区在线影院观看| 欧美国产成人在线| 亚洲一区二区三区四区在线免费观看| 免费在线成人网| 99在线热播精品免费| 91精品久久久久久久久99蜜臂| 久久久一区二区三区| 亚洲黄色小视频| 麻豆免费看一区二区三区| 成人美女视频在线看| 欧美日韩亚洲丝袜制服| 久久久综合九色合综国产精品| **欧美大码日韩| 日本午夜一本久久久综合| 国模大尺度一区二区三区| 欧美精品日韩一区| 国产精品家庭影院| 麻豆精品在线看| 91网站视频在线观看| 精品国产一二三区| 亚洲精品日日夜夜| 国产精品一区不卡| 欧美日韩午夜在线| 精品少妇一区二区三区免费观看| 亚洲激情网站免费观看| 国产永久精品大片wwwapp| 欧美日韩一区二区三区四区| 亚洲国产精品精华液2区45| 日本不卡视频在线观看| 一本色道久久综合亚洲91| 精品国产欧美一区二区| 国产精品国产三级国产普通话99| 奇米精品一区二区三区四区| 欧美在线观看禁18| 一区二区中文视频| 国内久久精品视频| 亚洲欧美在线观看| 国产99久久久久| www国产成人免费观看视频 深夜成人网| 亚洲免费av高清| 人妖欧美一区二区| 色8久久人人97超碰香蕉987| 久久综合色8888| 福利一区二区在线观看| 精品福利一二区| 亚洲国产精品人人做人人爽| 99久久婷婷国产综合精品电影| 久久久久九九视频| 奇米777欧美一区二区| 91啪在线观看| 亚洲不卡在线观看| 欧美视频一区二区三区在线观看| 亚洲人成网站在线| 成年人国产精品| 中文字幕在线播放不卡一区| 国产成+人+日韩+欧美+亚洲| 日韩欧美一级精品久久| 国产麻豆成人精品| 久久久久一区二区三区四区| 国内欧美视频一区二区 | 国产又黄又大久久| 2023国产精品自拍| 国产成人精品亚洲日本在线桃色| 精品毛片乱码1区2区3区| 极品少妇xxxx精品少妇偷拍| 精品免费国产一区二区三区四区| 天堂va蜜桃一区二区三区漫画版| 精品日韩欧美一区二区| 国产伦精品一区二区三区免费迷| 欧美精品一区二区三区蜜桃视频 | 一区2区3区在线看| 色综合天天视频在线观看| 亚洲欧美一区二区三区久本道91|