@@ -14,11 +14,10 @@ #include #import "OFDictionary.h" #import "OFIterator.h" #import "OFExceptions.h" -#import "OFMacros.h" /* Reference for static linking */ void _reference_to_OFIterator_in_OFDictionary() { _OFIterator_reference = 1; @@ -25,16 +24,16 @@ } @implementation OFDictionary + dictionary; { - return [[[OFDictionary alloc] init] autorelease]; + return [[[self alloc] init] autorelease]; } + dictionaryWithHashSize: (int)hashsize { - return [[[OFDictionary alloc] initWithHashSize: hashsize] autorelease]; + return [[[self alloc] initWithHashSize: hashsize] autorelease]; } - init { self = [super init]; @@ -86,61 +85,25 @@ memset(data, 0, size * sizeof(OFList*)); return self; } -- (void)dealloc -{ - size_t i; - - for (i = 0; i < size; i++) - if (data[i] != nil) - [data[i] release]; - - [super dealloc]; -} - -- set: (OFObject *)key - to: (OFObject*)obj -{ - uint32_t hash; - of_list_object_t *iter, *key_obj; - - if (key == nil || obj == nil) - @throw [OFInvalidArgumentException newWithClass: isa - andSelector: _cmd]; - - hash = [key hash] & (size - 1); - - if (data[hash] == nil) - data[hash] = [[OFList alloc] init]; - - for (iter = [data[hash] first]; iter != NULL; iter = iter->next->next) { - if ([iter->object isEqual: key]) { - [iter->next->object release]; - [obj retain]; - iter->next->object = obj; - - return self; - } - } - - key = [key copy]; - @try { - key_obj = [data[hash] append: key]; - } @finally { - [key release]; - } - - @try { - [data[hash] append: obj]; - } @catch (OFException *e) { - [data[hash] remove: key_obj]; - @throw e; - } - - return self; +- (float)averageItemsPerBucket +{ + size_t items, buckets, i; + + items = 0; + buckets = 0; + + for (i = 0; i < size; i++) { + if (data[i] != nil) { + items += [data[i] items] / 2; + buckets++; + } + } + + return (float)items / buckets; } - (id)get: (OFObject*)key { uint32_t hash; @@ -159,101 +122,51 @@ if ([iter->object isEqual: key]) return iter->next->object; return nil; } + +- set: (OFObject *)key + to: (OFObject*)obj +{ + @throw [OFNotImplementedException newWithClass: isa + andSelector: _cmd]; +} - remove: (OFObject*)key { - uint32_t hash; - of_list_object_t *iter; - - if (key == nil) - @throw [OFInvalidArgumentException newWithClass: isa - andSelector: _cmd]; - - hash = [key hash] & (size - 1); - - if (data[hash] == nil) - return self; - - for (iter = [data[hash] first]; iter != NULL; iter = iter->next->next) { - if ([iter->object isEqual: key]) { - [data[hash] remove: iter->next]; - [data[hash] remove: iter]; - - if ([data[hash] first] == NULL) { - [data[hash] release]; - data[hash] = nil; - } - - return self; - } - } - - return self; -} - -- (float)averageItemsPerBucket -{ - size_t items, buckets, i; - - items = 0; - buckets = 0; - - for (i = 0; i < size; i++) { - if (data[i] != nil) { - items += [data[i] items] / 2; - buckets++; - } - } - - return (float)items / buckets; + @throw [OFNotImplementedException newWithClass: isa + andSelector: _cmd]; } - changeHashSize: (int)hashsize { - OFList **newdata; - size_t newsize, i; - of_list_object_t *iter; - - if (hashsize < 8 || hashsize >= 28) - @throw [OFInvalidArgumentException newWithClass: isa - andSelector: _cmd]; - - newsize = (size_t)1 << hashsize; - newdata = [self allocNItems: newsize - withSize: sizeof(OFList*)]; - memset(data, 0, newsize * sizeof(OFList*)); - - for (i = 0; i < size; i++) { - if (OF_LIKELY(data[i] == nil)) - continue; - - for (iter = [data[i] first]; iter != NULL; - iter = iter->next->next) { - uint32_t hash = [iter->object hash] & (newsize - 1); - - if (newdata[hash] == nil) - newdata[hash] = [[OFList alloc] init]; - - [newdata[hash] append: iter->object]; - [newdata[hash] append: iter->next->object]; - } - - [data[i] release]; - } - - [self freeMem: data]; - data = newdata; - size = newsize; - - return self; + @throw [OFNotImplementedException newWithClass: isa + andSelector: _cmd]; } /* FIXME: Implement this! */ /* - (BOOL)isEqual { } + +- (id)copy +{ +} + +- (id)mutableCopy +{ +} */ + +- (void)dealloc +{ + size_t i; + + for (i = 0; i < size; i++) + if (data[i] != nil) + [data[i] release]; + + [super dealloc]; +} @end