index 9f72e3ab2f5fb547da371473cc30e87e8b47887b..fa6ec85f4c7d6d9e14a58298c3e0450275c72463 100644 (file)
--- a/src/shared/hashtable.pas
+++ b/src/shared/hashtable.pas
type
TEntryArray = array of TEntry;
+ public
+ type
TValEnumerator = record
private
mEntries: TEntryArray;
constructor Create (const aents: TEntryArray; afirst, alast: Integer);
function MoveNext (): Boolean; inline;
function getCurrent (): ValueT; inline;
+ function GetEnumerator (): TValEnumerator; inline;
property Current: ValueT read getCurrent;
end;
constructor Create (const aents: TEntryArray; afirst, alast: Integer);
function MoveNext (): Boolean; inline;
function getCurrent (): KeyT; inline;
+ function GetEnumerator (): TKeyEnumerator; inline;
property Current: KeyT read getCurrent;
end;
constructor Create (const aents: TEntryArray; afirst, alast: Integer);
function MoveNext (): Boolean; inline;
function getCurrent (): PEntry; inline;
+ function GetEnumerator (): TKeyValEnumerator; inline;
property Current: PEntry read getCurrent;
end;
type
THashIntInt = specialize THashBase<Integer, Integer>;
THashStrInt = specialize THashBase<AnsiString, Integer>;
+ THashStrStr = specialize THashBase<AnsiString, AnsiString>;
function hashNewIntInt (): THashIntInt;
function hashNewStrInt (): THashStrInt;
+function hashNewStrStr (): THashStrStr;
function u32Hash (a: LongWord): LongWord; inline;
function nextPOT (x: LongWord): LongWord; inline;
+// for integer keys
+function hiiequ (constref a, b: Integer): Boolean;
+function hiihash (constref k: Integer): LongWord;
+function hsiequ (constref a, b: AnsiString): Boolean;
+function hsihash (constref k: AnsiString): LongWord;
+
+
implementation
uses
@@ -204,7 +218,7 @@ function hsiequ (constref a, b: AnsiString): Boolean; begin result := (a = b); e
{$RANGECHECKS OFF}
function hiihash (constref k: Integer): LongWord;
begin
- result := k;
+ result := LongWord(k);
result -= (result shl 6);
result := result xor (result shr 17);
result -= (result shl 9);
end;
+function hashNewStrStr (): THashStrStr;
+begin
+ result := THashStrStr.Create(hsihash, hsiequ);
+end;
+
+
// ////////////////////////////////////////////////////////////////////////// //
{$PUSH}
{$RANGECHECKS OFF}
end;
+function THashBase.TValEnumerator.GetEnumerator (): TValEnumerator; inline; begin result.mEntries := self.mEntries; result.mFirstEntry := self.mFirstEntry; result.mLastEntry := self.mLastEntry; result.cur := self.cur; end;
+function THashBase.TKeyEnumerator.GetEnumerator (): TKeyEnumerator; inline; begin result.mEntries := self.mEntries; result.mFirstEntry := self.mFirstEntry; result.mLastEntry := self.mLastEntry; result.cur := self.cur; end;
+function THashBase.TKeyValEnumerator.GetEnumerator (): TKeyValEnumerator; inline; begin result.mEntries := self.mEntries; result.mFirstEntry := self.mFirstEntry; result.mLastEntry := self.mLastEntry; result.cur := self.cur; end;
+
+
// ////////////////////////////////////////////////////////////////////////// //
constructor THashBase.TValEnumerator.Create (const aents: TEntryArray; afirst, alast: Integer);
begin