blob: f42190efebf24d93c610eb021fde80902c4bc66d [file] [log] [blame]
#import "Entry.h"
#import <Foundation/Foundation.h>
#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