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

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

?? hwstrhashmap.pas

?? 用于Delphi程序中嵌入公式解析
?? PAS
?? 第 1 頁 / 共 3 頁
字號:

{ Brief: A utility iterating function that calls TObject.Free for all
  data items in a map.
  Example:
    This frees all objects in the map and clears the map.
    <code>
    var
      myMap: TStringHashMap;
      // ...
      myMap.Iterate(nil, Iterate_FreeObjects);
      myMap.Clear;
    </code> }
function Iterate_FreeObjects(AUserData: Pointer; const AStr: string;
  var AData: Pointer): Boolean;
{ Brief: A utility iterating function that calls Dispose for all data
  items in a map.
  See Also: Iterate_FreeObjects }
function Iterate_Dispose(AUserData: Pointer; const AStr: string;
  var AData: Pointer): Boolean;
{ Brief: A utility iterating function that calls FreeMem for all data
  items in a map.
  See Also: Iterate_FreeMem }
function Iterate_FreeMem(AUserData: Pointer; const AStr: string;
  var AData: Pointer): Boolean;

type
  { Brief: A useful concrete descendant of TStringHashMapTraits which
    implements case sensitive traits, with order based on ordinal value.
    See Also: TCaseInsensitiveTraits }
  TCaseSensitiveTraits = class(TStringHashMapTraits)
  public
    function Hash(const s: string): Cardinal; override;
    function Compare(const l, r: string): Integer; override;
  end;

type
  { Brief: A useful concrete descendant of TStringHashMapTraits which
    implements case insensitive traits, with order based on ordinal value.
    See Also: TCaseSensitiveTraits }
  TCaseInsensitiveTraits = class(TStringHashMapTraits)
  public
    function Hash(const s: string): Cardinal; override;
    function Compare(const l, r: string): Integer; override;
  end;

implementation

{
  ======================================================================
  Case Sensitive & Insensitive Traits
  ======================================================================
}

function TCaseSensitiveTraits.Compare(const l, r: string): Integer;
begin
  Result := CompareStr(l, r);
end;

function TCaseSensitiveTraits.Hash(const s: string): Cardinal;
begin
  Result := StrHash(s);
end;

function TCaseInsensitiveTraits.Compare(const l, r: string): Integer;
begin
  Result := CompareText(l, r);
end;

function TCaseInsensitiveTraits.Hash(const s: string): Cardinal;
begin
  Result := TextHash(s);
end;

var
  _CaseSensitiveTraits: TCaseSensitiveTraits;

function CaseSensitiveTraits: TStringHashMapTraits;
begin
  if _CaseSensitiveTraits = nil then
    _CaseSensitiveTraits := TCaseSensitiveTraits.Create;
  Result := _CaseSensitiveTraits;
end;

var
  _CaseInsensitiveTraits: TCaseInsensitiveTraits;

function CaseInsensitiveTraits: TStringHashMapTraits;
begin
  if _CaseInsensitiveTraits = nil then
    _CaseInsensitiveTraits := TCaseInsensitiveTraits.Create;
  Result := _CaseInsensitiveTraits;
end;

function Iterate_FreeObjects(AUserData: Pointer; const AStr: string;
  var AData: Pointer): Boolean;
begin
  TObject(AData).Free;
  AData := nil;
  Result := True;
end;

function Iterate_Dispose(AUserData: Pointer; const AStr: string;
  var AData: Pointer): Boolean;
begin
  Dispose(AData);
  AData := nil;
  Result := True;
end;

function Iterate_FreeMem(AUserData: Pointer; const AStr: string;
  var AData: Pointer): Boolean;
begin
  FreeMem(AData);
  AData := nil;
  Result := True;
end;

function StrHash(const s: string): Cardinal;
var
  i: Integer;
  p: PChar;
const
  C_LongBits = 32;
  C_OneEight = 4;
  C_ThreeFourths = 24;
  C_HighBits = $F0000000;
var
  temp: Cardinal;
begin
  {TODO I should really be processing 4 bytes at once... }
  Result := 0;
  p := PChar(s);

  i := Length(s);
  while i > 0 do
  begin
    Result := (Result shl C_OneEight) + Ord(p^);
    temp := Result and C_HighBits;
    if temp <> 0 then
      Result := (Result xor (temp shr C_ThreeFourths)) and (not C_HighBits);
    Dec(i);
    Inc(p);
  end;
end;

function TextHash(const s: string): Cardinal;
var
  i: Integer;
  p: PChar;
const
  C_LongBits = 32;
  C_OneEight = 4;
  C_ThreeFourths = 24;
  C_HighBits = $F0000000;
var
  temp: Cardinal;
begin
  {TODO I should really be processing 4 bytes at once... }
  Result := 0;
  p := PChar(s);

  i := Length(s);
  while i > 0 do
  begin
    Result := (Result shl C_OneEight) + Ord(UpCase(p^));
    temp := Result and C_HighBits;
    if temp <> 0 then
      Result := (Result xor (temp shr C_ThreeFourths)) and (not C_HighBits);
    Dec(i);
    Inc(p);
  end;
end;

function DataHash(var AValue; ASize: Cardinal): THashValue;
var
  p: PChar;
const
  C_LongBits = 32;
  C_OneEight = 4;
  C_ThreeFourths = 24;
  C_HighBits = $F0000000;
var
  temp: Cardinal;
begin
  {TODO I should really be processing 4 bytes at once... }
  Result := 0;
  p := @AValue;

  while ASize > 0 do
  begin
    Result := (Result shl C_OneEight) + Ord(p^);
    temp := Result and C_HighBits;
    if temp <> 0 then
      Result := (Result xor (temp shr C_ThreeFourths)) and (not C_HighBits);
    Dec(ASize);
    Inc(p);
  end;
end;

{
  ======================================================================
  TStringHashMap
  ======================================================================
}
constructor TStringHashMap.Create(ATraits: TStringHashMapTraits; AHashSize: Cardinal);
begin
  Assert(ATraits <> nil, 'HashList must have traits');
  SetHashSize(AHashSize);
  FTraits := ATraits;
end;

destructor TStringHashMap.Destroy;
begin
  Clear;
  SetHashSize(0);
  inherited Destroy;
end;

{
  protected methods
}
type
  PPCollectNodeNode = ^PCollectNodeNode;
  PCollectNodeNode = ^TCollectNodeNode;
  TCollectNodeNode = record
    next: PCollectNodeNode;
    str: string;
    ptr: Pointer;
  end;

procedure NodeIterate_CollectNodes(AUserData: Pointer; ANode: PPHashNode);
var
  ppcnn: PPCollectNodeNode;
  pcnn: PCollectNodeNode;
begin
  ppcnn := PPCollectNodeNode(AUserData);
  New(pcnn);
  pcnn^.next := ppcnn^;
  ppcnn^ := pcnn;

  pcnn^.str := ANode^^.Str;
  pcnn^.ptr := ANode^^.Ptr;
end;

procedure TStringHashMap.SetHashSize(AHashSize: Cardinal);
var
  collect_list: PCollectNodeNode;

  procedure CollectNodes;
  var
    i: Integer;
  begin
    collect_list := nil;
    for i := 0 to FHashSize - 1 do
      NodeIterate(@FList^[i], @collect_list, NodeIterate_CollectNodes);
  end;

  procedure InsertNodes;
  var
    pcnn, tmp: PCollectNodeNode;
  begin
    pcnn := collect_list;
    while pcnn <> nil do
    begin
      tmp := pcnn^.next;
      Add(pcnn^.str, pcnn^.ptr);
      Dispose(pcnn);
      pcnn := tmp;
    end;
  end;
begin
  { 4 cases:
    we are empty, and AHashSize = 0 --> nothing to do
    we are full, and AHashSize = 0 --> straight empty
    we are empty, and AHashSize > 0 --> straight allocation
    we are full, and AHashSize > 0 --> rehash }

  if FHashSize = 0 then
    if AHashSize > 0 then
    begin
      GetMem(FList, AHashSize * SizeOf(FList^[0]));
      FillChar(FList^, AHashSize * SizeOf(FList^[0]), 0);
      FHashSize := AHashSize;
    end
    else
      { nothing to do }
  else
  begin
    if AHashSize > 0 then
    begin
      { must rehash table }
      CollectNodes;
      Clear;
      ReallocMem(FList, AHashSize * SizeOf(FList^[0]));
      FillChar(FList^, AHashSize * SizeOf(FList^[0]), 0);
      FHashSize := AHashSize;
      InsertNodes;
    end
    else
    begin
      { we are clearing the table - need hash to be empty }
      if FCount > 0 then
        raise EhwStringHashMapError.CreateResRec(@RsStringHashMapMustBeEmpty);
      FreeMem(FList);
      FList := nil;
      FHashSize := 0;
    end;
  end;
end;

function TStringHashMap.FindNode(const s: string): PPHashNode;
var
  i: Cardinal;
  r: Integer;
  ppn: PPHashNode;
begin
  { we start at the node offset by s in the hash list }
  i := FTraits.Hash(s) mod FHashSize;

  ppn := @FList^[i];

  if ppn^ <> nil then
    while True do
    begin
      r := FTraits.Compare(s, ppn^^.Str);

      { left, then right, then match }
      if r < 0 then
        ppn := @ppn^^.Left
      else if r > 0 then
        ppn := @ppn^^.Right
      else
        Break;

      { check for empty position after drilling left or right }
      if ppn^ = nil then
        Break;
    end;

  Result := ppn;
end;

function TStringHashMap.IterateNode(ANode: PHashNode; AUserData: Pointer;
  AIterateFunc: TIterateFunc): Boolean;
begin
  if ANode <> nil then
  begin
    Result := AIterateFunc(AUserData, ANode^.Str, ANode^.Ptr);
    if not Result then
      Exit;

    Result := IterateNode(ANode^.Left, AUserData, AIterateFunc);
    if not Result then
      Exit;

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

function TStringHashMap.IterateMethodNode(ANode: PHashNode; AUserData: Pointer;
  AIterateMethod: TIterateMethod): Boolean;
begin
  if ANode <> nil then
  begin
    Result := AIterateMethod(AUserData, ANode^.Str, ANode^.Ptr);
    if not Result then
      Exit;

    Result := IterateMethodNode(ANode^.Left, AUserData, AIterateMethod);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人av片在线观看| 久久电影网站中文字幕| 日韩一区二区免费在线电影 | 91国偷自产一区二区三区成为亚洲经典| 亚洲午夜一区二区| 亚洲国产高清在线| 精品av久久707| 7777精品伊人久久久大香线蕉超级流畅 | 亚洲色图一区二区三区| 欧美xxxxxxxxx| 欧美精品一二三四| 91搞黄在线观看| 91视频在线看| 91视视频在线观看入口直接观看www | 8v天堂国产在线一区二区| av电影在线观看一区| 国产精品99久久久久久久女警| 天堂va蜜桃一区二区三区 | 激情综合色播五月| 人人精品人人爱| 免费不卡在线观看| 狠狠色伊人亚洲综合成人| 免费一级片91| 国产传媒久久文化传媒| 国产精品99久久久久久似苏梦涵| 国产乱一区二区| 国产成人综合精品三级| 99精品在线免费| 日本精品视频一区二区| 精品福利一区二区三区| 久久九九久久九九| 日韩伦理av电影| 午夜不卡av免费| 国产一二精品视频| 91免费观看国产| 日韩三级免费观看| 中文字幕av资源一区| 亚洲色欲色欲www在线观看| 三级久久三级久久| 国产黄人亚洲片| 在线观看视频一区二区欧美日韩| 欧美另类videos死尸| 亚洲国产高清aⅴ视频| 亚洲综合激情另类小说区| 久久99精品网久久| 色综合久久综合网97色综合 | 欧美日韩一区二区三区高清| 日韩一区二区三免费高清| 国产精品国产三级国产aⅴ入口 | 日韩免费在线观看| 亚洲人午夜精品天堂一二香蕉| 石原莉奈在线亚洲二区| 成人av网址在线观看| 欧美成人性战久久| 亚洲国产cao| av一区二区三区四区| 久久综合色婷婷| 免费看黄色91| 欧美日本在线看| 一区二区三区中文免费| 狠狠色丁香婷婷综合久久片| 欧美色综合久久| 精品一区二区在线视频| 国产成人免费高清| 不卡的av中国片| 欧美日韩一区二区三区免费看| 欧美日韩中文字幕一区二区| 久久久久亚洲综合| 成人激情小说网站| 久久综合资源网| 青草国产精品久久久久久| 91福利国产成人精品照片| 国产女人水真多18毛片18精品视频| 免费三级欧美电影| 欧美一级精品大片| 久久99这里只有精品| 日韩精品中文字幕在线不卡尤物| 日韩福利电影在线观看| 国产白丝网站精品污在线入口| 欧美一区二区三区成人| 日本欧美一区二区三区| 欧美一区二区成人| 美腿丝袜亚洲一区| 久久综合狠狠综合久久综合88| 国产毛片精品视频| 国产精品美女视频| 色菇凉天天综合网| 久久电影网站中文字幕| 日本一区二区视频在线观看| 91免费看视频| 日本三级亚洲精品| 亚洲国产成人一区二区三区| 成人av电影在线观看| 亚洲精品日韩综合观看成人91| 欧美精品久久天天躁| 国产美女娇喘av呻吟久久| 亚洲美女屁股眼交3| 日韩欧美aaaaaa| 成人av在线一区二区三区| 亚洲福利国产精品| wwwwxxxxx欧美| 欧美日韩午夜在线视频| 国产乱码一区二区三区| 亚洲一二三级电影| 国产欧美日韩三级| 欧美成人在线直播| 欧美亚洲动漫精品| 99精品国产热久久91蜜凸| 美国av一区二区| 午夜精品一区二区三区电影天堂 | 午夜精品久久久久久久蜜桃app| 欧美激情艳妇裸体舞| 欧美成人a视频| 欧美三级视频在线观看 | 91香蕉国产在线观看软件| 日本视频一区二区三区| 亚洲成人一区二区| 中文字幕一区三区| xnxx国产精品| 久久精品欧美日韩| 精品国产123| 精品国产一区二区三区av性色 | 99re这里都是精品| 成人一区二区视频| 国产91富婆露脸刺激对白| 国产乱子轮精品视频| 国产精品系列在线观看| 国产精品亚洲专一区二区三区| 麻豆精品视频在线观看免费 | 精品国产网站在线观看| 久久久.com| 亚洲视频香蕉人妖| 亚洲精品日韩一| 天天av天天翘天天综合网色鬼国产 | 成人小视频在线| 91女人视频在线观看| 欧美美女网站色| 日韩欧美久久一区| 国产精品麻豆网站| 夜夜嗨av一区二区三区| 捆绑紧缚一区二区三区视频| 国产电影一区二区三区| 欧美午夜在线一二页| 精品成人在线观看| 亚洲精品成人悠悠色影视| 日本强好片久久久久久aaa| 东方欧美亚洲色图在线| 在线观看欧美黄色| 久久久久久久免费视频了| 亚洲美女淫视频| 国产成人夜色高潮福利影视| 色综合天天综合在线视频| 在线免费观看不卡av| 精品成人在线观看| 午夜精品久久久久久久| 成人性生交大片| 亚洲精品一区二区三区福利| 亚洲久草在线视频| 国产在线视频一区二区三区| 欧美日韩免费电影| 中文字幕一区二区三区乱码在线| 男女性色大片免费观看一区二区| av午夜一区麻豆| 欧美国产精品劲爆| 国产一区二区导航在线播放| 正在播放一区二区| 亚洲一区免费观看| 99精品久久久久久| 国产精品久久久爽爽爽麻豆色哟哟| 韩国中文字幕2020精品| 56国语精品自产拍在线观看| 亚洲色图视频免费播放| 一区二区三区高清在线| 国产一区二区三区电影在线观看| 91精品国产综合久久香蕉的特点| 亚洲午夜免费电影| 欧美日本在线播放| 男人的天堂久久精品| 欧美草草影院在线视频| 国产精品一区久久久久| 国产欧美视频在线观看| 波多野结衣中文字幕一区| 亚洲欧美日韩国产一区二区三区 | 3atv在线一区二区三区| 丝袜脚交一区二区| 日韩欧美色电影| 成人av网站免费观看| 一区二区成人在线观看| 欧美日韩国产免费一区二区| 另类综合日韩欧美亚洲| 久久精品日韩一区二区三区| 欧美在线免费播放| 天堂蜜桃一区二区三区 | 国产精品夜夜嗨| 欧美福利视频导航| 日韩精品一二区| 欧美精品aⅴ在线视频| 亚洲久本草在线中文字幕| 成人久久久精品乱码一区二区三区| 欧美成人a在线|