Implement stopping support for CPArray enumerateObjectsUsingBlock:.

This commit is contained in:
Alexander Ljungberg
2012-03-23 00:34:09 +00:00
parent e19a782954
commit 3a0068186a
2 changed files with 25 additions and 3 deletions
+11 -3
View File
@@ -536,13 +536,21 @@ var concat = Array.prototype.concat,
objj_msgSend([self objectAtIndex:index], aSelector);
}
- (void)enumerateObjectsUsingBlock:(Function)aFunction
- (void)enumerateObjectsUsingBlock:(Function /*(id anObject, int idx, @ref BOOL stop)*/)aFunction
{
// This could have been [self enumerateObjectsWithOptions:CPEnumerationNormal usingBlock:aFunction]
// but this method should be as fast as possible.
var index = 0,
count = [self count];
count = [self count],
shouldStop = NO,
shouldStopRef = AT_REF(shouldStop);
for (; index < count; ++index)
aFunction([self objectAtIndex:index], index);
{
aFunction([self objectAtIndex:index], index, shouldStopRef);
if (shouldStop)
return;
}
}
- (void)enumerateObjectsWithOptions:(CPEnumerationOptions)options usingBlock:(Function /*(id anObject, int idx, @ref BOOL stop)*/)aFunction
+14
View File
@@ -511,8 +511,22 @@
[self assert:input1[0] equals:[output valueForKey:"0"] message:@"output[0]"];
[self assert:input1[1] equals:[output valueForKey:"1"] message:@"output[0]"];
[self assert:input1[2] equals:[output valueForKey:"2"] message:@"output[0]"];
stoppingFunction = function(anObject, idx, stop)
{
[output setValue:anObject forKey:"" + idx];
if ([output count] > 1)
stop(YES); // AT_DEREF(stop, YES) - FIXME Replace with proper @ref @deref when in ObjJ.
}
output = [CPMutableDictionary dictionary];
[input1 enumerateObjectsUsingBlock:stoppingFunction];
[self assert:2 equals:[output count] message:@"output when enumerating input1 and stopping after 2"];
[self assert:input1[0] equals:[output valueForKey:"0"] message:@"output[0]"];
[self assert:input1[1] equals:[output valueForKey:"1"] message:@"output[0]"];
}
@end
@implementation AlwaysEqual : CPObject