You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
327 lines
9.2 KiB
327 lines
9.2 KiB
//
|
|
// 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
|