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