From a3b91bdf42713b2e04341f271bd17abb0032f382 Mon Sep 17 00:00:00 2001 From: rfm Date: Wed, 28 Jan 2009 12:03:41 +0000 Subject: [PATCH] Add fast enumeration git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@27711 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 6 ++++++ Headers/Foundation/NSEnumerator.h | 16 +++++++++++++++- Source/NSEnumerator.m | 19 +++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index fdabf1ca9..5761ddde2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2009-01-28 David Chisnall + + * Headers/Foundation/NSEnumerator.h: + * Source/NSEnumerator.m: + Add Apple's fast enumeration protocol. + 2009-01-28 Richard Frith-Macdonald * Source/NSException.m: Fix problem preventing stack traccces from diff --git a/Headers/Foundation/NSEnumerator.h b/Headers/Foundation/NSEnumerator.h index 2ba652dd4..5fd2ce4fd 100644 --- a/Headers/Foundation/NSEnumerator.h +++ b/Headers/Foundation/NSEnumerator.h @@ -34,7 +34,21 @@ extern "C" { #endif -@interface NSEnumerator : NSObject +typedef struct +{ + unsigned long state; + id *itemsPtr; + unsigned long *mutationsPtr; + unsigned long extra[5]; +} NSFastEnumerationState; + +@protocol NSFastEnumeration +- (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState *)state + objects: (id *)stackbuf + count: (NSUInteger)len; +@end + +@interface NSEnumerator : NSObject - (NSArray *) allObjects; - (id) nextObject; @end diff --git a/Source/NSEnumerator.m b/Source/NSEnumerator.m index 7446ca1c7..ad71c5184 100644 --- a/Source/NSEnumerator.m +++ b/Source/NSEnumerator.m @@ -74,4 +74,23 @@ return nil; } +- (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state + objects: (id*)stackbuf + count: (NSUInteger)len +{ + IMP nextObject = [self methodForSelector: @selector(nextObject)]; + int i; + + for (i = 0; i < len; i++) + { + id next = nextObject(self, @selector(nextObject)); + + if (nil == next) + { + return i; + } + *(stackbuf+i) = next; + } + return len; +} @end