ComponentKit/TransactionalDataSources/Common/CKDataSourceConfiguration.mm (104 lines of code) (raw):
/*
* Copyright (c) 2014-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
#import "CKDataSourceConfiguration.h"
#import "CKDataSourceConfigurationInternal.h"
#import <ComponentKit/RCEqualityHelpers.h>
#import <ComponentKit/CKGlobalConfig.h>
#import <ComponentKit/CKMacros.h>
static auto nilProvider(id<NSObject>, id<NSObject>) -> CKComponent * { return nil; }
@implementation CKDataSourceConfiguration
{
CKSizeRange _sizeRange;
std::unordered_set<CKComponentPredicate> _componentPredicates;
std::unordered_set<CKComponentControllerPredicate> _componentControllerPredicates;
CKDataSourceOptions _options;
CKComponentProviderFunc _componentProvider;
}
- (instancetype)initWithComponentProviderFunc:(CKComponentProviderFunc)componentProvider
context:(id<NSObject>)context
sizeRange:(const CKSizeRange &)sizeRange
{
return [self initWithComponentProviderFunc:componentProvider
context:context
sizeRange:sizeRange
options:{}
componentPredicates:{}
componentControllerPredicates:{}
analyticsListener:nil];
}
- (instancetype)initWithComponentProviderFunc:(CKComponentProviderFunc)componentProvider
context:(id<NSObject>)context
sizeRange:(const CKSizeRange &)sizeRange
options:(const CKDataSourceOptions &)options
componentPredicates:(const std::unordered_set<CKComponentPredicate> &)componentPredicates
componentControllerPredicates:(const std::unordered_set<CKComponentControllerPredicate> &)componentControllerPredicates
analyticsListener:(id<CKAnalyticsListener>)analyticsListener
{
if (self = [super init]) {
_componentProvider = componentProvider ?: nilProvider;
_context = context;
_sizeRange = sizeRange;
_componentPredicates = componentPredicates;
_componentControllerPredicates = componentControllerPredicates;
_analyticsListener = analyticsListener;
_options = options;
}
return self;
}
- (instancetype)copyWithContext:(id<NSObject>)context sizeRange:(const CKSizeRange &)sizeRange
{
return
[[CKDataSourceConfiguration alloc]
initWithComponentProviderFunc:_componentProvider
context:context
sizeRange:sizeRange
options:_options
componentPredicates:_componentPredicates
componentControllerPredicates:_componentControllerPredicates
analyticsListener:_analyticsListener];
}
- (const CKDataSourceOptions &)options
{
return _options;
}
- (const std::unordered_set<CKComponentPredicate> &)componentPredicates
{
return _componentPredicates;
}
- (const std::unordered_set<CKComponentControllerPredicate> &)componentControllerPredicates
{
return _componentControllerPredicates;
}
- (const CKSizeRange &)sizeRange
{
return _sizeRange;
}
- (CKComponentProviderFunc)componentProvider
{
return _componentProvider;
}
- (BOOL)isEqual:(id)object
{
if (![object isKindOfClass:[CKDataSourceConfiguration class]]) {
return NO;
} else {
CKDataSourceConfiguration *obj = (CKDataSourceConfiguration *)object;
return (_componentProvider == obj->_componentProvider
&& (_context == obj.context || [_context isEqual:obj.context])
&& _sizeRange == obj.sizeRange);
}
}
- (BOOL)hasSameComponentProviderAndContextAs:(CKDataSourceConfiguration *)other
{
if (other == nil) {
return NO;
}
return _componentProvider == other->_componentProvider && (_context == other.context || [_context isEqual:other.context]);
}
- (NSUInteger)hash
{
NSUInteger hashes[2] = {
[_context hash],
_sizeRange.hash()
};
return RCIntegerArrayHash(hashes, CK_ARRAY_COUNT(hashes));
}
@end