Index: src/OFSet.h ================================================================== --- src/OFSet.h +++ src/OFSet.h @@ -23,11 +23,12 @@ @class OFArray; /** * \brief An unordered set of unique objects. */ -@interface OFSet: OFObject +@interface OFSet: OFObject { OFMutableDictionary *dictionary; } /** Index: src/OFSet.m ================================================================== --- src/OFSet.m +++ src/OFSet.m @@ -266,6 +266,45 @@ - (OFEnumerator*)objectEnumerator { return [dictionary keyEnumerator]; } + +- (int)countByEnumeratingWithState: (of_fast_enumeration_state_t*)state + objects: (id*)objects + count: (int)count +{ + OFAutoreleasePool *pool = state->extra.pointers[0]; + OFEnumerator *enumerator = state->extra.pointers[1]; + int i; + + state->itemsPtr = objects; + state->mutationsPtr = (unsigned long*)self; + + if (state->state == -1) + return 0; + + if (state->state == 0) { + pool = [[OFAutoreleasePool alloc] init]; + enumerator = [dictionary keyEnumerator]; + + state->extra.pointers[0] = pool; + state->extra.pointers[1] = enumerator; + + state->state = 1; + } + + for (i = 0; i < count; i++) { + id object = [enumerator nextObject]; + + if (object == nil) { + [pool release]; + state->state = -1; + return i; + } + + objects[i] = object; + } + + return count; +} @end Index: tests/OFSet.m ================================================================== --- tests/OFSet.m +++ tests/OFSet.m @@ -28,10 +28,14 @@ - (void)setTests { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; OFSet *set1, *set2; OFMutableSet *mutableSet; +#ifdef OF_HAVE_FAST_ENUMERATION + BOOL ok; + size_t i; +#endif TEST(@"+[setWithArray:]", (set1 = [OFSet setWithArray: [OFArray arrayWithObjects: @"foo", @"bar", @"baz", @"foo", @"x", nil]])) @@ -68,9 +72,42 @@ TEST(@"-[intersectsSet:]", [(set2 = [OFSet setWithObjects: @"x", nil]) intersectsSet: set1] && [set1 intersectsSet: set2] && ![([OFSet setWithObjects: @"1", nil]) intersectsSet: set1]); + +#ifdef OF_HAVE_FAST_ENUMERATION + ok = YES; + i = 0; + + for (OFString *s in set1) { + switch (i) { + case 0: + if (![s isEqual: @"bar"]) + ok = NO; + break; + case 1: + if (![s isEqual: @"baz"]) + ok = NO; + break; + case 2: + if (![s isEqual: @"foo"]) + ok = NO; + break; + case 3: + if (![s isEqual: @"x"]) + ok = NO; + break; + } + + i++; + } + + if (i != 4) + ok = NO; + + TEST(@"Fast enumeration", ok) +#endif [pool drain]; } @end