diff --git a/Source/Private/ASTwoDimensionalArrayUtils.mm b/Source/Private/ASTwoDimensionalArrayUtils.mm index 8b4836fe8..67267b7a9 100644 --- a/Source/Private/ASTwoDimensionalArrayUtils.mm +++ b/Source/Private/ASTwoDimensionalArrayUtils.mm @@ -8,9 +8,12 @@ // #import +#import #import #import +#import + // Import UIKit to get [NSIndexPath indexPathForItem:inSection:] which uses // tagged pointers. #import @@ -63,31 +66,42 @@ void ASDeleteElementsInTwoDimensionalArrayAtIndexPaths(NSMutableArray *mutableAr NSArray *ASIndexPathsForTwoDimensionalArray(NSArray * twoDimensionalArray) { - NSMutableArray *result = [[NSMutableArray alloc] init]; - NSInteger section = 0; + NSInteger sectionCount = twoDimensionalArray.count; + NSInteger counts[sectionCount]; + NSInteger totalCount = 0; NSInteger i = 0; for (NSArray *subarray in twoDimensionalArray) { - ASDisplayNodeCAssert([subarray isKindOfClass:[NSArray class]], @"This function expects NSArray *"); - NSInteger itemCount = subarray.count; - for (NSInteger item = 0; item < itemCount; item++) { - result[i++] = [NSIndexPath indexPathForItem:item inSection:section]; + NSInteger count = subarray.count; + counts[i++] = count; + totalCount += count; + } + + // Count could be huge. Use a reserved vector rather than VLA (stack.) + std::vector indexPaths; + indexPaths.reserve(totalCount); + for (NSInteger i = 0; i < sectionCount; i++) { + for (NSInteger j = 0; j < counts[i]; j++) { + indexPaths.push_back([NSIndexPath indexPathForItem:j inSection:i]); } - section++; } - return result; + return [NSArray arrayByTransferring:indexPaths.data() count:totalCount]; } NSArray *ASElementsInTwoDimensionalArray(NSArray * twoDimensionalArray) { - NSMutableArray *result = [[NSMutableArray alloc] init]; - NSInteger i = 0; + NSInteger totalCount = 0; for (NSArray *subarray in twoDimensionalArray) { - ASDisplayNodeCAssert([subarray isKindOfClass:[NSArray class]], @"This function expects NSArray *"); - for (id element in subarray) { - result[i++] = element; + totalCount += subarray.count; + } + + std::vector elements; + elements.reserve(totalCount); + for (NSArray *subarray in twoDimensionalArray) { + for (id object in subarray) { + elements.push_back(object); } } - return result; + return [NSArray arrayByTransferring:elements.data() count:totalCount]; } id ASGetElementInTwoDimensionalArray(NSArray *array, NSIndexPath *indexPath)