From 39d8252300015c26f1932cff42032613fdb36a09 Mon Sep 17 00:00:00 2001 From: Gil Date: Fri, 19 Jan 2018 12:27:11 -0800 Subject: Port comparison to C++ (#678) This reimplements our comparison functions as C++ Comparators and then provides compatibility shims for interoperating with existing Objective-C usage. A few specialized comparators aren't suitable for porting but only have a single usage (e.g. CompareBytes for comparing NSData * instances). In these cases I've moved them into the caller. * Use int32_t for typeof(ID) in FSTDocumentReference * Migrate callers of FSTComparison.h to Objective-C++ * Port comparison to C++ * Migrate usages of FSTComparison.h to C++ equivalents * Remove FSTComparison --- Firestore/Source/API/FIRGeoPoint.m | 85 ----------------------------------- Firestore/Source/API/FIRGeoPoint.mm | 90 +++++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 85 deletions(-) delete mode 100644 Firestore/Source/API/FIRGeoPoint.m create mode 100644 Firestore/Source/API/FIRGeoPoint.mm (limited to 'Firestore/Source/API') diff --git a/Firestore/Source/API/FIRGeoPoint.m b/Firestore/Source/API/FIRGeoPoint.m deleted file mode 100644 index 72e9e7d..0000000 --- a/Firestore/Source/API/FIRGeoPoint.m +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2017 Google - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import "Firestore/Source/API/FIRGeoPoint+Internal.h" - -#import "Firestore/Source/Util/FSTComparison.h" -#import "Firestore/Source/Util/FSTUsageValidation.h" - -NS_ASSUME_NONNULL_BEGIN - -@implementation FIRGeoPoint - -- (instancetype)initWithLatitude:(double)latitude longitude:(double)longitude { - if (self = [super init]) { - if (latitude < -90 || latitude > 90 || !isfinite(latitude)) { - FSTThrowInvalidArgument( - @"GeoPoint requires a latitude value in the range of [-90, 90], " - "but was %f", - latitude); - } - if (longitude < -180 || longitude > 180 || !isfinite(longitude)) { - FSTThrowInvalidArgument( - @"GeoPoint requires a longitude value in the range of [-180, 180], " - "but was %f", - longitude); - } - - _latitude = latitude; - _longitude = longitude; - } - return self; -} - -- (NSComparisonResult)compare:(FIRGeoPoint *)other { - NSComparisonResult result = FSTCompareDoubles(self.latitude, other.latitude); - if (result != NSOrderedSame) { - return result; - } else { - return FSTCompareDoubles(self.longitude, other.longitude); - } -} - -#pragma mark - NSObject methods - -- (NSString *)description { - return [NSString stringWithFormat:@"", self.latitude, self.longitude]; -} - -- (BOOL)isEqual:(id)other { - if (self == other) { - return YES; - } - if (![other isKindOfClass:[FIRGeoPoint class]]) { - return NO; - } - FIRGeoPoint *otherGeoPoint = (FIRGeoPoint *)other; - return FSTDoubleBitwiseEquals(self.latitude, otherGeoPoint.latitude) && - FSTDoubleBitwiseEquals(self.longitude, otherGeoPoint.longitude); -} - -- (NSUInteger)hash { - return 31 * FSTDoubleBitwiseHash(self.latitude) + FSTDoubleBitwiseHash(self.longitude); -} - -/** Implements NSCopying without actually copying because geopoints are immutable. */ -- (id)copyWithZone:(NSZone *_Nullable)zone { - return self; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/Firestore/Source/API/FIRGeoPoint.mm b/Firestore/Source/API/FIRGeoPoint.mm new file mode 100644 index 0000000..8d89633 --- /dev/null +++ b/Firestore/Source/API/FIRGeoPoint.mm @@ -0,0 +1,90 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "Firestore/Source/API/FIRGeoPoint+Internal.h" + +#import "Firestore/core/src/firebase/firestore/util/comparison.h" + +#import "Firestore/Source/Util/FSTUsageValidation.h" + +using firebase::firestore::util::DoubleBitwiseEquals; +using firebase::firestore::util::DoubleBitwiseHash; +using firebase::firestore::util::WrapCompare; + +NS_ASSUME_NONNULL_BEGIN + +@implementation FIRGeoPoint + +- (instancetype)initWithLatitude:(double)latitude longitude:(double)longitude { + if (self = [super init]) { + if (latitude < -90 || latitude > 90 || !isfinite(latitude)) { + FSTThrowInvalidArgument( + @"GeoPoint requires a latitude value in the range of [-90, 90], " + "but was %f", + latitude); + } + if (longitude < -180 || longitude > 180 || !isfinite(longitude)) { + FSTThrowInvalidArgument( + @"GeoPoint requires a longitude value in the range of [-180, 180], " + "but was %f", + longitude); + } + + _latitude = latitude; + _longitude = longitude; + } + return self; +} + +- (NSComparisonResult)compare:(FIRGeoPoint *)other { + NSComparisonResult result = WrapCompare(self.latitude, other.latitude); + if (result != NSOrderedSame) { + return result; + } else { + return WrapCompare(self.longitude, other.longitude); + } +} + +#pragma mark - NSObject methods + +- (NSString *)description { + return [NSString stringWithFormat:@"", self.latitude, self.longitude]; +} + +- (BOOL)isEqual:(id)other { + if (self == other) { + return YES; + } + if (![other isKindOfClass:[FIRGeoPoint class]]) { + return NO; + } + FIRGeoPoint *otherGeoPoint = (FIRGeoPoint *)other; + return DoubleBitwiseEquals(self.latitude, otherGeoPoint.latitude) && + DoubleBitwiseEquals(self.longitude, otherGeoPoint.longitude); +} + +- (NSUInteger)hash { + return 31 * DoubleBitwiseHash(self.latitude) + DoubleBitwiseHash(self.longitude); +} + +/** Implements NSCopying without actually copying because geopoints are immutable. */ +- (id)copyWithZone:(NSZone *_Nullable)zone { + return self; +} + +@end + +NS_ASSUME_NONNULL_END -- cgit v1.2.3