#import "NSArray+MLNAdditions.h" #import "MLNLoggingConfiguration_Private.h" #import "NSDictionary+MLNAdditions.h" #import "NSExpression+MLNPrivateAdditions.h" @implementation NSArray (MLNAdditions) - (std::vector)mgl_vector { std::vector vector; vector.reserve(self.count); for (id value in self) { if ([value isKindOfClass:[NSArray class]]) { std::vector innerVector = [value mgl_vector]; vector.push_back(innerVector); } else if ([value isKindOfClass:[NSDictionary class]]) { mbgl::PropertyMap propertyMap = [value mgl_propertyMap]; vector.push_back(propertyMap); } else { NSExpression *expression = [NSExpression expressionForConstantValue:value]; vector.push_back(expression.mgl_constantMBGLValue); } } return vector; } - (NSAttributedString *)mgl_attributedComponentsJoinedByString:(NSString *)separator { NSAttributedString *attributedSeparator = [[NSAttributedString alloc] initWithString:separator]; NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] init]; BOOL isSubsequentItem = NO; for (NSAttributedString *component in self) { MLNAssert([component isKindOfClass:[NSAttributedString class]], @"Items in array must be attributed strings."); if (isSubsequentItem) { [attributedString appendAttributedString:attributedSeparator]; } isSubsequentItem = YES; [attributedString appendAttributedString:component]; } return attributedString; } + (NSArray *)mgl_coordinatesFromCoordinates:(std::vector)coords { NSMutableArray *coordinates = [NSMutableArray array]; for (auto coord : coords) { [coordinates addObject:@{@"latitude" : @(coord.latitude), @"longitude" : @(coord.longitude)}]; } return coordinates; } - (std::vector)mgl_coordinates { NSUInteger numberOfCoordinates = [self count]; CLLocationCoordinate2D *coords = (CLLocationCoordinate2D *)malloc(numberOfCoordinates * sizeof(CLLocationCoordinate2D)); for (NSUInteger i = 0; i < numberOfCoordinates; i++) { coords[i] = CLLocationCoordinate2DMake([self[i][@"latitude"] doubleValue], [self[i][@"longitude"] doubleValue]); } std::vector coordinates = {coords, coords + numberOfCoordinates}; free(coords); return coordinates; } @end