2015-03-23 22:07:33 +00:00
|
|
|
/**
|
|
|
|
* Copyright (c) 2015-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.
|
|
|
|
*/
|
2015-01-30 01:10:49 +00:00
|
|
|
|
|
|
|
#import "RCTSparseArray.h"
|
|
|
|
|
|
|
|
@implementation RCTSparseArray
|
|
|
|
{
|
|
|
|
NSMutableDictionary *_storage;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (instancetype)init
|
|
|
|
{
|
|
|
|
return [self initWithCapacity:0];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (instancetype)initWithCapacity:(NSUInteger)capacity
|
|
|
|
{
|
2015-02-04 00:02:36 +00:00
|
|
|
if ((self = [super init])) {
|
2015-01-30 01:10:49 +00:00
|
|
|
_storage = [NSMutableDictionary dictionaryWithCapacity:capacity];
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (instancetype)initWithSparseArray:(RCTSparseArray *)sparseArray
|
|
|
|
{
|
2015-02-04 00:02:36 +00:00
|
|
|
if ((self = [super init])) {
|
2015-01-30 01:10:49 +00:00
|
|
|
_storage = [sparseArray->_storage copy];
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
+ (instancetype)sparseArray
|
|
|
|
{
|
2015-08-17 14:35:34 +00:00
|
|
|
return [self new];
|
2015-01-30 01:10:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
+ (instancetype)sparseArrayWithCapacity:(NSUInteger)capacity
|
|
|
|
{
|
|
|
|
return [[self alloc] initWithCapacity:capacity];
|
|
|
|
}
|
|
|
|
|
|
|
|
+ (instancetype)sparseArrayWithSparseArray:(RCTSparseArray *)sparseArray
|
|
|
|
{
|
|
|
|
return [[self alloc] initWithSparseArray:sparseArray];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (id)objectAtIndexedSubscript:(NSUInteger)idx
|
|
|
|
{
|
|
|
|
return _storage[@(idx)];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx
|
|
|
|
{
|
|
|
|
self[@(idx)] = obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (id)objectForKeyedSubscript:(NSNumber *)key
|
|
|
|
{
|
|
|
|
return _storage[key];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)setObject:(id)obj forKeyedSubscript:(NSNumber *)key
|
|
|
|
{
|
|
|
|
if (obj) {
|
|
|
|
_storage[key] = obj;
|
|
|
|
} else {
|
|
|
|
[_storage removeObjectForKey:key];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSUInteger)count
|
|
|
|
{
|
|
|
|
return _storage.count;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSArray *)allIndexes
|
|
|
|
{
|
|
|
|
return _storage.allKeys;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSArray *)allObjects
|
|
|
|
{
|
|
|
|
return _storage.allValues;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSNumber *idx, BOOL *stop))block
|
|
|
|
{
|
|
|
|
NSParameterAssert(block != nil);
|
|
|
|
[_storage enumerateKeysAndObjectsUsingBlock:^(NSNumber *key, id obj, BOOL *stop) {
|
|
|
|
block(obj, key, stop);
|
|
|
|
}];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (^)(id obj, NSNumber *idx, BOOL *stop))block
|
|
|
|
{
|
|
|
|
NSParameterAssert(block != nil);
|
|
|
|
[_storage enumerateKeysAndObjectsWithOptions:opts usingBlock:^(NSNumber *key, id obj, BOOL *stop) {
|
|
|
|
block(obj, key, stop);
|
|
|
|
}];
|
|
|
|
}
|
|
|
|
|
2015-02-20 18:33:17 +00:00
|
|
|
- (void)removeAllObjects
|
|
|
|
{
|
|
|
|
[_storage removeAllObjects];
|
|
|
|
}
|
|
|
|
|
2015-01-30 01:10:49 +00:00
|
|
|
- (id)copyWithZone:(NSZone *)zone
|
|
|
|
{
|
|
|
|
return [[[self class] allocWithZone:zone] initWithSparseArray:self];
|
|
|
|
}
|
|
|
|
|
2015-02-25 20:40:49 +00:00
|
|
|
- (NSString *)description
|
|
|
|
{
|
2015-08-24 10:14:33 +00:00
|
|
|
return [super.description stringByAppendingString:_storage.description];
|
2015-02-25 20:40:49 +00:00
|
|
|
}
|
|
|
|
|
2015-01-30 01:10:49 +00:00
|
|
|
@end
|