From 268b2203c7ec7d9fdb124d809a8739561757d907 Mon Sep 17 00:00:00 2001 From: Gregory John Casamento Date: Mon, 10 Jun 2019 13:55:00 -0400 Subject: [PATCH] Correct issues brought up by Fred K. --- Source/GSOrderedSet.m | 32 ++++++++++++++++++++++++++++++++ Source/NSOrderedSet.m | 39 ++++++++++++++++++++++++++++++++++----- 2 files changed, 66 insertions(+), 5 deletions(-) diff --git a/Source/GSOrderedSet.m b/Source/GSOrderedSet.m index 6c52da399..1c21100be 100644 --- a/Source/GSOrderedSet.m +++ b/Source/GSOrderedSet.m @@ -73,6 +73,9 @@ static SEL privateCountOfSel; } @end +@interface GSOrderedSetEnumeratorReverse : GSOrderedSetEnumerator +@end + @implementation GSOrderedSetEnumerator - (id) initWithOrderedSet: (NSOrderedSet*)d { @@ -104,6 +107,30 @@ static SEL privateCountOfSel; } @end + +@implementation GSOrderedSetEnumeratorReverse +- (id) initWithOrderedSet: (GSOrderedSet*)d +{ + self = [super initWithOrderedSet: d]; + if(self != nil) + { + current = GSIArrayCount(&set->array); + } + return self; +} + +- (id) nextObject +{ + GSIArrayItem item; + + if (current == 0) + return nil; + + item = GSIArrayItemAtIndex(&set->array, --current); + return (id)(item.obj); +} +@end + @implementation GSOrderedSet static Class setClass; @@ -145,6 +172,11 @@ static Class mutableSetClass; return AUTORELEASE([[GSOrderedSetEnumerator alloc] initWithOrderedSet: self]); } +- (NSEnumerator*) reverseObjectEnumerator +{ + return AUTORELEASE([[GSOrderedSetEnumeratorReverse alloc] initWithOrderedSet: self]); +} + - (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state objects: (id*)stackbuf count: (NSUInteger)len diff --git a/Source/NSOrderedSet.m b/Source/NSOrderedSet.m index 20ad9c391..4d6399e01 100644 --- a/Source/NSOrderedSet.m +++ b/Source/NSOrderedSet.m @@ -980,27 +980,56 @@ static SEL rlSel; - (NSEnumerator *) objectEnumerator { + [self subclassResponsibility: _cmd]; return nil; } - (NSEnumerator *) reverseObjectEnumerator { - return nil; + [self subclassResponsibility: _cmd]; + return nil; } - (NSOrderedSet *)reversedOrderedSet { - return nil; + NSEnumerator *e = [self reverseObjectEnumerator]; + NSMutableArray *a = [NSMutableArray arrayWithCapacity: [self count]]; + id o = nil; + + // Build the reverse array... + while ((o = [e nextObject]) != nil) + { + [a addObject: o]; + } + + // Create and return reverse ordered set... + return [NSOrderedSet orderedSetWithArray: a]; } -- (void) getObjects: (__unsafe_unretained id[])aBuffer - range: (NSRange)aRange +- (void) getObjects: (__unsafe_unretained id[])aBuffer range: (NSRange)aRange { -} + NSUInteger i, j = 0, c = [self count], e = aRange.location + aRange.length; + IMP get = [self methodForSelector: oaiSel]; + GS_RANGE_CHECK(aRange, c); + + for (i = aRange.location; i < e; i++) + aBuffer[j++] = (*get)(self, oaiSel, i); +} + // Key value coding support - (void) setValue: (id)value forKey: (NSString*)key { + NSUInteger i; + NSUInteger count = [self count]; + volatile id object = nil; + + for (i = 0; i < count; i++) + { + object = [self objectAtIndex: i]; + [object setValue: value + forKey: key]; + } } - (id) valueForKey: (NSString*)key