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