xref: /aosp_15_r20/external/antlr/runtime/ObjC/Framework/HashMap.h (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robot //
2*16467b97STreehugger Robot //  HashMap.h
3*16467b97STreehugger Robot //  ANTLR
4*16467b97STreehugger Robot //
5*16467b97STreehugger Robot // Copyright (c) 2010 Alan Condit
6*16467b97STreehugger Robot // All rights reserved.
7*16467b97STreehugger Robot //
8*16467b97STreehugger Robot // Redistribution and use in source and binary forms, with or without
9*16467b97STreehugger Robot // modification, are permitted provided that the following conditions
10*16467b97STreehugger Robot // are met:
11*16467b97STreehugger Robot // 1. Redistributions of source code must retain the above copyright
12*16467b97STreehugger Robot //    notice, this list of conditions and the following disclaimer.
13*16467b97STreehugger Robot // 2. Redistributions in binary form must reproduce the above copyright
14*16467b97STreehugger Robot //    notice, this list of conditions and the following disclaimer in the
15*16467b97STreehugger Robot //    documentation and/or other materials provided with the distribution.
16*16467b97STreehugger Robot // 3. The name of the author may not be used to endorse or promote products
17*16467b97STreehugger Robot //    derived from this software without specific prior written permission.
18*16467b97STreehugger Robot //
19*16467b97STreehugger Robot // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20*16467b97STreehugger Robot // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21*16467b97STreehugger Robot // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22*16467b97STreehugger Robot // IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23*16467b97STreehugger Robot // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24*16467b97STreehugger Robot // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25*16467b97STreehugger Robot // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26*16467b97STreehugger Robot // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*16467b97STreehugger Robot // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28*16467b97STreehugger Robot // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*16467b97STreehugger Robot 
30*16467b97STreehugger Robot #import <Foundation/Foundation.h>
31*16467b97STreehugger Robot #import "AMutableArray.h"
32*16467b97STreehugger Robot #import "AMutableDictionary.h"
33*16467b97STreehugger Robot #import "ArrayIterator.h"
34*16467b97STreehugger Robot #import "LinkBase.h"
35*16467b97STreehugger Robot #import "MapElement.h"
36*16467b97STreehugger Robot #import "PtrBuffer.h"
37*16467b97STreehugger Robot 
38*16467b97STreehugger Robot #define GLOBAL_SCOPE       0
39*16467b97STreehugger Robot #define LOCAL_SCOPE        1
40*16467b97STreehugger Robot #define HASHSIZE         101
41*16467b97STreehugger Robot #define HBUFSIZE      0x2000
42*16467b97STreehugger Robot 
43*16467b97STreehugger Robot @class HashMap;
44*16467b97STreehugger Robot 
45*16467b97STreehugger Robot /**
46*16467b97STreehugger Robot  * HashMap entry.
47*16467b97STreehugger Robot  */
48*16467b97STreehugger Robot 
49*16467b97STreehugger Robot @interface HMEntry : NSObject {
50*16467b97STreehugger Robot     HMEntry  *next;
51*16467b97STreehugger Robot     NSInteger hash;
52*16467b97STreehugger Robot     NSString *key;
53*16467b97STreehugger Robot     id value;
54*16467b97STreehugger Robot }
55*16467b97STreehugger Robot 
56*16467b97STreehugger Robot @property(nonatomic, retain) HMEntry  *next;
57*16467b97STreehugger Robot @property(assign)            NSInteger  hash;
58*16467b97STreehugger Robot @property(nonatomic, retain) NSString *key;
59*16467b97STreehugger Robot @property(nonatomic, retain) id value;
60*16467b97STreehugger Robot 
61*16467b97STreehugger Robot + (HMEntry *)newEntry:(NSInteger)h key:(NSString *)k value:(id)v next:(HMEntry *) n;
62*16467b97STreehugger Robot - (id) init:(NSInteger)h key:(NSString *)k value:(id)v next:(HMEntry *)n;
63*16467b97STreehugger Robot - (void) setValue:(id)newValue;
64*16467b97STreehugger Robot - (BOOL) isEqualTo:(id)o;
65*16467b97STreehugger Robot - (NSInteger) hashCode;
66*16467b97STreehugger Robot - (NSString *) description;
67*16467b97STreehugger Robot - (void) recordAccess:(HashMap *)m;
68*16467b97STreehugger Robot - (void) recordRemoval:(HashMap *)m;
69*16467b97STreehugger Robot @end
70*16467b97STreehugger Robot 
71*16467b97STreehugger Robot @interface HashIterator : ArrayIterator {
72*16467b97STreehugger Robot     HMEntry  *next;
73*16467b97STreehugger Robot     NSInteger expectedModCount;
74*16467b97STreehugger Robot     NSInteger idx;
75*16467b97STreehugger Robot     HMEntry  *current;
76*16467b97STreehugger Robot     HashMap  *hm;
77*16467b97STreehugger Robot }
78*16467b97STreehugger Robot 
79*16467b97STreehugger Robot + (HashIterator *) newIterator:(HashMap *)aHM;
80*16467b97STreehugger Robot 
81*16467b97STreehugger Robot - (id) init:(HashMap *)aHM;
82*16467b97STreehugger Robot - (BOOL) hasNext;
83*16467b97STreehugger Robot - (HMEntry *) next;
84*16467b97STreehugger Robot - (void) remove;
85*16467b97STreehugger Robot @end
86*16467b97STreehugger Robot 
87*16467b97STreehugger Robot @interface HMEntryIterator : HashIterator
88*16467b97STreehugger Robot {
89*16467b97STreehugger Robot }
90*16467b97STreehugger Robot 
91*16467b97STreehugger Robot + (HMEntryIterator *)newIterator:(HashMap *)aHM;
92*16467b97STreehugger Robot 
93*16467b97STreehugger Robot - (id) init:(HashMap *)aHM;
94*16467b97STreehugger Robot - (HMEntry *) next;
95*16467b97STreehugger Robot @end
96*16467b97STreehugger Robot 
97*16467b97STreehugger Robot @interface HMValueIterator : HashIterator
98*16467b97STreehugger Robot {
99*16467b97STreehugger Robot }
100*16467b97STreehugger Robot 
101*16467b97STreehugger Robot + (HMValueIterator *)newIterator:(HashMap *)aHM;
102*16467b97STreehugger Robot 
103*16467b97STreehugger Robot - (id) init:(HashMap *)aHM;
104*16467b97STreehugger Robot - (id) next;
105*16467b97STreehugger Robot @end
106*16467b97STreehugger Robot 
107*16467b97STreehugger Robot @interface HMKeyIterator : HashIterator
108*16467b97STreehugger Robot {
109*16467b97STreehugger Robot }
110*16467b97STreehugger Robot 
111*16467b97STreehugger Robot + (HMKeyIterator *)newIterator:(HashMap *)aHM;
112*16467b97STreehugger Robot 
113*16467b97STreehugger Robot - (id) init:(HashMap *)aHM;
114*16467b97STreehugger Robot - (NSString *) next;
115*16467b97STreehugger Robot @end
116*16467b97STreehugger Robot 
117*16467b97STreehugger Robot @interface HMKeySet : NSSet
118*16467b97STreehugger Robot {
119*16467b97STreehugger Robot     HashMap *hm;
120*16467b97STreehugger Robot     AMutableArray *anArray;
121*16467b97STreehugger Robot }
122*16467b97STreehugger Robot 
123*16467b97STreehugger Robot @property (retain) HashMap *hm;
124*16467b97STreehugger Robot @property (retain) AMutableArray *anArray;
125*16467b97STreehugger Robot 
126*16467b97STreehugger Robot + (HMKeySet *)newKeySet:(HashMap *)aHM;
127*16467b97STreehugger Robot 
128*16467b97STreehugger Robot - (id) init:(HashMap *)aHM;
129*16467b97STreehugger Robot - (HashIterator *) iterator;
130*16467b97STreehugger Robot - (NSUInteger) count;
131*16467b97STreehugger Robot - (BOOL) contains:(id)o;
132*16467b97STreehugger Robot - (BOOL) remove:(id)o;
133*16467b97STreehugger Robot - (void) clear;
134*16467b97STreehugger Robot - (AMutableArray *)toArray;
135*16467b97STreehugger Robot @end
136*16467b97STreehugger Robot 
137*16467b97STreehugger Robot @interface Values : PtrBuffer
138*16467b97STreehugger Robot {
139*16467b97STreehugger Robot     HashMap *hm;
140*16467b97STreehugger Robot     AMutableArray *anArray;
141*16467b97STreehugger Robot }
142*16467b97STreehugger Robot 
143*16467b97STreehugger Robot @property (retain) HashMap *hm;
144*16467b97STreehugger Robot @property (retain) AMutableArray *anArray;
145*16467b97STreehugger Robot 
146*16467b97STreehugger Robot + (Values *)newValueSet:(HashMap *)aHM;
147*16467b97STreehugger Robot 
148*16467b97STreehugger Robot - (id) init:(HashMap *)aHM;
149*16467b97STreehugger Robot - (HashIterator *) iterator;
150*16467b97STreehugger Robot - (NSUInteger) count;
151*16467b97STreehugger Robot - (BOOL) contains:(id)o;
152*16467b97STreehugger Robot - (void) clear;
153*16467b97STreehugger Robot - (AMutableArray *)toArray;
154*16467b97STreehugger Robot @end
155*16467b97STreehugger Robot 
156*16467b97STreehugger Robot @interface HMEntrySet : NSSet
157*16467b97STreehugger Robot {
158*16467b97STreehugger Robot     HashMap *hm;
159*16467b97STreehugger Robot     AMutableArray *anArray;
160*16467b97STreehugger Robot }
161*16467b97STreehugger Robot 
162*16467b97STreehugger Robot @property (retain) HashMap *hm;
163*16467b97STreehugger Robot @property (retain) AMutableArray *anArray;
164*16467b97STreehugger Robot 
165*16467b97STreehugger Robot + (HMEntrySet *)newEntrySet:(HashMap *)aHM;
166*16467b97STreehugger Robot 
167*16467b97STreehugger Robot - (id) init:(HashMap *)aHM;
168*16467b97STreehugger Robot - (HashIterator *) iterator;
169*16467b97STreehugger Robot - (BOOL) contains:(id)o;
170*16467b97STreehugger Robot - (BOOL) remove:(id)o;
171*16467b97STreehugger Robot - (NSUInteger) count;
172*16467b97STreehugger Robot - (void) clear;
173*16467b97STreehugger Robot - (NSArray *)toArray;
174*16467b97STreehugger Robot @end
175*16467b97STreehugger Robot 
176*16467b97STreehugger Robot @interface HashMap : LinkBase {
177*16467b97STreehugger Robot     //    TStringPool *fPool;
178*16467b97STreehugger Robot     NSInteger Scope;
179*16467b97STreehugger Robot     NSInteger LastHash;
180*16467b97STreehugger Robot     NSInteger BuffSize;
181*16467b97STreehugger Robot     NSInteger Capacity;
182*16467b97STreehugger Robot     /**
183*16467b97STreehugger Robot      * The number of key-value mappings contained in this map.
184*16467b97STreehugger Robot      */
185*16467b97STreehugger Robot     NSUInteger count;
186*16467b97STreehugger Robot     NSUInteger ptr;
187*16467b97STreehugger Robot     __strong NSMutableData *buffer;
188*16467b97STreehugger Robot     __strong MapElement **ptrBuffer;
189*16467b97STreehugger Robot     NSInteger mode;
190*16467b97STreehugger Robot     /**
191*16467b97STreehugger Robot      * The table, resized as necessary. Length MUST Always be a power of two.
192*16467b97STreehugger Robot      */
193*16467b97STreehugger Robot //    AMutableArray *table;
194*16467b97STreehugger Robot 
195*16467b97STreehugger Robot     /**
196*16467b97STreehugger Robot      * The next size value at which to resize (capacity * load factor).
197*16467b97STreehugger Robot      * @serial
198*16467b97STreehugger Robot      */
199*16467b97STreehugger Robot     NSInteger threshold;
200*16467b97STreehugger Robot 
201*16467b97STreehugger Robot     /**
202*16467b97STreehugger Robot      * The load factor for the hash table.
203*16467b97STreehugger Robot      *
204*16467b97STreehugger Robot      * @serial
205*16467b97STreehugger Robot      */
206*16467b97STreehugger Robot     float loadFactor;
207*16467b97STreehugger Robot     /**
208*16467b97STreehugger Robot      * The number of times this HashMap has been structurally modified
209*16467b97STreehugger Robot      * Structural modifications are those that change the number of mappings in
210*16467b97STreehugger Robot      * the HashMap or otherwise modify its internal structure (e.g.,
211*16467b97STreehugger Robot      * rehash).  This field is used to make iterators on Collection-views of
212*16467b97STreehugger Robot      * the HashMap fail-fast.  (See ConcurrentModificationException).
213*16467b97STreehugger Robot      */
214*16467b97STreehugger Robot     NSInteger modCount;
215*16467b97STreehugger Robot     HMEntrySet *entrySet;
216*16467b97STreehugger Robot     BOOL empty;
217*16467b97STreehugger Robot     HMKeySet *keySet;
218*16467b97STreehugger Robot     Values *values;
219*16467b97STreehugger Robot }
220*16467b97STreehugger Robot 
221*16467b97STreehugger Robot //@property (copy) TStringPool *fPool;
222*16467b97STreehugger Robot @property (getter=getScope, setter=setScope:) NSInteger Scope;
223*16467b97STreehugger Robot @property (getter=getLastHash, setter=setLastHash:) NSInteger LastHash;
224*16467b97STreehugger Robot 
225*16467b97STreehugger Robot @property (getter=getMode,setter=setMode:) NSInteger mode;
226*16467b97STreehugger Robot @property (assign) NSInteger BuffSize;
227*16467b97STreehugger Robot @property (assign) NSInteger Capacity;
228*16467b97STreehugger Robot @property (getter=getCount, setter=setCount:) NSUInteger count;
229*16467b97STreehugger Robot @property (assign) NSUInteger ptr;
230*16467b97STreehugger Robot @property (retain, getter=getBuffer, setter=setBuffer:) NSMutableData *buffer;
231*16467b97STreehugger Robot @property (assign, getter=getPtrBuffer, setter=setPtrBuffer:) MapElement **ptrBuffer;
232*16467b97STreehugger Robot @property (assign) NSInteger threshold;
233*16467b97STreehugger Robot @property (assign) float loadFactor;
234*16467b97STreehugger Robot @property (assign) NSInteger modCount;
235*16467b97STreehugger Robot @property (retain) HMEntrySet *entrySet;
236*16467b97STreehugger Robot @property (nonatomic, readonly) BOOL empty;
237*16467b97STreehugger Robot @property (retain) HMKeySet *keySet;
238*16467b97STreehugger Robot @property (retain) Values *values;
239*16467b97STreehugger Robot 
240*16467b97STreehugger Robot // Contruction/Destruction
241*16467b97STreehugger Robot + (id) newHashMap;
242*16467b97STreehugger Robot + (id) newHashMap:(NSInteger)anInitialCapacity loadFactor:(float)loadFactor;
243*16467b97STreehugger Robot + (id) newHashMap:(NSInteger)anInitialCapacity;
244*16467b97STreehugger Robot + (id) newHashMapWithLen:(NSInteger)aBuffSize;
245*16467b97STreehugger Robot - (id) init;
246*16467b97STreehugger Robot - (id) initWithLen:(NSInteger)aBuffSize;
247*16467b97STreehugger Robot - (id) init:(NSInteger)anInitialCapacity;
248*16467b97STreehugger Robot - (id) init:(NSInteger)anInitialCapacity loadFactor:(float)loadFactor;
249*16467b97STreehugger Robot - (id) initWithM:(HashMap *)m;
250*16467b97STreehugger Robot - (void)dealloc;
251*16467b97STreehugger Robot - (HashMap *)PushScope:( HashMap **)map;
252*16467b97STreehugger Robot - (HashMap *)PopScope:( HashMap **)map;
253*16467b97STreehugger Robot 
254*16467b97STreehugger Robot - (NSUInteger)count;
255*16467b97STreehugger Robot - (NSInteger)size;
256*16467b97STreehugger Robot 
257*16467b97STreehugger Robot // Instance Methods
258*16467b97STreehugger Robot /*    form hash value for string s */
259*16467b97STreehugger Robot - (NSInteger)hash:(NSString *)s;
260*16467b97STreehugger Robot - (NSInteger)hashInt:(NSInteger)anInt;
261*16467b97STreehugger Robot - (NSInteger) indexFor:(NSInteger)h length:(NSInteger)length;
262*16467b97STreehugger Robot /*   look for s in ptrBuffer  */
263*16467b97STreehugger Robot - (HashMap *)findscope:(NSInteger)level;
264*16467b97STreehugger Robot /*   look for s in ptrBuffer  */
265*16467b97STreehugger Robot - (id)lookup:(NSString *)s Scope:(NSInteger)scope;
266*16467b97STreehugger Robot /*   look for s in ptrBuffer  */
267*16467b97STreehugger Robot - (id)install:(MapElement *)sym Scope:(NSInteger)scope;
268*16467b97STreehugger Robot /*   look for s in ptrBuffer  */
269*16467b97STreehugger Robot - (void)deleteHashMap:(MapElement *)np;
270*16467b97STreehugger Robot - (NSInteger)RemoveSym:(NSString *)s;
271*16467b97STreehugger Robot - (void)delete_chain:(MapElement *)np;
272*16467b97STreehugger Robot #ifdef DONTUSEYET
273*16467b97STreehugger Robot - (int)bld_symtab:(KW_TABLE *)toknams;
274*16467b97STreehugger Robot #endif
275*16467b97STreehugger Robot - (MapElement **)getptrBuffer;
276*16467b97STreehugger Robot - (MapElement *)getptrBufferEntry:(NSInteger)idx;
277*16467b97STreehugger Robot - (void)setptrBuffer:(MapElement *)np Index:(NSInteger)idx;
278*16467b97STreehugger Robot - (NSInteger)getScope;
279*16467b97STreehugger Robot - (void)setScope:(NSInteger)i;
280*16467b97STreehugger Robot - (MapElement *)getTType:(NSString *)name;
281*16467b97STreehugger Robot - (MapElement *)getNameInList:(NSInteger)ttype;
282*16467b97STreehugger Robot - (void)putNode:(NSString *)name TokenType:(NSInteger)ttype;
283*16467b97STreehugger Robot - (NSInteger)getMode;
284*16467b97STreehugger Robot - (void)setMode:(NSInteger)aMode;
285*16467b97STreehugger Robot - (void) insertObject:(id)aRule atIndex:(NSInteger)idx;
286*16467b97STreehugger Robot - (id) objectAtIndex:(NSInteger)idx;
287*16467b97STreehugger Robot - (void) setObject:(id)aRule atIndex:(NSInteger)idx;
288*16467b97STreehugger Robot - (void)addObject:(id)anObject;
289*16467b97STreehugger Robot - (MapElement *) getName:(NSString *)aName;
290*16467b97STreehugger Robot - (void) putName:(NSString *)name Node:(id)aNode;
291*16467b97STreehugger Robot 
292*16467b97STreehugger Robot - (NSEnumerator *)objectEnumerator;
293*16467b97STreehugger Robot - (BOOL) hasNext;
294*16467b97STreehugger Robot - (MapElement *)nextObject;
295*16467b97STreehugger Robot 
296*16467b97STreehugger Robot - (NSUInteger) count;
297*16467b97STreehugger Robot - (id) get:(NSString *)key;
298*16467b97STreehugger Robot - (id) getForNullKey;
299*16467b97STreehugger Robot - (BOOL) containsKey:(NSString *)key;
300*16467b97STreehugger Robot - (HMEntry *) getEntry:(NSString *)key;
301*16467b97STreehugger Robot - (id) put:(NSString *)key value:(id)value;
302*16467b97STreehugger Robot - (id) putForNullKey:(id)value;
303*16467b97STreehugger Robot - (void) putForCreate:(NSString *)key value:(id)value;
304*16467b97STreehugger Robot - (void) putAllForCreate:(HashMap *)m;
305*16467b97STreehugger Robot - (void) resize:(NSInteger)newCapacity;
306*16467b97STreehugger Robot - (void) transfer:(NSArray *)newTable;
307*16467b97STreehugger Robot - (void) putAll:(HashMap *)m;
308*16467b97STreehugger Robot - (id) remove:(NSString *)key;
309*16467b97STreehugger Robot - (HMEntry *) removeEntryForKey:(NSString *)key;
310*16467b97STreehugger Robot - (HMEntry *) removeMapping:(id)o;
311*16467b97STreehugger Robot - (void) clear;
312*16467b97STreehugger Robot - (BOOL) containsValue:(id)value;
313*16467b97STreehugger Robot - (id) copyWithZone:(NSZone *)zone;
314*16467b97STreehugger Robot - (NSString *) description;
315*16467b97STreehugger Robot - (void) addEntry:(NSInteger)hash key:(NSString *)key value:(id)value bucketIndex:(NSInteger)bucketIndex;
316*16467b97STreehugger Robot - (void) createEntry:(NSInteger)hash key:(NSString *)key value:(id)value bucketIndex:(NSInteger)bucketIndex;
317*16467b97STreehugger Robot - (HMKeyIterator *) newKeyIterator;
318*16467b97STreehugger Robot - (HMValueIterator *) newValueIterator;
319*16467b97STreehugger Robot - (HMEntryIterator *) newEntryIterator;
320*16467b97STreehugger Robot - (HMKeySet *) keySet;
321*16467b97STreehugger Robot - (Values *) values;
322*16467b97STreehugger Robot - (HMEntrySet *) entrySet;
323*16467b97STreehugger Robot - (NSInteger) capacity;
324*16467b97STreehugger Robot - (float) loadFactor;
325*16467b97STreehugger Robot 
326*16467b97STreehugger Robot @end
327