#import "Entry.h" #import #import "RuntimeException.h" @implementation HTEntry @synthesize next; @synthesize hash; @synthesize key; @synthesize value; + (id) newEntry:(int)aHash key:(NSString *)aKey value:(id)aValue next:(HTEntry *)aNext { return [[HTEntry alloc] init:aHash key:aKey value:aValue next:aNext]; } - (id) init:(int)aHash key:(NSString *)aKey value:(id)aValue next:(HTEntry *)aNext { if ( (self = [super init]) != nil) { next = aNext; hash = aHash; key = aKey; value = aValue; } return self; } - (void) dealloc { [next release]; [key release]; [value release]; [super dealloc]; } - (id) copyWithZone:(NSZone *)zone { HTEntry *copy = [[HTEntry allocWithZone:zone] init:hash key:key value:value next:next]; copy.next = next; copy.hash = hash; copy.key = key; copy.value = value; // return [[[HTEntry allocWithZone:zone] init:hash key:key value:value next:(next == nil ? nil : (HTEntry *)[next copyWithZone])] autorelease]; return copy; } - (void) setValue:(id)aValue { if (aValue == nil) @throw [[[NullPointerException alloc] init] autorelease]; // id oldValue = value; value = aValue; // return oldValue; } - (BOOL) isEqualTo:(id)o { /* if (!([o conformsToProtocol:@protocol(HTEntry)])) return NO; */ HTEntry *e = (HTEntry *)o; return (key == nil ? e.key == nil : [key isEqualTo:e.key]) && (value == nil ? e.value == nil : [value isEqualTo:e.value]); } - (int) hash { return hash ^ (value == nil ? 0 : [value hash]); } - (NSString *) description { return [NSString stringWithFormat:@"%@ = %@",[key description], [value description]]; } @end @implementation LMNode @synthesize next; @synthesize prev; @synthesize item; + (LMNode *) newNode:(LMNode *)aPrev element:(id)anElement next:(LMNode *)aNext { return [[LMNode alloc] init:aPrev element:anElement next:aNext]; } - (id) init:(LMNode *)aPrev element:(id)anElement next:(LMNode *)aNext { self = [super init]; if (self) { item = anElement; next = aNext; prev = aPrev; } return self; } - (void) dealloc { [item release]; [next release]; [prev release]; [super dealloc]; } @end