Index: src/OFDictionary.m ================================================================== --- src/OFDictionary.m +++ src/OFDictionary.m @@ -508,31 +508,33 @@ selector: _cmd]; hash = [key hash]; last = size; - for (i = hash & (size - 1); i < last && data[i].key != nil && - (data[i].key == DELETED || ![data[i].key isEqual: key]); i++); + for (i = hash & (size - 1); i < last && data[i].key != nil; i++) { + if (data[i].key == DELETED) + continue; + + if ([data[i].key isEqual: key]) + return [[data[i].object retain] autorelease]; + } - if (i < last && (data[i].key == nil || data[i].key == DELETED)) + if (i < last) return nil; /* In case the last bucket is already used */ - if (i >= last) { - last = hash & (size - 1); + last = hash & (size - 1); + + for (i = 0; i < last && data[i].key != nil; i++) { + if (data[i].key == DELETED) + continue; - for (i = 0; i < last && data[i].key != nil && - (data[i].key == DELETED || ![data[i].key isEqual: key]); - i++); + if ([data[i].key isEqual: key]) + return [[data[i].object retain] autorelease]; } - /* Key not in dictionary */ - if (i >= last || data[i].key == nil || data[i].key == DELETED || - ![data[i].key isEqual: key]) - return nil; - - return [[data[i].object retain] autorelease]; + return nil; } - (size_t)count { return count; Index: src/OFMutableDictionary.m ================================================================== --- src/OFMutableDictionary.m +++ src/OFMutableDictionary.m @@ -89,20 +89,29 @@ selector: _cmd]; hash = [key hash]; last = size; - for (i = hash & (size - 1); i < last && data[i].key != nil && - (data[i].key == DELETED || ![data[i].key isEqual: key]); i++); + for (i = hash & (size - 1); i < last && data[i].key != nil; i++) { + if (data[i].key == DELETED) + continue; + + if ([data[i].key isEqual: key]) + break; + } /* In case the last bucket is already used */ if (i >= last) { last = hash & (size - 1); - for (i = 0; i < last && data[i].key != nil && - (data[i].key == DELETED || ![data[i].key isEqual: key]); - i++); + for (i = 0; i < last && data[i].key != nil; i++) { + if (data[i].key == DELETED) + continue; + + if ([data[i].key isEqual: key]) + break; + } } /* Key not in dictionary */ if (i >= last || data[i].key == nil || data[i].key == DELETED || ![data[i].key isEqual: key]) { @@ -157,38 +166,49 @@ selector: _cmd]; hash = [key hash]; last = size; - for (i = hash & (size - 1); i < last && data[i].key != nil && - (data[i].key == DELETED || ![data[i].key isEqual: key]); i++); + for (i = hash & (size - 1); i < last && data[i].key != nil; i++) { + if (data[i].key == DELETED) + continue; + + if ([data[i].key isEqual: key]) { + [data[i].key release]; + [data[i].object release]; + data[i].key = DELETED; + + count--; + mutations++; + [self _resizeForCount: count]; + + return self; + } + } - if (i < last && (data[i].key == nil || data[i].key == DELETED || - ![data[i].key isEqual: key])) + if (i < last) return self; /* In case the last bucket is already used */ - if (i >= last) { - last = hash & (size - 1); - - for (i = 0; i < last && data[i].key != nil && - (data[i].key == DELETED || ![data[i].key isEqual: key]); - i++); - } - - /* Key not in dictionary */ - if (i >= last || data[i].key == nil || data[i].key == DELETED || - ![data[i].key isEqual: key]) - return self; - - [data[i].key release]; - [data[i].object release]; - data[i].key = DELETED; - - count--; - mutations++; - [self _resizeForCount: count]; + last = hash & (size - 1); + + for (i = 0; i < last && data[i].key != nil; i++) { + if (data[i].key == DELETED) + continue; + + if ([data[i].key isEqual: key]) { + [data[i].key release]; + [data[i].object release]; + data[i].key = DELETED; + + count--; + mutations++; + [self _resizeForCount: count]; + + return self; + } + } return self; } - (id)copy