1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverunit Antlr.Runtime.Tools; 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(* 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver[The "BSD licence"] 4324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverCopyright (c) 2008 Erik van Bilsen 5324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverAll rights reserved. 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 7324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverRedistribution and use in source and binary forms, with or without 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodification, are permitted provided that the following conditions 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverare met: 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver1. Redistributions of source code MUST RETAIN the above copyright 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver notice, this list of conditions and the following disclaimer. 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver2. Redistributions in binary form MUST REPRODUCE the above copyright 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver notice, this list of conditions and the following disclaimer in 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver the documentation and/or other materials provided with the 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver distribution. 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver3. The name of the author may not be used to endorse or promote products 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver derived from this software without specific prior WRITTEN permission. 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver4. Unless explicitly state otherwise, any contribution intentionally 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver submitted for inclusion in this work to the copyright owner or licensor 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver shall be under the terms and conditions of this license, without any 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver additional terms or conditions. 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 23324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTHIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 24324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 25324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverIN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 27324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 28324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverNOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 32324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverTHIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver*) 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverinterface 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{$IF CompilerVersion < 20} 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{$MESSAGE ERROR 'You need Delphi 2009 or higher to use the Antlr runtime'} 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{$IFEND} 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruses 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Classes, 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Generics.Defaults, 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Generics.Collections; 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertype 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TSmallintArray = array of Smallint; 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TSmallintMatrix = array of TSmallintArray; 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TIntegerArray = array of Integer; 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TUInt64Array = array of UInt64; 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TStringArray = array of String; 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertype 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Base interface for ANTLR objects 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IANTLRInterface = interface 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{FA98F2EE-89D3-42A5-BC9C-1E8A9B278C3B}'] 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToString: String; 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TANTLRInterfaceArray = array of IANTLRInterface; 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertype 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Gives access to implementing object 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IANTLRObject = interface 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{E56CE28B-8D92-4961-90ED-418A1E8FEDF2}'] 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Property accessors } 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetImplementor: TObject; 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Properties } 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property Implementor: TObject read GetImplementor; 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertype 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Base for ANTLR objects 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TANTLRObject = class(TInterfacedObject, IANTLRInterface, IANTLRObject) 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { IANTLRObject } 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetImplementor: TObject; 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertype 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Allows strings to be treated as object interfaces 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IANTLRString = interface(IANTLRInterface) 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{1C7F2030-446C-4756-81E3-EC37E04E2296}'] 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Property accessors } 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetValue: String; 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetValue(const Value: String); 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Properties } 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property Value: String read GetValue write SetValue; 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertype 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Allows strings to be treated as object interfaces 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TANTLRString = class(TANTLRObject, IANTLRString) 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict private 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FValue: String; 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { IANTLRString } 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetValue: String; 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetValue(const Value: String); 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const AValue: String); 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ToString: String; override; 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertype 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Win32 version of .NET's ICloneable 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ICloneable = interface(IANTLRInterface) 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{90240BF0-3A09-46B6-BC47-C13064809F97}'] 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Methods } 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Clone: IANTLRInterface; 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertype 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IList<T> = interface(IANTLRInterface) 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{107DB2FE-A351-4F08-B9AD-E1BA8A4690FF}'] 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Property accessors } 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetCapacity: Integer; 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetCapacity(Value: Integer); 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetCount: Integer; 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetCount(Value: Integer); 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetItem(Index: Integer): T; 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetItem(Index: Integer; const Value: T); 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetOnNotify: TCollectionNotifyEvent<T>; 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetOnNotify(Value: TCollectionNotifyEvent<T>); 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Methods } 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Add(const Value: T): Integer; 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure AddRange(const Values: array of T); overload; 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure AddRange(const Collection: IEnumerable<T>); overload; 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure AddRange(Collection: TEnumerable<T>); overload; 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure AddRange(const List: IList<T>); overload; 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Insert(Index: Integer; const Value: T); 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure InsertRange(Index: Integer; const Values: array of T); overload; 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure InsertRange(Index: Integer; const Collection: IEnumerable<T>); overload; 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure InsertRange(Index: Integer; const Collection: TEnumerable<T>); overload; 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure InsertRange(Index: Integer; const List: IList<T>); overload; 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Remove(const Value: T): Integer; 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Delete(Index: Integer); 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure DeleteRange(AIndex, ACount: Integer); 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Extract(const Value: T): T; 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Clear; 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Contains(const Value: T): Boolean; 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function IndexOf(const Value: T): Integer; 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function LastIndexOf(const Value: T): Integer; 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Reverse; 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Sort; overload; 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Sort(const AComparer: IComparer<T>); overload; 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function BinarySearch(const Item: T; out Index: Integer): Boolean; overload; 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function BinarySearch(const Item: T; out Index: Integer; const AComparer: IComparer<T>): Boolean; overload; 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure TrimExcess; 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetEnumerator: TList<T>.TEnumerator; 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetRange(const Index, Count: Integer): IList<T>; 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Properties } 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property Capacity: Integer read GetCapacity write SetCapacity; 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property Count: Integer read GetCount write SetCount; 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property Items[Index: Integer]: T read GetItem write SetItem; default; 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property OnNotify: TCollectionNotifyEvent<T> read GetOnNotify write SetOnNotify; 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertype 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IDictionary<TKey,TValue> = interface(IANTLRInterface) 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ['{5937BD21-C2C8-4E30-9787-4AEFDF1072CD}'] 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Property accessors } 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetItem(const Key: TKey): TValue; 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetItem(const Key: TKey; const Value: TValue); 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetCount: Integer; 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Methods } 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Add(const Key: TKey; const Value: TValue); 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Remove(const Key: TKey); 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Clear; 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure TrimExcess; 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function TryGetValue(const Key: TKey; out Value: TValue): Boolean; 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure AddOrSetValue(const Key: TKey; const Value: TValue); 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ContainsKey(const Key: TKey): Boolean; 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ContainsValue(const Value: TValue): Boolean; 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetEnumerator: TEnumerator<TPair<TKey, TValue>>; 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { Properties } 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property Items[const Key: TKey]: TValue read GetItem write SetItem; default; 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property Count: Integer read GetCount; 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertype 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TList<T> = class(Generics.Collections.TList<T>, IList<T>) 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver strict private 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FRefCount: Integer; 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { IInterface } 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function _AddRef: Integer; stdcall; 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function _Release: Integer; stdcall; 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { IList<T> } 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetCapacity: Integer; 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetCapacity(Value: Integer); 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetCount: Integer; 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetCount(Value: Integer); 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetItem(Index: Integer): T; 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetItem(Index: Integer; const Value: T); 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetOnNotify: TCollectionNotifyEvent<T>; 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetOnNotify(Value: TCollectionNotifyEvent<T>); 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetRange(const Index, Count: Integer): IList<T>; 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure AddRange(const List: IList<T>); overload; 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure InsertRange(Index: Integer; const List: IList<T>); overload; 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertype 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TDictionaryArray<TKey,TValue> = array of IDictionary<TKey,TValue>; 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { The TDictionary class in the first release of Delphi 2009 is very buggy. 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver This is a partial copy of that class with bug fixes. } 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TDictionary<TKey,TValue> = class(TEnumerable<TPair<TKey,TValue>>, IDictionary<TKey, TValue>) 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TItem = record 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver HashCode: Integer; 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Key: TKey; 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Value: TValue; 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TItemArray = array of TItem; 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FItems: TItemArray; 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCount: Integer; 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FComparer: IEqualityComparer<TKey>; 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FGrowThreshold: Integer; 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetCapacity(ACapacity: Integer); 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Rehash(NewCapPow2: Integer); 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Grow; 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetBucketIndex(const Key: TKey; HashCode: Integer): Integer; 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function Hash(const Key: TKey): Integer; 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure RehashAdd(HashCode: Integer; const Key: TKey; const Value: TValue); 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure DoAdd(HashCode, Index: Integer; const Key: TKey; const Value: TValue); 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function DoGetEnumerator: TEnumerator<TPair<TKey,TValue>>; override; 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(ACapacity: Integer = 0); overload; 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(const AComparer: IEqualityComparer<TKey>); overload; 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(ACapacity: Integer; const AComparer: IEqualityComparer<TKey>); overload; 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(Collection: TEnumerable<TPair<TKey,TValue>>); overload; 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(Collection: TEnumerable<TPair<TKey,TValue>>; const AComparer: IEqualityComparer<TKey>); overload; 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver destructor Destroy; override; 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TPairEnumerator = class(TEnumerator<TPair<TKey,TValue>>) 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FDictionary: TDictionary<TKey,TValue>; 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FIndex: Integer; 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetCurrent: TPair<TKey,TValue>; 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function DoGetCurrent: TPair<TKey,TValue>; override; 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function DoMoveNext: Boolean; override; 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver constructor Create(ADictionary: TDictionary<TKey,TValue>); 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property Current: TPair<TKey,TValue> read GetCurrent; 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function MoveNext: Boolean; 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { IInterface } 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FRefCount: Integer; 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function _AddRef: Integer; stdcall; 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function _Release: Integer; stdcall; 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { IDictionary<TKey, TValue> } 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetItem(const Key: TKey): TValue; 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetItem(const Key: TKey; const Value: TValue); 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetCount: Integer; 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Add(const Key: TKey; const Value: TValue); 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Remove(const Key: TKey); 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Clear; 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure TrimExcess; 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function TryGetValue(const Key: TKey; out Value: TValue): Boolean; 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure AddOrSetValue(const Key: TKey; const Value: TValue); 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ContainsKey(const Key: TKey): Boolean; 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function ContainsValue(const Value: TValue): Boolean; 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetEnumerator: TEnumerator<TPair<TKey, TValue>>; 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvertype 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <summary> 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Helper for storing local variables inside a routine. The code that ANTLR 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// generates contains a lot of block-level variable declarations, which 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// the Delphi language does not support. When generating Delphi source code, 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// I try to detect those declarations and move them to the routine header 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// as much as possible. But sometimes, this is impossible. 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This is a bit of an ugly (and slow) solution, but it works. Declare an 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// variable of the TLocalStorage type inside a routine, and you can use it 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// to access variables by name. For example, see the following C code: 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// { 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// int x = 3; 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// { 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// int y = x * 2; 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// } 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// } 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// If the Delphi code generator cannot detect the inner "y" variable, then 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// it uses the local storage as follows: 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// var 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// x: Integer; 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Locals: TLocalStorage; 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// begin 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Locals.Initialize; 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// try 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// x := 3; 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Locals['y'] := x * 2; 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// finally 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Locals.Finalize; 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// end; 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// end; 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </summary> 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This is a slow solution because it involves looking up variable names. 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// This could be done using hashing or binary search, but this is inefficient 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// with small collections. Since small collections are more typical in these 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// scenarios, we use simple linear search here. 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// The TLocalStorage record has space for 256 variables. For performance 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// reasons, this space is preallocated on the stack and does not grow if 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// needed. Also, no range checking is done. But 256 local variables should 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// be enough for all generated code. 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// Also note that the variable names are case sensitive, so 'x' is a 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// different variable than 'X'. 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// TLocalStorage can only store variables that are 32 bits in size, and 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// supports the following data typesL 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// -Integer 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// -IInterface descendants (default property) 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// <remarks> 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// You MUST call the Finalize method at the end of the routine to make 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// sure that any stored variables of type IInterface are released. 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /// </remarks> 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TLocalStorage = record 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver type 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TLocalStorageEntry = record 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FName: String; 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FValue: Pointer; 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FDataType: (dtInteger, dtInterface); 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FEntries: array [0..255] of TLocalStorageEntry; 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCount: Integer; 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetAsInteger(const Name: String): Integer; 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetAsInteger(const Name: String; const Value: Integer); 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver function GetAsInterface(const Name: String): IInterface; 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure SetAsInterface(const Name: String; const Value: IInterface); 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public 381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Initialize; 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver procedure Finalize; 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property Count: Integer read FCount; 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property AsInteger[const Name: String]: Integer read GetAsInteger write SetAsInteger; 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver property AsInterface[const Name: String]: IInterface read GetAsInterface write SetAsInterface; default; 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction InCircularRange(Bottom, Item, TopInc: Integer): Boolean; 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ Checks if A and B are implemented by the same object } 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction SameObj(const A, B: IInterface): Boolean; 393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction IfThen(const AValue: Boolean; const ATrue: IANTLRInterface; const AFalse: IANTLRInterface = nil): IANTLRInterface; overload; 395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction IsUpper(const C: Char): Boolean; 397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimplementation 399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruses 401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Windows, 402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SysUtils; 403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction SameObj(const A, B: IInterface): Boolean; 405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver X, Y: IInterface; 407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (A = nil) or (B = nil) then 409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := (A = B) 410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (A.QueryInterface(IInterface, X) = S_OK) 411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver and (B.QueryInterface(IInterface, Y) = S_OK) 412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver then 413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := (X = Y) 414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := (A = B); 416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction IfThen(const AValue: Boolean; const ATrue: IANTLRInterface; const AFalse: IANTLRInterface = nil): IANTLRInterface; overload; 419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if AValue then 421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := ATrue 422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := AFalse; 424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction IsUpper(const C: Char): Boolean; 427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := (C >= 'A') and (C <= 'Z'); 429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TANTLRObject } 432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TANTLRObject.GetImplementor: TObject; 434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := Self; 436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TANTLRString } 439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TANTLRString.Create(const AValue: String); 441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited Create; 443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FValue := AValue; 444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TANTLRString.GetValue: String; 447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FValue; 449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TANTLRString.SetValue(const Value: String); 452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FValue := Value; 454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TANTLRString.ToString: String; 457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FValue; 459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TList<T> } 462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TList<T>.AddRange(const List: IList<T>); 464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver InsertRange(GetCount, List); 466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TList<T>.GetCapacity: Integer; 469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := inherited Capacity; 471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TList<T>.GetCount: Integer; 474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := inherited Count; 476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TList<T>.GetItem(Index: Integer): T; 479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := inherited Items[Index]; 481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TList<T>.GetOnNotify: TCollectionNotifyEvent<T>; 484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := inherited OnNotify; 486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TList<T>.GetRange(const Index, Count: Integer): IList<T>; 489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver I: Integer; 491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := TList<T>.Create; 493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result.Capacity := Count; 494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for I := Index to Index + Count - 1 do 495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result.Add(GetItem(I)); 496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TList<T>.InsertRange(Index: Integer; const List: IList<T>); 499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Item: T; 501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for Item in List do 503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Insert(Index, Item); 505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(Index); 506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TList<T>.QueryInterface(const IID: TGUID; out Obj): HResult; 510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if GetInterface(IID, Obj) then 512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := 0 513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := E_NOINTERFACE; 515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TList<T>.SetCapacity(Value: Integer); 518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited Capacity := Value; 520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TList<T>.SetCount(Value: Integer); 523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited Count := Value; 525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TList<T>.SetItem(Index: Integer; const Value: T); 528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited Items[Index] := Value; 530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TList<T>.SetOnNotify(Value: TCollectionNotifyEvent<T>); 533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited OnNotify := Value; 535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TList<T>._AddRef: Integer; 538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := InterlockedIncrement(FRefCount); 540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TList<T>._Release: Integer; 543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := InterlockedDecrement(FRefCount); 545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Result = 0) then 546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Destroy; 547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TDictionary<TKey, TValue> } 550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TDictionary<TKey,TValue>.Rehash(NewCapPow2: Integer); 552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver oldItems, newItems: TItemArray; 554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i: Integer; 555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if NewCapPow2 = Length(FItems) then 557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit 558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if NewCapPow2 < 0 then 559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver OutOfMemoryError; 560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver oldItems := FItems; 562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SetLength(newItems, NewCapPow2); 563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FItems := newItems; 564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FGrowThreshold := NewCapPow2 shr 1 + NewCapPow2 shr 2; 565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for i := 0 to Length(oldItems) - 1 do 567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if oldItems[i].HashCode <> 0 then 568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver RehashAdd(oldItems[i].HashCode, oldItems[i].Key, oldItems[i].Value); 569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TDictionary<TKey,TValue>.SetCapacity(ACapacity: Integer); 572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newCap: Integer; 574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ACapacity < FCount then 576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise EArgumentOutOfRangeException.CreateRes(@sArgumentOutOfRange); 577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ACapacity = 0 then 579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Rehash(0) 580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newCap := 4; 583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while newCap < ACapacity do 584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newCap := newCap shl 1; 585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Rehash(newCap); 586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TDictionary<TKey,TValue>.Grow; 590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newCap: Integer; 592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newCap := Length(FItems) * 2; 594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if newCap = 0 then 595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newCap := 4; 596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Rehash(newCap); 597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TDictionary<TKey,TValue>.GetBucketIndex(const Key: TKey; HashCode: Integer): Integer; 600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver start, hc: Integer; 602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Length(FItems) = 0 then 604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(not High(Integer)); 605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver start := HashCode and (Length(FItems) - 1); 607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := start; 608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while True do 609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver hc := FItems[Result].HashCode; 611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Not found: return complement of insertion point. 613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if hc = 0 then 614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(not Result); 615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Found: return location. 617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (hc = HashCode) and FComparer.Equals(FItems[Result].Key, Key) then 618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(Result); 619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(Result); 621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Result >= Length(FItems) then 622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := 0; 623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TDictionary<TKey, TValue>.GetCount: Integer; 627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FCount; 629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TDictionary<TKey,TValue>.Hash(const Key: TKey): Integer; 632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconst 633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PositiveMask = not Integer($80000000); 634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Double-Abs to avoid -MaxInt and MinInt problems. 636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Not using compiler-Abs because we *must* get a positive integer; 637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // for compiler, Abs(Low(Integer)) is a null op. 638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := PositiveMask and ((PositiveMask and FComparer.GetHashCode(Key)) + 1); 639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TDictionary<TKey,TValue>.GetItem(const Key: TKey): TValue; 642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver index: Integer; 644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver index := GetBucketIndex(Key, Hash(Key)); 646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if index < 0 then 647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise EListError.CreateRes(@sGenericItemNotFound); 648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := FItems[index].Value; 649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TDictionary<TKey,TValue>.SetItem(const Key: TKey; const Value: TValue); 652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver index: Integer; 654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver oldValue: TValue; 655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver index := GetBucketIndex(Key, Hash(Key)); 657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if index < 0 then 658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise EListError.CreateRes(@sGenericItemNotFound); 659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver oldValue := FItems[index].Value; 661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FItems[index].Value := Value; 662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TDictionary<TKey,TValue>.RehashAdd(HashCode: Integer; const Key: TKey; const Value: TValue); 665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver index: Integer; 667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver index := not GetBucketIndex(Key, HashCode); 669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FItems[index].HashCode := HashCode; 670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FItems[index].Key := Key; 671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FItems[index].Value := Value; 672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TDictionary<TKey, TValue>.QueryInterface(const IID: TGUID; 675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver out Obj): HResult; 676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if GetInterface(IID, Obj) then 678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := 0 679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := E_NOINTERFACE; 681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TDictionary<TKey, TValue>._AddRef: Integer; 684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := InterlockedIncrement(FRefCount); 686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TDictionary<TKey, TValue>._Release: Integer; 689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := InterlockedDecrement(FRefCount); 691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (Result = 0) then 692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Destroy; 693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TDictionary<TKey,TValue>.Create(ACapacity: Integer = 0); 696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Create(ACapacity, nil); 698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TDictionary<TKey,TValue>.Create(const AComparer: IEqualityComparer<TKey>); 701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Create(0, AComparer); 703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TDictionary<TKey,TValue>.Create(ACapacity: Integer; const AComparer: IEqualityComparer<TKey>); 706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver cap: Integer; 708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited Create; 710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ACapacity < 0 then 711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise EArgumentOutOfRangeException.CreateRes(@sArgumentOutOfRange); 712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FComparer := AComparer; 713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if FComparer = nil then 714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FComparer := TEqualityComparer<TKey>.Default; 715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SetCapacity(ACapacity); 716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TDictionary<TKey, TValue>.Create( 719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Collection: TEnumerable<TPair<TKey, TValue>>); 720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver item: TPair<TKey,TValue>; 722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Create(0, nil); 724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for item in Collection do 725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver AddOrSetValue(item.Key, item.Value); 726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TDictionary<TKey, TValue>.Create( 729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Collection: TEnumerable<TPair<TKey, TValue>>; 730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const AComparer: IEqualityComparer<TKey>); 731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver item: TPair<TKey,TValue>; 733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Create(0, AComparer); 735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for item in Collection do 736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver AddOrSetValue(item.Key, item.Value); 737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverdestructor TDictionary<TKey,TValue>.Destroy; 740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Clear; 742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited; 743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TDictionary<TKey,TValue>.Add(const Key: TKey; const Value: TValue); 746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver index, hc: Integer; 748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if FCount >= FGrowThreshold then 750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Grow; 751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver hc := Hash(Key); 753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver index := GetBucketIndex(Key, hc); 754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if index >= 0 then 755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise EListError.CreateRes(@sGenericDuplicateItem); 756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DoAdd(hc, not index, Key, Value); 758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction InCircularRange(Bottom, Item, TopInc: Integer): Boolean; 761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := (Bottom < Item) and (Item <= TopInc) // normal 763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver or (TopInc < Bottom) and (Item > Bottom) // top wrapped 764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver or (TopInc < Bottom) and (Item <= TopInc) // top and item wrapped 765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TDictionary<TKey,TValue>.Remove(const Key: TKey); 768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver gap, index, hc, bucket: Integer; 770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver oldValue: TValue; 771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver hc := Hash(Key); 773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver index := GetBucketIndex(Key, hc); 774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if index < 0 then 775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit; 776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Removing item from linear probe hash table is moderately 778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // tricky. We need to fill in gaps, which will involve moving items 779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // which may not even hash to the same location. 780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Knuth covers it well enough in Vol III. 6.4.; but beware, Algorithm R 781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // (2nd ed) has a bug: step R4 should go to step R1, not R2 (already errata'd). 782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // My version does linear probing forward, not backward, however. 783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // gap refers to the hole that needs filling-in by shifting items down. 785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // index searches for items that have been probed out of their slot, 786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // but being careful not to move items if their bucket is between 787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // our gap and our index (so that they'd be moved before their bucket). 788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // We move the item at index into the gap, whereupon the new gap is 789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // at the index. If the index hits a hole, then we're done. 790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // If our load factor was exactly 1, we'll need to hit this hole 792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // in order to terminate. Shouldn't normally be necessary, though. 793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FItems[index].HashCode := 0; 794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver gap := index; 796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while True do 797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(index); 799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if index = Length(FItems) then 800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver index := 0; 801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver hc := FItems[index].HashCode; 803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if hc = 0 then 804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Break; 805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver bucket := hc and (Length(FItems) - 1); 807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if not InCircularRange(gap, bucket, index) then 808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FItems[gap] := FItems[index]; 810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver gap := index; 811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // The gap moved, but we still need to find it to terminate. 812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FItems[gap].HashCode := 0; 813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FItems[gap].HashCode := 0; 817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FItems[gap].Key := Default(TKey); 818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver oldValue := FItems[gap].Value; 819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FItems[gap].Value := Default(TValue); 820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Dec(FCount); 821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TDictionary<TKey,TValue>.Clear; 824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCount := 0; 826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FGrowThreshold := 0; 827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SetLength(FItems, 0); 828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SetCapacity(0); 829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TDictionary<TKey,TValue>.TrimExcess; 832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SetCapacity(FCount); 834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TDictionary<TKey,TValue>.TryGetValue(const Key: TKey; out Value: TValue): Boolean; 837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver index: Integer; 839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver index := GetBucketIndex(Key, Hash(Key)); 841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := index >= 0; 842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if Result then 843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Value := FItems[index].Value 844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Value := Default(TValue); 846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TDictionary<TKey,TValue>.DoAdd(HashCode, Index: Integer; const Key: TKey; const Value: TValue); 849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FItems[Index].HashCode := HashCode; 851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FItems[Index].Key := Key; 852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FItems[Index].Value := Value; 853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(FCount); 854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TDictionary<TKey, TValue>.DoGetEnumerator: TEnumerator<TPair<TKey, TValue>>; 857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := GetEnumerator; 859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TDictionary<TKey,TValue>.AddOrSetValue(const Key: TKey; const Value: TValue); 862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ContainsKey(Key) then 864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver SetItem(Key,Value) 865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Add(Key,Value); 867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TDictionary<TKey,TValue>.ContainsKey(const Key: TKey): Boolean; 870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := GetBucketIndex(Key, Hash(Key)) >= 0; 872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TDictionary<TKey,TValue>.ContainsValue(const Value: TValue): Boolean; 875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i: Integer; 877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver c: IEqualityComparer<TValue>; 878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver c := TEqualityComparer<TValue>.Default; 880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for i := 0 to Length(FItems) - 1 do 882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FItems[i].HashCode <> 0) and c.Equals(FItems[i].Value, Value) then 883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(True); 884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := False; 885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TDictionary<TKey,TValue>.GetEnumerator: TPairEnumerator; 888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := TPairEnumerator.Create(Self); 890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Pairs 893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverconstructor TDictionary<TKey,TValue>.TPairEnumerator.Create(ADictionary: TDictionary<TKey,TValue>); 895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver inherited Create; 897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FIndex := -1; 898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FDictionary := ADictionary; 899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TDictionary<TKey, TValue>.TPairEnumerator.DoGetCurrent: TPair<TKey, TValue>; 902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := GetCurrent; 904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TDictionary<TKey, TValue>.TPairEnumerator.DoMoveNext: Boolean; 907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := MoveNext; 909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TDictionary<TKey,TValue>.TPairEnumerator.GetCurrent: TPair<TKey,TValue>; 912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result.Key := FDictionary.FItems[FIndex].Key; 914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result.Value := FDictionary.FItems[FIndex].Value; 915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TDictionary<TKey,TValue>.TPairEnumerator.MoveNext: Boolean; 918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while FIndex < Length(FDictionary.FItems) - 1 do 920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(FIndex); 922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if FDictionary.FItems[FIndex].HashCode <> 0 then 923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(True); 924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := False; 926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ TLocalStorage } 929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TLocalStorage.Finalize; 931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver I: Integer; 933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for I := 0 to FCount - 1 do 935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FEntries[I].FDataType = dtInterface) then 936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IInterface(FEntries[I].FValue) := nil; 937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TLocalStorage.GetAsInteger(const Name: String): Integer; 940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver I: Integer; 942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for I := 0 to FCount - 1 do 944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FEntries[I].FName = Name) then 945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(Integer(FEntries[I].FValue)); 946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := 0; 947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverfunction TLocalStorage.GetAsInterface(const Name: String): IInterface; 950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver I: Integer; 952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for I := 0 to FCount - 1 do 954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FEntries[I].FName = Name) then 955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit(IInterface(FEntries[I].FValue)); 956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Result := nil; 957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TLocalStorage.Initialize; 960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FCount := 0; 962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TLocalStorage.SetAsInteger(const Name: String; const Value: Integer); 965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver I: Integer; 967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for I := 0 to FCount - 1 do 969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FEntries[I].FName = Name) then 970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FEntries[I].FValue := Pointer(Value); 972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit; 973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FEntries[FCount].FName := Name; 975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FEntries[FCount].FValue := Pointer(Value); 976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FEntries[FCount].FDataType := dtInteger; 977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(FCount); 978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverprocedure TLocalStorage.SetAsInterface(const Name: String; 981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Value: IInterface); 982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervar 983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver I: Integer; 984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbegin 985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for I := 0 to FCount - 1 do 986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (FEntries[I].FName = Name) then 987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver begin 988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IInterface(FEntries[I].FValue) := Value; 989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Exit; 990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end; 991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FEntries[FCount].FName := Name; 992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FEntries[FCount].FValue := nil; 993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IInterface(FEntries[FCount].FValue) := Value; 994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FEntries[FCount].FDataType := dtInterface; 995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Inc(FCount); 996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend; 997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend. 999