diff options
Diffstat (limited to 'Firestore/Source/Remote/FSTWatchChange.mm')
-rw-r--r-- | Firestore/Source/Remote/FSTWatchChange.mm | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/Firestore/Source/Remote/FSTWatchChange.mm b/Firestore/Source/Remote/FSTWatchChange.mm new file mode 100644 index 0000000..926d027 --- /dev/null +++ b/Firestore/Source/Remote/FSTWatchChange.mm @@ -0,0 +1,150 @@ +/* + * 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/Remote/FSTWatchChange.h" + +#import "Firestore/Source/Model/FSTDocument.h" +#import "Firestore/Source/Model/FSTDocumentKey.h" +#import "Firestore/Source/Remote/FSTExistenceFilter.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation FSTWatchChange +@end + +@implementation FSTDocumentWatchChange + +- (instancetype)initWithUpdatedTargetIDs:(NSArray<NSNumber *> *)updatedTargetIDs + removedTargetIDs:(NSArray<NSNumber *> *)removedTargetIDs + documentKey:(FSTDocumentKey *)documentKey + document:(nullable FSTMaybeDocument *)document { + self = [super init]; + if (self) { + _updatedTargetIDs = updatedTargetIDs; + _removedTargetIDs = removedTargetIDs; + _documentKey = documentKey; + _document = document; + } + return self; +} + +- (BOOL)isEqual:(id)other { + if (other == self) { + return YES; + } + if (![other isMemberOfClass:[FSTDocumentWatchChange class]]) { + return NO; + } + + FSTDocumentWatchChange *otherChange = (FSTDocumentWatchChange *)other; + return [_updatedTargetIDs isEqual:otherChange.updatedTargetIDs] && + [_removedTargetIDs isEqual:otherChange.removedTargetIDs] && + [_documentKey isEqual:otherChange.documentKey] && + (_document == otherChange.document || [_document isEqual:otherChange.document]); +} + +- (NSUInteger)hash { + NSUInteger hash = self.updatedTargetIDs.hash; + hash = hash * 31 + self.removedTargetIDs.hash; + hash = hash * 31 + self.documentKey.hash; + hash = hash * 31 + self.document.hash; + return hash; +} + +@end + +@interface FSTExistenceFilterWatchChange () + +- (instancetype)initWithFilter:(FSTExistenceFilter *)filter + targetID:(FSTTargetID)targetID NS_DESIGNATED_INITIALIZER; + +@end + +@implementation FSTExistenceFilterWatchChange + ++ (instancetype)changeWithFilter:(FSTExistenceFilter *)filter targetID:(FSTTargetID)targetID { + return [[FSTExistenceFilterWatchChange alloc] initWithFilter:filter targetID:targetID]; +} + +- (instancetype)initWithFilter:(FSTExistenceFilter *)filter targetID:(FSTTargetID)targetID { + self = [super init]; + if (self) { + _filter = filter; + _targetID = targetID; + } + return self; +} + +- (BOOL)isEqual:(id)other { + if (other == self) { + return YES; + } + if (![other isMemberOfClass:[FSTExistenceFilterWatchChange class]]) { + return NO; + } + + FSTExistenceFilterWatchChange *otherChange = (FSTExistenceFilterWatchChange *)other; + return [_filter isEqual:otherChange->_filter] && _targetID == otherChange->_targetID; +} + +- (NSUInteger)hash { + return self.filter.hash; +} + +@end + +@implementation FSTWatchTargetChange + +- (instancetype)initWithState:(FSTWatchTargetChangeState)state + targetIDs:(NSArray<NSNumber *> *)targetIDs + resumeToken:(NSData *)resumeToken + cause:(nullable NSError *)cause { + self = [super init]; + if (self) { + _state = state; + _targetIDs = targetIDs; + _resumeToken = resumeToken; + _cause = cause; + } + return self; +} + +- (BOOL)isEqual:(id)other { + if (other == self) { + return YES; + } + if (![other isMemberOfClass:[FSTWatchTargetChange class]]) { + return NO; + } + + FSTWatchTargetChange *otherChange = (FSTWatchTargetChange *)other; + return _state == otherChange->_state && [_targetIDs isEqual:otherChange->_targetIDs] && + [_resumeToken isEqual:otherChange->_resumeToken] && + (_cause == otherChange->_cause || [_cause isEqual:otherChange->_cause]); +} + +- (NSUInteger)hash { + NSUInteger hash = (NSUInteger)self.state; + + hash = hash * 31 + self.targetIDs.hash; + hash = hash * 31 + self.resumeToken.hash; + hash = hash * 31 + self.cause.hash; + return hash; +} + +@end + +NS_ASSUME_NONNULL_END |