| // |
| // HashMap.h |
| // ANTLR |
| // |
| // Copyright (c) 2010 Alan Condit |
| // All rights reserved. |
| // |
| // Redistribution and use in source and binary forms, with or without |
| // modification, are permitted provided that the following conditions |
| // are met: |
| // 1. Redistributions of source code must retain the above copyright |
| // notice, this list of conditions and the following disclaimer. |
| // 2. Redistributions in binary form must reproduce the above copyright |
| // notice, this list of conditions and the following disclaimer in the |
| // documentation and/or other materials provided with the distribution. |
| // 3. The name of the author may not be used to endorse or promote products |
| // derived from this software without specific prior written permission. |
| // |
| // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
| // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
| // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
| // IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
| // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
| // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
| // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| #import <Foundation/Foundation.h> |
| #import "AMutableArray.h" |
| #import "AMutableDictionary.h" |
| #import "ArrayIterator.h" |
| #import "LinkBase.h" |
| #import "MapElement.h" |
| #import "PtrBuffer.h" |
| |
| #define GLOBAL_SCOPE 0 |
| #define LOCAL_SCOPE 1 |
| #define HASHSIZE 101 |
| #define HBUFSIZE 0x2000 |
| |
| @class HashMap; |
| |
| /** |
| * HashMap entry. |
| */ |
| |
| @interface HMEntry : NSObject { |
| HMEntry *next; |
| NSInteger hash; |
| NSString *key; |
| id value; |
| } |
| |
| @property(nonatomic, retain) HMEntry *next; |
| @property(assign) NSInteger hash; |
| @property(nonatomic, retain) NSString *key; |
| @property(nonatomic, retain) id value; |
| |
| + (HMEntry *)newEntry:(NSInteger)h key:(NSString *)k value:(id)v next:(HMEntry *) n; |
| - (id) init:(NSInteger)h key:(NSString *)k value:(id)v next:(HMEntry *)n; |
| - (void) setValue:(id)newValue; |
| - (BOOL) isEqualTo:(id)o; |
| - (NSInteger) hashCode; |
| - (NSString *) description; |
| - (void) recordAccess:(HashMap *)m; |
| - (void) recordRemoval:(HashMap *)m; |
| @end |
| |
| @interface HashIterator : ArrayIterator { |
| HMEntry *next; |
| NSInteger expectedModCount; |
| NSInteger idx; |
| HMEntry *current; |
| HashMap *hm; |
| } |
| |
| + (HashIterator *) newIterator:(HashMap *)aHM; |
| |
| - (id) init:(HashMap *)aHM; |
| - (BOOL) hasNext; |
| - (HMEntry *) next; |
| - (void) remove; |
| @end |
| |
| @interface HMEntryIterator : HashIterator |
| { |
| } |
| |
| + (HMEntryIterator *)newIterator:(HashMap *)aHM; |
| |
| - (id) init:(HashMap *)aHM; |
| - (HMEntry *) next; |
| @end |
| |
| @interface HMValueIterator : HashIterator |
| { |
| } |
| |
| + (HMValueIterator *)newIterator:(HashMap *)aHM; |
| |
| - (id) init:(HashMap *)aHM; |
| - (id) next; |
| @end |
| |
| @interface HMKeyIterator : HashIterator |
| { |
| } |
| |
| + (HMKeyIterator *)newIterator:(HashMap *)aHM; |
| |
| - (id) init:(HashMap *)aHM; |
| - (NSString *) next; |
| @end |
| |
| @interface HMKeySet : NSSet |
| { |
| HashMap *hm; |
| AMutableArray *anArray; |
| } |
| |
| @property (retain) HashMap *hm; |
| @property (retain) AMutableArray *anArray; |
| |
| + (HMKeySet *)newKeySet:(HashMap *)aHM; |
| |
| - (id) init:(HashMap *)aHM; |
| - (HashIterator *) iterator; |
| - (NSUInteger) count; |
| - (BOOL) contains:(id)o; |
| - (BOOL) remove:(id)o; |
| - (void) clear; |
| - (AMutableArray *)toArray; |
| @end |
| |
| @interface Values : PtrBuffer |
| { |
| HashMap *hm; |
| AMutableArray *anArray; |
| } |
| |
| @property (retain) HashMap *hm; |
| @property (retain) AMutableArray *anArray; |
| |
| + (Values *)newValueSet:(HashMap *)aHM; |
| |
| - (id) init:(HashMap *)aHM; |
| - (HashIterator *) iterator; |
| - (NSUInteger) count; |
| - (BOOL) contains:(id)o; |
| - (void) clear; |
| - (AMutableArray *)toArray; |
| @end |
| |
| @interface HMEntrySet : NSSet |
| { |
| HashMap *hm; |
| AMutableArray *anArray; |
| } |
| |
| @property (retain) HashMap *hm; |
| @property (retain) AMutableArray *anArray; |
| |
| + (HMEntrySet *)newEntrySet:(HashMap *)aHM; |
| |
| - (id) init:(HashMap *)aHM; |
| - (HashIterator *) iterator; |
| - (BOOL) contains:(id)o; |
| - (BOOL) remove:(id)o; |
| - (NSUInteger) count; |
| - (void) clear; |
| - (NSArray *)toArray; |
| @end |
| |
| @interface HashMap : LinkBase { |
| // TStringPool *fPool; |
| NSInteger Scope; |
| NSInteger LastHash; |
| NSInteger BuffSize; |
| NSInteger Capacity; |
| /** |
| * The number of key-value mappings contained in this map. |
| */ |
| NSUInteger count; |
| NSUInteger ptr; |
| __strong NSMutableData *buffer; |
| __strong MapElement **ptrBuffer; |
| NSInteger mode; |
| /** |
| * The table, resized as necessary. Length MUST Always be a power of two. |
| */ |
| // AMutableArray *table; |
| |
| /** |
| * The next size value at which to resize (capacity * load factor). |
| * @serial |
| */ |
| NSInteger threshold; |
| |
| /** |
| * The load factor for the hash table. |
| * |
| * @serial |
| */ |
| float loadFactor; |
| /** |
| * The number of times this HashMap has been structurally modified |
| * Structural modifications are those that change the number of mappings in |
| * the HashMap or otherwise modify its internal structure (e.g., |
| * rehash). This field is used to make iterators on Collection-views of |
| * the HashMap fail-fast. (See ConcurrentModificationException). |
| */ |
| NSInteger modCount; |
| HMEntrySet *entrySet; |
| BOOL empty; |
| HMKeySet *keySet; |
| Values *values; |
| } |
| |
| //@property (copy) TStringPool *fPool; |
| @property (getter=getScope, setter=setScope:) NSInteger Scope; |
| @property (getter=getLastHash, setter=setLastHash:) NSInteger LastHash; |
| |
| @property (getter=getMode,setter=setMode:) NSInteger mode; |
| @property (assign) NSInteger BuffSize; |
| @property (assign) NSInteger Capacity; |
| @property (getter=getCount, setter=setCount:) NSUInteger count; |
| @property (assign) NSUInteger ptr; |
| @property (retain, getter=getBuffer, setter=setBuffer:) NSMutableData *buffer; |
| @property (assign, getter=getPtrBuffer, setter=setPtrBuffer:) MapElement **ptrBuffer; |
| @property (assign) NSInteger threshold; |
| @property (assign) float loadFactor; |
| @property (assign) NSInteger modCount; |
| @property (retain) HMEntrySet *entrySet; |
| @property (nonatomic, readonly) BOOL empty; |
| @property (retain) HMKeySet *keySet; |
| @property (retain) Values *values; |
| |
| // Contruction/Destruction |
| + (id) newHashMap; |
| + (id) newHashMap:(NSInteger)anInitialCapacity loadFactor:(float)loadFactor; |
| + (id) newHashMap:(NSInteger)anInitialCapacity; |
| + (id) newHashMapWithLen:(NSInteger)aBuffSize; |
| - (id) init; |
| - (id) initWithLen:(NSInteger)aBuffSize; |
| - (id) init:(NSInteger)anInitialCapacity; |
| - (id) init:(NSInteger)anInitialCapacity loadFactor:(float)loadFactor; |
| - (id) initWithM:(HashMap *)m; |
| - (void)dealloc; |
| - (HashMap *)PushScope:( HashMap **)map; |
| - (HashMap *)PopScope:( HashMap **)map; |
| |
| - (NSUInteger)count; |
| - (NSInteger)size; |
| |
| // Instance Methods |
| /* form hash value for string s */ |
| - (NSInteger)hash:(NSString *)s; |
| - (NSInteger)hashInt:(NSInteger)anInt; |
| - (NSInteger) indexFor:(NSInteger)h length:(NSInteger)length; |
| /* look for s in ptrBuffer */ |
| - (HashMap *)findscope:(NSInteger)level; |
| /* look for s in ptrBuffer */ |
| - (id)lookup:(NSString *)s Scope:(NSInteger)scope; |
| /* look for s in ptrBuffer */ |
| - (id)install:(MapElement *)sym Scope:(NSInteger)scope; |
| /* look for s in ptrBuffer */ |
| - (void)deleteHashMap:(MapElement *)np; |
| - (NSInteger)RemoveSym:(NSString *)s; |
| - (void)delete_chain:(MapElement *)np; |
| #ifdef DONTUSEYET |
| - (int)bld_symtab:(KW_TABLE *)toknams; |
| #endif |
| - (MapElement **)getptrBuffer; |
| - (MapElement *)getptrBufferEntry:(NSInteger)idx; |
| - (void)setptrBuffer:(MapElement *)np Index:(NSInteger)idx; |
| - (NSInteger)getScope; |
| - (void)setScope:(NSInteger)i; |
| - (MapElement *)getTType:(NSString *)name; |
| - (MapElement *)getNameInList:(NSInteger)ttype; |
| - (void)putNode:(NSString *)name TokenType:(NSInteger)ttype; |
| - (NSInteger)getMode; |
| - (void)setMode:(NSInteger)aMode; |
| - (void) insertObject:(id)aRule atIndex:(NSInteger)idx; |
| - (id) objectAtIndex:(NSInteger)idx; |
| - (void) setObject:(id)aRule atIndex:(NSInteger)idx; |
| - (void)addObject:(id)anObject; |
| - (MapElement *) getName:(NSString *)aName; |
| - (void) putName:(NSString *)name Node:(id)aNode; |
| |
| - (NSEnumerator *)objectEnumerator; |
| - (BOOL) hasNext; |
| - (MapElement *)nextObject; |
| |
| - (NSUInteger) count; |
| - (id) get:(NSString *)key; |
| - (id) getForNullKey; |
| - (BOOL) containsKey:(NSString *)key; |
| - (HMEntry *) getEntry:(NSString *)key; |
| - (id) put:(NSString *)key value:(id)value; |
| - (id) putForNullKey:(id)value; |
| - (void) putForCreate:(NSString *)key value:(id)value; |
| - (void) putAllForCreate:(HashMap *)m; |
| - (void) resize:(NSInteger)newCapacity; |
| - (void) transfer:(NSArray *)newTable; |
| - (void) putAll:(HashMap *)m; |
| - (id) remove:(NSString *)key; |
| - (HMEntry *) removeEntryForKey:(NSString *)key; |
| - (HMEntry *) removeMapping:(id)o; |
| - (void) clear; |
| - (BOOL) containsValue:(id)value; |
| - (id) copyWithZone:(NSZone *)zone; |
| - (NSString *) description; |
| - (void) addEntry:(NSInteger)hash key:(NSString *)key value:(id)value bucketIndex:(NSInteger)bucketIndex; |
| - (void) createEntry:(NSInteger)hash key:(NSString *)key value:(id)value bucketIndex:(NSInteger)bucketIndex; |
| - (HMKeyIterator *) newKeyIterator; |
| - (HMValueIterator *) newValueIterator; |
| - (HMEntryIterator *) newEntryIterator; |
| - (HMKeySet *) keySet; |
| - (Values *) values; |
| - (HMEntrySet *) entrySet; |
| - (NSInteger) capacity; |
| - (float) loadFactor; |
| |
| @end |