blob: 421a14dc688c3350af0ee7780675d9a0b4e6f6e0 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 "WXThreadSafeMutableArray.h"
@interface WXThreadSafeMutableArray ()
@property (nonatomic, strong) dispatch_queue_t queue;
@property (nonatomic, strong) NSMutableArray* array;
@end
@implementation WXThreadSafeMutableArray
- (instancetype)initCommon
{
self = [super init];
if (self) {
NSString* uuid = [NSString stringWithFormat:@"com.taobao.weex.array_%p", self];
_queue = dispatch_queue_create([uuid UTF8String], DISPATCH_QUEUE_CONCURRENT);
}
return self;
}
- (instancetype)init
{
self = [self initCommon];
if (self) {
_array = [NSMutableArray array];
}
return self;
}
- (instancetype)initWithCapacity:(NSUInteger)numItems
{
self = [self initCommon];
if (self) {
_array = [NSMutableArray arrayWithCapacity:numItems];
}
return self;
}
- (NSArray *)initWithContentsOfFile:(NSString *)path
{
self = [self initCommon];
if (self) {
_array = [NSMutableArray arrayWithContentsOfFile:path];
}
return self;
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [self initCommon];
if (self) {
_array = [[NSMutableArray alloc] initWithCoder:aDecoder];
}
return self;
}
- (instancetype)initWithObjects:(const id [])objects count:(NSUInteger)cnt
{
self = [self initCommon];
if (self) {
_array = [NSMutableArray array];
for (NSUInteger i = 0; i < cnt; ++i) {
[_array addObject:objects[i]];
}
}
return self;
}
- (NSUInteger)count
{
__block NSUInteger count;
dispatch_sync(_queue, ^{
count = _array.count;
});
return count;
}
- (id)objectAtIndex:(NSUInteger)index
{
__block id obj;
dispatch_sync(_queue, ^{
obj = _array[index];
});
return obj;
}
- (NSEnumerator *)keyEnumerator
{
__block NSEnumerator *enu;
dispatch_sync(_queue, ^{
enu = [_array objectEnumerator];
});
return enu;
}
- (void)insertObject:(id)anObject atIndex:(NSUInteger)index
{
dispatch_barrier_async(_queue, ^{
[_array insertObject:anObject atIndex:index];
});
}
- (void)addObject:(id)anObject;
{
dispatch_barrier_async(_queue, ^{
[_array addObject:anObject];
});
}
- (void)removeObjectAtIndex:(NSUInteger)index
{
dispatch_barrier_async(_queue, ^{
[_array removeObjectAtIndex:index];
});
}
- (void)removeLastObject
{
dispatch_barrier_async(_queue, ^{
[_array removeLastObject];
});
}
- (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject
{
dispatch_barrier_async(_queue, ^{
[_array replaceObjectAtIndex:index withObject:anObject];
});
}
- (NSUInteger)indexOfObject:(id)anObject
{
__block NSUInteger index = NSNotFound;
dispatch_sync(_queue, ^{
for (int i = 0; i < [_array count]; i ++) {
if ([_array objectAtIndex:i] == anObject) {
index = i;
break;
}
}
});
return index;
}
- (void)dealloc
{
if (_queue) {
_queue = NULL;
}
}
@end