diff --git a/AppKit/CPArrayController.j b/AppKit/CPArrayController.j index 4953c3016..3e3dd1778 100644 --- a/AppKit/CPArrayController.j +++ b/AppKit/CPArrayController.j @@ -197,14 +197,21 @@ - (CPArray)arrangeObjects:(CPArray)objects { - var sortedObjects = objects; + var filterPredicate = [self filterPredicate], + sortDescriptors = [self sortDescriptors]; - if ([self filterPredicate]) - sortedObjects = [sortedObjects filteredArrayUsingPredicate:[self filterPredicate]]; - if ([self sortDescriptors]) - sortedObjects = [sortedObjects sortedArrayUsingDescriptors:[self sortDescriptors]]; + if (filterPredicate && sortDescriptors) + { + var sortedObjects = [objects filteredArrayUsingPredicate:filterPredicate]; + [sortedObjects sortUsingDescriptors:sortDescriptors]; + return sortedObjects; + } + else if (filterPredicate) + return [objects filteredArrayUsingPredicate:filterPredicate]; + else if (sortDescriptors) + return [objects sortedArrayUsingDescriptors:sortDescriptors]; - return sortedObjects; + return [objects copy]; } - (void)rearrangeObjects diff --git a/Foundation/CPPredicate/CPPredicate.j b/Foundation/CPPredicate/CPPredicate.j index bd992b978..18a0c5b51 100644 --- a/Foundation/CPPredicate/CPPredicate.j +++ b/Foundation/CPPredicate/CPPredicate.j @@ -168,10 +168,9 @@ for (i = 0; i < count; i++) { - var object = [self objectAtIndex:i]; - + var object = self[i]; if ([predicate evaluateWithObject:object]) - [result addObject:object]; + result.push(object); } return result; @@ -183,10 +182,8 @@ while (count--) { - var object = [self objectAtIndex:count]; - - if (![predicate evaluateWithObject:object]) - [self removeObjectAtIndex:count]; + if (![predicate evaluateWithObject:self[count]]) + splice(count, 1); } } diff --git a/Tests/AppKit/CPArrayControllerPerformance.j b/Tests/AppKit/CPArrayControllerPerformance.j index fef9c9c4a..083f9b343 100644 --- a/Tests/AppKit/CPArrayControllerPerformance.j +++ b/Tests/AppKit/CPArrayControllerPerformance.j @@ -7,11 +7,12 @@ - (void)testRearrangeObjects { var ELEMENTS = 200, - REPEATS = 50, + REPEATS = 25, ac = [CPArrayController new], array = []; - for (var i=0; i