// Protocol Buffers - Google's data interchange format // Copyright 2015 Google Inc. All rights reserved. // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file or at // https://developers.google.com/open-source/licenses/bsd #import "GPBArray.h" #import "GPBArray_PackagePrivate.h" #import "GPBMessage.h" #import "GPBMessage_PackagePrivate.h" // Direct access is use for speed, to avoid even internally declaring things // read/write, etc. The warning is enabled in the project to ensure code calling // protos can turn on -Wdirect-ivar-access without issues. #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdirect-ivar-access" // Mutable arrays use an internal buffer that can always hold a multiple of this elements. #define kChunkSize 16 #define CapacityFromCount(x) (((x / kChunkSize) + 1) * kChunkSize) static BOOL ArrayDefault_IsValidValue(int32_t value) { // Anything but the bad value marker is allowed. return (value != kGPBUnrecognizedEnumeratorValue); } // Disable clang-format for the macros. // clang-format off //%PDDM-DEFINE VALIDATE_RANGE(INDEX, COUNT) //% if (INDEX >= COUNT) { //% [NSException raise:NSRangeException //% format:@"Index (%lu) beyond bounds (%lu)", //% (unsigned long)INDEX, (unsigned long)COUNT]; //% } //%PDDM-DEFINE MAYBE_GROW_TO_SET_COUNT(NEW_COUNT) //% if (NEW_COUNT > _capacity) { //% [self internalResizeToCapacity:CapacityFromCount(NEW_COUNT)]; //% } //% _count = NEW_COUNT; //%PDDM-DEFINE SET_COUNT_AND_MAYBE_SHRINK(NEW_COUNT) //% _count = NEW_COUNT; //% if ((NEW_COUNT + (2 * kChunkSize)) < _capacity) { //% [self internalResizeToCapacity:CapacityFromCount(NEW_COUNT)]; //% } // // Macros for the common basic cases. // //%PDDM-DEFINE ARRAY_INTERFACE_SIMPLE(NAME, TYPE, FORMAT) //%#pragma mark - NAME //% //%@implementation GPB##NAME##Array { //% @package //% TYPE *_values; //% NSUInteger _count; //% NSUInteger _capacity; //%} //% //%@synthesize count = _count; //% //%+ (instancetype)array { //% return [[[self alloc] init] autorelease]; //%} //% //%+ (instancetype)arrayWithValue:(TYPE)value { //% // Cast is needed so the compiler knows what class we are invoking initWithValues: on to get //% // the type correct. //% return [[(GPB##NAME##Array*)[self alloc] initWithValues:&value count:1] autorelease]; //%} //% //%+ (instancetype)arrayWithValueArray:(GPB##NAME##Array *)array { //% return [[(GPB##NAME##Array*)[self alloc] initWithValueArray:array] autorelease]; //%} //% //%+ (instancetype)arrayWithCapacity:(NSUInteger)count { //% return [[[self alloc] initWithCapacity:count] autorelease]; //%} //% //%- (instancetype)init { //% self = [super init]; //% // No work needed; //% return self; //%} //% //%- (instancetype)initWithValueArray:(GPB##NAME##Array *)array { //% return [self initWithValues:array->_values count:array->_count]; //%} //% //%- (instancetype)initWithValues:(const TYPE [])values count:(NSUInteger)count { //% self = [self init]; //% if (self) { //% if (count && values) { //% _values = reallocf(_values, count * sizeof(TYPE)); //% if (_values != NULL) { //% _capacity = count; //% memcpy(_values, values, count * sizeof(TYPE)); //% _count = count; //% } else { //% [self release]; //% [NSException raise:NSMallocException //% format:@"Failed to allocate %lu bytes", //% (unsigned long)(count * sizeof(TYPE))]; //% } //% } //% } //% return self; //%} //% //%- (instancetype)initWithCapacity:(NSUInteger)count { //% self = [self initWithValues:NULL count:0]; //% if (self && count) { //% [self internalResizeToCapacity:count]; //% } //% return self; //%} //% //%- (instancetype)copyWithZone:(NSZone *)zone { //% return [[GPB##NAME##Array allocWithZone:zone] initWithValues:_values count:_count]; //%} //% //%ARRAY_IMMUTABLE_CORE(NAME, TYPE, , FORMAT) //% //%- (TYPE)valueAtIndex:(NSUInteger)index { //%VALIDATE_RANGE(index, _count) //% return _values[index]; //%} //% //%ARRAY_MUTABLE_CORE(NAME, TYPE, , FORMAT) //%@end //% // // Some core macros used for both the simple types and Enums. // //%PDDM-DEFINE ARRAY_IMMUTABLE_CORE(NAME, TYPE, ACCESSOR_NAME, FORMAT) //%- (void)dealloc { //% NSAssert(!_autocreator, //% @"%@: Autocreator must be cleared before release, autocreator: %@", //% [self class], _autocreator); //% free(_values); //% [super dealloc]; //%} //% //%- (BOOL)isEqual:(id)other { //% if (self == other) { //% return YES; //% } //% if (![other isKindOfClass:[GPB##NAME##Array class]]) { //% return NO; //% } //% GPB##NAME##Array *otherArray = other; //% return (_count == otherArray->_count //% && memcmp(_values, otherArray->_values, (_count * sizeof(TYPE))) == 0); //%} //% //%- (NSUInteger)hash { //% // Follow NSArray's lead, and use the count as the hash. //% return _count; //%} //% //%- (NSString *)description { //% NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> { ", [self class], self]; //% for (NSUInteger i = 0, count = _count; i < count; ++i) { //% if (i == 0) { //% [result appendFormat:@"##FORMAT##", _values[i]]; //% } else { //% [result appendFormat:@", ##FORMAT##", _values[i]]; //% } //% } //% [result appendFormat:@" }"]; //% return result; //%} //% //%- (void)enumerate##ACCESSOR_NAME##ValuesWithBlock:(void(NS_NOESCAPE ^)(TYPE value, NSUInteger idx, BOOL *stop))block { //% [self enumerate##ACCESSOR_NAME##ValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block]; //%} //% //%- (void)enumerate##ACCESSOR_NAME##ValuesWithOptions:(NSEnumerationOptions)opts //% ACCESSOR_NAME$S usingBlock:(void(NS_NOESCAPE ^)(TYPE value, NSUInteger idx, BOOL *stop))block { //% // NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok). //% BOOL stop = NO; //% if ((opts & NSEnumerationReverse) == 0) { //% for (NSUInteger i = 0, count = _count; i < count; ++i) { //% block(_values[i], i, &stop); //% if (stop) break; //% } //% } else if (_count > 0) { //% for (NSUInteger i = _count; i > 0; --i) { //% block(_values[i - 1], (i - 1), &stop); //% if (stop) break; //% } //% } //%} //%PDDM-DEFINE MUTATION_HOOK_None() //%PDDM-DEFINE MUTATION_METHODS(NAME, TYPE, ACCESSOR_NAME, HOOK_1, HOOK_2) //%- (void)add##ACCESSOR_NAME##Value:(TYPE)value { //% [self add##ACCESSOR_NAME##Values:&value count:1]; //%} //% //%- (void)add##ACCESSOR_NAME##Values:(const TYPE [])values count:(NSUInteger)count { //% if (values == NULL || count == 0) return; //%MUTATION_HOOK_##HOOK_1() NSUInteger initialCount = _count; //% NSUInteger newCount = initialCount + count; //%MAYBE_GROW_TO_SET_COUNT(newCount) //% memcpy(&_values[initialCount], values, count * sizeof(TYPE)); //% if (_autocreator) { //% GPBAutocreatedArrayModified(_autocreator, self); //% } //%} //% //%- (void)insert##ACCESSOR_NAME##Value:(TYPE)value atIndex:(NSUInteger)index { //%VALIDATE_RANGE(index, _count + 1) //%MUTATION_HOOK_##HOOK_2() NSUInteger initialCount = _count; //% NSUInteger newCount = initialCount + 1; //%MAYBE_GROW_TO_SET_COUNT(newCount) //% if (index != initialCount) { //% memmove(&_values[index + 1], &_values[index], (initialCount - index) * sizeof(TYPE)); //% } //% _values[index] = value; //% if (_autocreator) { //% GPBAutocreatedArrayModified(_autocreator, self); //% } //%} //% //%- (void)replaceValueAtIndex:(NSUInteger)index with##ACCESSOR_NAME##Value:(TYPE)value { //%VALIDATE_RANGE(index, _count) //%MUTATION_HOOK_##HOOK_2() _values[index] = value; //%} //%PDDM-DEFINE ARRAY_MUTABLE_CORE(NAME, TYPE, ACCESSOR_NAME, FORMAT) //%- (void)internalResizeToCapacity:(NSUInteger)newCapacity { //% _values = reallocf(_values, newCapacity * sizeof(TYPE)); //% if (_values == NULL) { //% _capacity = 0; //% _count = 0; //% [NSException raise:NSMallocException //% format:@"Failed to allocate %lu bytes", //% (unsigned long)(newCapacity * sizeof(TYPE))]; //% } //% _capacity = newCapacity; //%} //% //%MUTATION_METHODS(NAME, TYPE, ACCESSOR_NAME, None, None) //% //%- (void)add##ACCESSOR_NAME##ValuesFromArray:(GPB##NAME##Array *)array { //% [self add##ACCESSOR_NAME##Values:array->_values count:array->_count]; //%} //% //%- (void)removeValueAtIndex:(NSUInteger)index { //%VALIDATE_RANGE(index, _count) //% NSUInteger newCount = _count - 1; //% if (index != newCount) { //% memmove(&_values[index], &_values[index + 1], (newCount - index) * sizeof(TYPE)); //% } //%SET_COUNT_AND_MAYBE_SHRINK(newCount) //%} //% //%- (void)removeAll { //%SET_COUNT_AND_MAYBE_SHRINK(0) //%} //% //%- (void)exchangeValueAtIndex:(NSUInteger)idx1 //% withValueAtIndex:(NSUInteger)idx2 { //%VALIDATE_RANGE(idx1, _count) //%VALIDATE_RANGE(idx2, _count) //% TYPE temp = _values[idx1]; //% _values[idx1] = _values[idx2]; //% _values[idx2] = temp; //%} //% //%PDDM-EXPAND ARRAY_INTERFACE_SIMPLE(Int32, int32_t, %d) // This block of code is generated, do not edit it directly. #pragma mark - Int32 @implementation GPBInt32Array { @package int32_t *_values; NSUInteger _count; NSUInteger _capacity; } @synthesize count = _count; + (instancetype)array { return [[[self alloc] init] autorelease]; } + (instancetype)arrayWithValue:(int32_t)value { // Cast is needed so the compiler knows what class we are invoking initWithValues: on to get // the type correct. return [[(GPBInt32Array*)[self alloc] initWithValues:&value count:1] autorelease]; } + (instancetype)arrayWithValueArray:(GPBInt32Array *)array { return [[(GPBInt32Array*)[self alloc] initWithValueArray:array] autorelease]; } + (instancetype)arrayWithCapacity:(NSUInteger)count { return [[[self alloc] initWithCapacity:count] autorelease]; } - (instancetype)init { self = [super init]; // No work needed; return self; } - (instancetype)initWithValueArray:(GPBInt32Array *)array { return [self initWithValues:array->_values count:array->_count]; } - (instancetype)initWithValues:(const int32_t [])values count:(NSUInteger)count { self = [self init]; if (self) { if (count && values) { _values = reallocf(_values, count * sizeof(int32_t)); if (_values != NULL) { _capacity = count; memcpy(_values, values, count * sizeof(int32_t)); _count = count; } else { [self release]; [NSException raise:NSMallocException format:@"Failed to allocate %lu bytes", (unsigned long)(count * sizeof(int32_t))]; } } } return self; } - (instancetype)initWithCapacity:(NSUInteger)count { self = [self initWithValues:NULL count:0]; if (self && count) { [self internalResizeToCapacity:count]; } return self; } - (instancetype)copyWithZone:(NSZone *)zone { return [[GPBInt32Array allocWithZone:zone] initWithValues:_values count:_count]; } - (void)dealloc { NSAssert(!_autocreator, @"%@: Autocreator must be cleared before release, autocreator: %@", [self class], _autocreator); free(_values); [super dealloc]; } - (BOOL)isEqual:(id)other { if (self == other) { return YES; } if (![other isKindOfClass:[GPBInt32Array class]]) { return NO; } GPBInt32Array *otherArray = other; return (_count == otherArray->_count && memcmp(_values, otherArray->_values, (_count * sizeof(int32_t))) == 0); } - (NSUInteger)hash { // Follow NSArray's lead, and use the count as the hash. return _count; } - (NSString *)description { NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> { ", [self class], self]; for (NSUInteger i = 0, count = _count; i < count; ++i) { if (i == 0) { [result appendFormat:@"%d", _values[i]]; } else { [result appendFormat:@", %d", _values[i]]; } } [result appendFormat:@" }"]; return result; } - (void)enumerateValuesWithBlock:(void(NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block { [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block]; } - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts usingBlock:(void(NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block { // NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok). BOOL stop = NO; if ((opts & NSEnumerationReverse) == 0) { for (NSUInteger i = 0, count = _count; i < count; ++i) { block(_values[i], i, &stop); if (stop) break; } } else if (_count > 0) { for (NSUInteger i = _count; i > 0; --i) { block(_values[i - 1], (i - 1), &stop); if (stop) break; } } } - (int32_t)valueAtIndex:(NSUInteger)index { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } return _values[index]; } - (void)internalResizeToCapacity:(NSUInteger)newCapacity { _values = reallocf(_values, newCapacity * sizeof(int32_t)); if (_values == NULL) { _capacity = 0; _count = 0; [NSException raise:NSMallocException format:@"Failed to allocate %lu bytes", (unsigned long)(newCapacity * sizeof(int32_t))]; } _capacity = newCapacity; } - (void)addValue:(int32_t)value { [self addValues:&value count:1]; } - (void)addValues:(const int32_t [])values count:(NSUInteger)count { if (values == NULL || count == 0) return; NSUInteger initialCount = _count; NSUInteger newCount = initialCount + count; if (newCount > _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } _count = newCount; memcpy(&_values[initialCount], values, count * sizeof(int32_t)); if (_autocreator) { GPBAutocreatedArrayModified(_autocreator, self); } } - (void)insertValue:(int32_t)value atIndex:(NSUInteger)index { if (index >= _count + 1) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count + 1]; } NSUInteger initialCount = _count; NSUInteger newCount = initialCount + 1; if (newCount > _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } _count = newCount; if (index != initialCount) { memmove(&_values[index + 1], &_values[index], (initialCount - index) * sizeof(int32_t)); } _values[index] = value; if (_autocreator) { GPBAutocreatedArrayModified(_autocreator, self); } } - (void)replaceValueAtIndex:(NSUInteger)index withValue:(int32_t)value { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } _values[index] = value; } - (void)addValuesFromArray:(GPBInt32Array *)array { [self addValues:array->_values count:array->_count]; } - (void)removeValueAtIndex:(NSUInteger)index { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } NSUInteger newCount = _count - 1; if (index != newCount) { memmove(&_values[index], &_values[index + 1], (newCount - index) * sizeof(int32_t)); } _count = newCount; if ((newCount + (2 * kChunkSize)) < _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } } - (void)removeAll { _count = 0; if ((0 + (2 * kChunkSize)) < _capacity) { [self internalResizeToCapacity:CapacityFromCount(0)]; } } - (void)exchangeValueAtIndex:(NSUInteger)idx1 withValueAtIndex:(NSUInteger)idx2 { if (idx1 >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)idx1, (unsigned long)_count]; } if (idx2 >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)idx2, (unsigned long)_count]; } int32_t temp = _values[idx1]; _values[idx1] = _values[idx2]; _values[idx2] = temp; } @end //%PDDM-EXPAND ARRAY_INTERFACE_SIMPLE(UInt32, uint32_t, %u) // This block of code is generated, do not edit it directly. #pragma mark - UInt32 @implementation GPBUInt32Array { @package uint32_t *_values; NSUInteger _count; NSUInteger _capacity; } @synthesize count = _count; + (instancetype)array { return [[[self alloc] init] autorelease]; } + (instancetype)arrayWithValue:(uint32_t)value { // Cast is needed so the compiler knows what class we are invoking initWithValues: on to get // the type correct. return [[(GPBUInt32Array*)[self alloc] initWithValues:&value count:1] autorelease]; } + (instancetype)arrayWithValueArray:(GPBUInt32Array *)array { return [[(GPBUInt32Array*)[self alloc] initWithValueArray:array] autorelease]; } + (instancetype)arrayWithCapacity:(NSUInteger)count { return [[[self alloc] initWithCapacity:count] autorelease]; } - (instancetype)init { self = [super init]; // No work needed; return self; } - (instancetype)initWithValueArray:(GPBUInt32Array *)array { return [self initWithValues:array->_values count:array->_count]; } - (instancetype)initWithValues:(const uint32_t [])values count:(NSUInteger)count { self = [self init]; if (self) { if (count && values) { _values = reallocf(_values, count * sizeof(uint32_t)); if (_values != NULL) { _capacity = count; memcpy(_values, values, count * sizeof(uint32_t)); _count = count; } else { [self release]; [NSException raise:NSMallocException format:@"Failed to allocate %lu bytes", (unsigned long)(count * sizeof(uint32_t))]; } } } return self; } - (instancetype)initWithCapacity:(NSUInteger)count { self = [self initWithValues:NULL count:0]; if (self && count) { [self internalResizeToCapacity:count]; } return self; } - (instancetype)copyWithZone:(NSZone *)zone { return [[GPBUInt32Array allocWithZone:zone] initWithValues:_values count:_count]; } - (void)dealloc { NSAssert(!_autocreator, @"%@: Autocreator must be cleared before release, autocreator: %@", [self class], _autocreator); free(_values); [super dealloc]; } - (BOOL)isEqual:(id)other { if (self == other) { return YES; } if (![other isKindOfClass:[GPBUInt32Array class]]) { return NO; } GPBUInt32Array *otherArray = other; return (_count == otherArray->_count && memcmp(_values, otherArray->_values, (_count * sizeof(uint32_t))) == 0); } - (NSUInteger)hash { // Follow NSArray's lead, and use the count as the hash. return _count; } - (NSString *)description { NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> { ", [self class], self]; for (NSUInteger i = 0, count = _count; i < count; ++i) { if (i == 0) { [result appendFormat:@"%u", _values[i]]; } else { [result appendFormat:@", %u", _values[i]]; } } [result appendFormat:@" }"]; return result; } - (void)enumerateValuesWithBlock:(void(NS_NOESCAPE ^)(uint32_t value, NSUInteger idx, BOOL *stop))block { [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block]; } - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts usingBlock:(void(NS_NOESCAPE ^)(uint32_t value, NSUInteger idx, BOOL *stop))block { // NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok). BOOL stop = NO; if ((opts & NSEnumerationReverse) == 0) { for (NSUInteger i = 0, count = _count; i < count; ++i) { block(_values[i], i, &stop); if (stop) break; } } else if (_count > 0) { for (NSUInteger i = _count; i > 0; --i) { block(_values[i - 1], (i - 1), &stop); if (stop) break; } } } - (uint32_t)valueAtIndex:(NSUInteger)index { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } return _values[index]; } - (void)internalResizeToCapacity:(NSUInteger)newCapacity { _values = reallocf(_values, newCapacity * sizeof(uint32_t)); if (_values == NULL) { _capacity = 0; _count = 0; [NSException raise:NSMallocException format:@"Failed to allocate %lu bytes", (unsigned long)(newCapacity * sizeof(uint32_t))]; } _capacity = newCapacity; } - (void)addValue:(uint32_t)value { [self addValues:&value count:1]; } - (void)addValues:(const uint32_t [])values count:(NSUInteger)count { if (values == NULL || count == 0) return; NSUInteger initialCount = _count; NSUInteger newCount = initialCount + count; if (newCount > _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } _count = newCount; memcpy(&_values[initialCount], values, count * sizeof(uint32_t)); if (_autocreator) { GPBAutocreatedArrayModified(_autocreator, self); } } - (void)insertValue:(uint32_t)value atIndex:(NSUInteger)index { if (index >= _count + 1) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count + 1]; } NSUInteger initialCount = _count; NSUInteger newCount = initialCount + 1; if (newCount > _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } _count = newCount; if (index != initialCount) { memmove(&_values[index + 1], &_values[index], (initialCount - index) * sizeof(uint32_t)); } _values[index] = value; if (_autocreator) { GPBAutocreatedArrayModified(_autocreator, self); } } - (void)replaceValueAtIndex:(NSUInteger)index withValue:(uint32_t)value { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } _values[index] = value; } - (void)addValuesFromArray:(GPBUInt32Array *)array { [self addValues:array->_values count:array->_count]; } - (void)removeValueAtIndex:(NSUInteger)index { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } NSUInteger newCount = _count - 1; if (index != newCount) { memmove(&_values[index], &_values[index + 1], (newCount - index) * sizeof(uint32_t)); } _count = newCount; if ((newCount + (2 * kChunkSize)) < _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } } - (void)removeAll { _count = 0; if ((0 + (2 * kChunkSize)) < _capacity) { [self internalResizeToCapacity:CapacityFromCount(0)]; } } - (void)exchangeValueAtIndex:(NSUInteger)idx1 withValueAtIndex:(NSUInteger)idx2 { if (idx1 >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)idx1, (unsigned long)_count]; } if (idx2 >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)idx2, (unsigned long)_count]; } uint32_t temp = _values[idx1]; _values[idx1] = _values[idx2]; _values[idx2] = temp; } @end //%PDDM-EXPAND ARRAY_INTERFACE_SIMPLE(Int64, int64_t, %lld) // This block of code is generated, do not edit it directly. #pragma mark - Int64 @implementation GPBInt64Array { @package int64_t *_values; NSUInteger _count; NSUInteger _capacity; } @synthesize count = _count; + (instancetype)array { return [[[self alloc] init] autorelease]; } + (instancetype)arrayWithValue:(int64_t)value { // Cast is needed so the compiler knows what class we are invoking initWithValues: on to get // the type correct. return [[(GPBInt64Array*)[self alloc] initWithValues:&value count:1] autorelease]; } + (instancetype)arrayWithValueArray:(GPBInt64Array *)array { return [[(GPBInt64Array*)[self alloc] initWithValueArray:array] autorelease]; } + (instancetype)arrayWithCapacity:(NSUInteger)count { return [[[self alloc] initWithCapacity:count] autorelease]; } - (instancetype)init { self = [super init]; // No work needed; return self; } - (instancetype)initWithValueArray:(GPBInt64Array *)array { return [self initWithValues:array->_values count:array->_count]; } - (instancetype)initWithValues:(const int64_t [])values count:(NSUInteger)count { self = [self init]; if (self) { if (count && values) { _values = reallocf(_values, count * sizeof(int64_t)); if (_values != NULL) { _capacity = count; memcpy(_values, values, count * sizeof(int64_t)); _count = count; } else { [self release]; [NSException raise:NSMallocException format:@"Failed to allocate %lu bytes", (unsigned long)(count * sizeof(int64_t))]; } } } return self; } - (instancetype)initWithCapacity:(NSUInteger)count { self = [self initWithValues:NULL count:0]; if (self && count) { [self internalResizeToCapacity:count]; } return self; } - (instancetype)copyWithZone:(NSZone *)zone { return [[GPBInt64Array allocWithZone:zone] initWithValues:_values count:_count]; } - (void)dealloc { NSAssert(!_autocreator, @"%@: Autocreator must be cleared before release, autocreator: %@", [self class], _autocreator); free(_values); [super dealloc]; } - (BOOL)isEqual:(id)other { if (self == other) { return YES; } if (![other isKindOfClass:[GPBInt64Array class]]) { return NO; } GPBInt64Array *otherArray = other; return (_count == otherArray->_count && memcmp(_values, otherArray->_values, (_count * sizeof(int64_t))) == 0); } - (NSUInteger)hash { // Follow NSArray's lead, and use the count as the hash. return _count; } - (NSString *)description { NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> { ", [self class], self]; for (NSUInteger i = 0, count = _count; i < count; ++i) { if (i == 0) { [result appendFormat:@"%lld", _values[i]]; } else { [result appendFormat:@", %lld", _values[i]]; } } [result appendFormat:@" }"]; return result; } - (void)enumerateValuesWithBlock:(void(NS_NOESCAPE ^)(int64_t value, NSUInteger idx, BOOL *stop))block { [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block]; } - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts usingBlock:(void(NS_NOESCAPE ^)(int64_t value, NSUInteger idx, BOOL *stop))block { // NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok). BOOL stop = NO; if ((opts & NSEnumerationReverse) == 0) { for (NSUInteger i = 0, count = _count; i < count; ++i) { block(_values[i], i, &stop); if (stop) break; } } else if (_count > 0) { for (NSUInteger i = _count; i > 0; --i) { block(_values[i - 1], (i - 1), &stop); if (stop) break; } } } - (int64_t)valueAtIndex:(NSUInteger)index { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } return _values[index]; } - (void)internalResizeToCapacity:(NSUInteger)newCapacity { _values = reallocf(_values, newCapacity * sizeof(int64_t)); if (_values == NULL) { _capacity = 0; _count = 0; [NSException raise:NSMallocException format:@"Failed to allocate %lu bytes", (unsigned long)(newCapacity * sizeof(int64_t))]; } _capacity = newCapacity; } - (void)addValue:(int64_t)value { [self addValues:&value count:1]; } - (void)addValues:(const int64_t [])values count:(NSUInteger)count { if (values == NULL || count == 0) return; NSUInteger initialCount = _count; NSUInteger newCount = initialCount + count; if (newCount > _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } _count = newCount; memcpy(&_values[initialCount], values, count * sizeof(int64_t)); if (_autocreator) { GPBAutocreatedArrayModified(_autocreator, self); } } - (void)insertValue:(int64_t)value atIndex:(NSUInteger)index { if (index >= _count + 1) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count + 1]; } NSUInteger initialCount = _count; NSUInteger newCount = initialCount + 1; if (newCount > _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } _count = newCount; if (index != initialCount) { memmove(&_values[index + 1], &_values[index], (initialCount - index) * sizeof(int64_t)); } _values[index] = value; if (_autocreator) { GPBAutocreatedArrayModified(_autocreator, self); } } - (void)replaceValueAtIndex:(NSUInteger)index withValue:(int64_t)value { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } _values[index] = value; } - (void)addValuesFromArray:(GPBInt64Array *)array { [self addValues:array->_values count:array->_count]; } - (void)removeValueAtIndex:(NSUInteger)index { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } NSUInteger newCount = _count - 1; if (index != newCount) { memmove(&_values[index], &_values[index + 1], (newCount - index) * sizeof(int64_t)); } _count = newCount; if ((newCount + (2 * kChunkSize)) < _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } } - (void)removeAll { _count = 0; if ((0 + (2 * kChunkSize)) < _capacity) { [self internalResizeToCapacity:CapacityFromCount(0)]; } } - (void)exchangeValueAtIndex:(NSUInteger)idx1 withValueAtIndex:(NSUInteger)idx2 { if (idx1 >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)idx1, (unsigned long)_count]; } if (idx2 >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)idx2, (unsigned long)_count]; } int64_t temp = _values[idx1]; _values[idx1] = _values[idx2]; _values[idx2] = temp; } @end //%PDDM-EXPAND ARRAY_INTERFACE_SIMPLE(UInt64, uint64_t, %llu) // This block of code is generated, do not edit it directly. #pragma mark - UInt64 @implementation GPBUInt64Array { @package uint64_t *_values; NSUInteger _count; NSUInteger _capacity; } @synthesize count = _count; + (instancetype)array { return [[[self alloc] init] autorelease]; } + (instancetype)arrayWithValue:(uint64_t)value { // Cast is needed so the compiler knows what class we are invoking initWithValues: on to get // the type correct. return [[(GPBUInt64Array*)[self alloc] initWithValues:&value count:1] autorelease]; } + (instancetype)arrayWithValueArray:(GPBUInt64Array *)array { return [[(GPBUInt64Array*)[self alloc] initWithValueArray:array] autorelease]; } + (instancetype)arrayWithCapacity:(NSUInteger)count { return [[[self alloc] initWithCapacity:count] autorelease]; } - (instancetype)init { self = [super init]; // No work needed; return self; } - (instancetype)initWithValueArray:(GPBUInt64Array *)array { return [self initWithValues:array->_values count:array->_count]; } - (instancetype)initWithValues:(const uint64_t [])values count:(NSUInteger)count { self = [self init]; if (self) { if (count && values) { _values = reallocf(_values, count * sizeof(uint64_t)); if (_values != NULL) { _capacity = count; memcpy(_values, values, count * sizeof(uint64_t)); _count = count; } else { [self release]; [NSException raise:NSMallocException format:@"Failed to allocate %lu bytes", (unsigned long)(count * sizeof(uint64_t))]; } } } return self; } - (instancetype)initWithCapacity:(NSUInteger)count { self = [self initWithValues:NULL count:0]; if (self && count) { [self internalResizeToCapacity:count]; } return self; } - (instancetype)copyWithZone:(NSZone *)zone { return [[GPBUInt64Array allocWithZone:zone] initWithValues:_values count:_count]; } - (void)dealloc { NSAssert(!_autocreator, @"%@: Autocreator must be cleared before release, autocreator: %@", [self class], _autocreator); free(_values); [super dealloc]; } - (BOOL)isEqual:(id)other { if (self == other) { return YES; } if (![other isKindOfClass:[GPBUInt64Array class]]) { return NO; } GPBUInt64Array *otherArray = other; return (_count == otherArray->_count && memcmp(_values, otherArray->_values, (_count * sizeof(uint64_t))) == 0); } - (NSUInteger)hash { // Follow NSArray's lead, and use the count as the hash. return _count; } - (NSString *)description { NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> { ", [self class], self]; for (NSUInteger i = 0, count = _count; i < count; ++i) { if (i == 0) { [result appendFormat:@"%llu", _values[i]]; } else { [result appendFormat:@", %llu", _values[i]]; } } [result appendFormat:@" }"]; return result; } - (void)enumerateValuesWithBlock:(void(NS_NOESCAPE ^)(uint64_t value, NSUInteger idx, BOOL *stop))block { [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block]; } - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts usingBlock:(void(NS_NOESCAPE ^)(uint64_t value, NSUInteger idx, BOOL *stop))block { // NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok). BOOL stop = NO; if ((opts & NSEnumerationReverse) == 0) { for (NSUInteger i = 0, count = _count; i < count; ++i) { block(_values[i], i, &stop); if (stop) break; } } else if (_count > 0) { for (NSUInteger i = _count; i > 0; --i) { block(_values[i - 1], (i - 1), &stop); if (stop) break; } } } - (uint64_t)valueAtIndex:(NSUInteger)index { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } return _values[index]; } - (void)internalResizeToCapacity:(NSUInteger)newCapacity { _values = reallocf(_values, newCapacity * sizeof(uint64_t)); if (_values == NULL) { _capacity = 0; _count = 0; [NSException raise:NSMallocException format:@"Failed to allocate %lu bytes", (unsigned long)(newCapacity * sizeof(uint64_t))]; } _capacity = newCapacity; } - (void)addValue:(uint64_t)value { [self addValues:&value count:1]; } - (void)addValues:(const uint64_t [])values count:(NSUInteger)count { if (values == NULL || count == 0) return; NSUInteger initialCount = _count; NSUInteger newCount = initialCount + count; if (newCount > _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } _count = newCount; memcpy(&_values[initialCount], values, count * sizeof(uint64_t)); if (_autocreator) { GPBAutocreatedArrayModified(_autocreator, self); } } - (void)insertValue:(uint64_t)value atIndex:(NSUInteger)index { if (index >= _count + 1) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count + 1]; } NSUInteger initialCount = _count; NSUInteger newCount = initialCount + 1; if (newCount > _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } _count = newCount; if (index != initialCount) { memmove(&_values[index + 1], &_values[index], (initialCount - index) * sizeof(uint64_t)); } _values[index] = value; if (_autocreator) { GPBAutocreatedArrayModified(_autocreator, self); } } - (void)replaceValueAtIndex:(NSUInteger)index withValue:(uint64_t)value { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } _values[index] = value; } - (void)addValuesFromArray:(GPBUInt64Array *)array { [self addValues:array->_values count:array->_count]; } - (void)removeValueAtIndex:(NSUInteger)index { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } NSUInteger newCount = _count - 1; if (index != newCount) { memmove(&_values[index], &_values[index + 1], (newCount - index) * sizeof(uint64_t)); } _count = newCount; if ((newCount + (2 * kChunkSize)) < _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } } - (void)removeAll { _count = 0; if ((0 + (2 * kChunkSize)) < _capacity) { [self internalResizeToCapacity:CapacityFromCount(0)]; } } - (void)exchangeValueAtIndex:(NSUInteger)idx1 withValueAtIndex:(NSUInteger)idx2 { if (idx1 >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)idx1, (unsigned long)_count]; } if (idx2 >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)idx2, (unsigned long)_count]; } uint64_t temp = _values[idx1]; _values[idx1] = _values[idx2]; _values[idx2] = temp; } @end //%PDDM-EXPAND ARRAY_INTERFACE_SIMPLE(Float, float, %f) // This block of code is generated, do not edit it directly. #pragma mark - Float @implementation GPBFloatArray { @package float *_values; NSUInteger _count; NSUInteger _capacity; } @synthesize count = _count; + (instancetype)array { return [[[self alloc] init] autorelease]; } + (instancetype)arrayWithValue:(float)value { // Cast is needed so the compiler knows what class we are invoking initWithValues: on to get // the type correct. return [[(GPBFloatArray*)[self alloc] initWithValues:&value count:1] autorelease]; } + (instancetype)arrayWithValueArray:(GPBFloatArray *)array { return [[(GPBFloatArray*)[self alloc] initWithValueArray:array] autorelease]; } + (instancetype)arrayWithCapacity:(NSUInteger)count { return [[[self alloc] initWithCapacity:count] autorelease]; } - (instancetype)init { self = [super init]; // No work needed; return self; } - (instancetype)initWithValueArray:(GPBFloatArray *)array { return [self initWithValues:array->_values count:array->_count]; } - (instancetype)initWithValues:(const float [])values count:(NSUInteger)count { self = [self init]; if (self) { if (count && values) { _values = reallocf(_values, count * sizeof(float)); if (_values != NULL) { _capacity = count; memcpy(_values, values, count * sizeof(float)); _count = count; } else { [self release]; [NSException raise:NSMallocException format:@"Failed to allocate %lu bytes", (unsigned long)(count * sizeof(float))]; } } } return self; } - (instancetype)initWithCapacity:(NSUInteger)count { self = [self initWithValues:NULL count:0]; if (self && count) { [self internalResizeToCapacity:count]; } return self; } - (instancetype)copyWithZone:(NSZone *)zone { return [[GPBFloatArray allocWithZone:zone] initWithValues:_values count:_count]; } - (void)dealloc { NSAssert(!_autocreator, @"%@: Autocreator must be cleared before release, autocreator: %@", [self class], _autocreator); free(_values); [super dealloc]; } - (BOOL)isEqual:(id)other { if (self == other) { return YES; } if (![other isKindOfClass:[GPBFloatArray class]]) { return NO; } GPBFloatArray *otherArray = other; return (_count == otherArray->_count && memcmp(_values, otherArray->_values, (_count * sizeof(float))) == 0); } - (NSUInteger)hash { // Follow NSArray's lead, and use the count as the hash. return _count; } - (NSString *)description { NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> { ", [self class], self]; for (NSUInteger i = 0, count = _count; i < count; ++i) { if (i == 0) { [result appendFormat:@"%f", _values[i]]; } else { [result appendFormat:@", %f", _values[i]]; } } [result appendFormat:@" }"]; return result; } - (void)enumerateValuesWithBlock:(void(NS_NOESCAPE ^)(float value, NSUInteger idx, BOOL *stop))block { [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block]; } - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts usingBlock:(void(NS_NOESCAPE ^)(float value, NSUInteger idx, BOOL *stop))block { // NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok). BOOL stop = NO; if ((opts & NSEnumerationReverse) == 0) { for (NSUInteger i = 0, count = _count; i < count; ++i) { block(_values[i], i, &stop); if (stop) break; } } else if (_count > 0) { for (NSUInteger i = _count; i > 0; --i) { block(_values[i - 1], (i - 1), &stop); if (stop) break; } } } - (float)valueAtIndex:(NSUInteger)index { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } return _values[index]; } - (void)internalResizeToCapacity:(NSUInteger)newCapacity { _values = reallocf(_values, newCapacity * sizeof(float)); if (_values == NULL) { _capacity = 0; _count = 0; [NSException raise:NSMallocException format:@"Failed to allocate %lu bytes", (unsigned long)(newCapacity * sizeof(float))]; } _capacity = newCapacity; } - (void)addValue:(float)value { [self addValues:&value count:1]; } - (void)addValues:(const float [])values count:(NSUInteger)count { if (values == NULL || count == 0) return; NSUInteger initialCount = _count; NSUInteger newCount = initialCount + count; if (newCount > _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } _count = newCount; memcpy(&_values[initialCount], values, count * sizeof(float)); if (_autocreator) { GPBAutocreatedArrayModified(_autocreator, self); } } - (void)insertValue:(float)value atIndex:(NSUInteger)index { if (index >= _count + 1) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count + 1]; } NSUInteger initialCount = _count; NSUInteger newCount = initialCount + 1; if (newCount > _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } _count = newCount; if (index != initialCount) { memmove(&_values[index + 1], &_values[index], (initialCount - index) * sizeof(float)); } _values[index] = value; if (_autocreator) { GPBAutocreatedArrayModified(_autocreator, self); } } - (void)replaceValueAtIndex:(NSUInteger)index withValue:(float)value { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } _values[index] = value; } - (void)addValuesFromArray:(GPBFloatArray *)array { [self addValues:array->_values count:array->_count]; } - (void)removeValueAtIndex:(NSUInteger)index { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } NSUInteger newCount = _count - 1; if (index != newCount) { memmove(&_values[index], &_values[index + 1], (newCount - index) * sizeof(float)); } _count = newCount; if ((newCount + (2 * kChunkSize)) < _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } } - (void)removeAll { _count = 0; if ((0 + (2 * kChunkSize)) < _capacity) { [self internalResizeToCapacity:CapacityFromCount(0)]; } } - (void)exchangeValueAtIndex:(NSUInteger)idx1 withValueAtIndex:(NSUInteger)idx2 { if (idx1 >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)idx1, (unsigned long)_count]; } if (idx2 >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)idx2, (unsigned long)_count]; } float temp = _values[idx1]; _values[idx1] = _values[idx2]; _values[idx2] = temp; } @end //%PDDM-EXPAND ARRAY_INTERFACE_SIMPLE(Double, double, %lf) // This block of code is generated, do not edit it directly. #pragma mark - Double @implementation GPBDoubleArray { @package double *_values; NSUInteger _count; NSUInteger _capacity; } @synthesize count = _count; + (instancetype)array { return [[[self alloc] init] autorelease]; } + (instancetype)arrayWithValue:(double)value { // Cast is needed so the compiler knows what class we are invoking initWithValues: on to get // the type correct. return [[(GPBDoubleArray*)[self alloc] initWithValues:&value count:1] autorelease]; } + (instancetype)arrayWithValueArray:(GPBDoubleArray *)array { return [[(GPBDoubleArray*)[self alloc] initWithValueArray:array] autorelease]; } + (instancetype)arrayWithCapacity:(NSUInteger)count { return [[[self alloc] initWithCapacity:count] autorelease]; } - (instancetype)init { self = [super init]; // No work needed; return self; } - (instancetype)initWithValueArray:(GPBDoubleArray *)array { return [self initWithValues:array->_values count:array->_count]; } - (instancetype)initWithValues:(const double [])values count:(NSUInteger)count { self = [self init]; if (self) { if (count && values) { _values = reallocf(_values, count * sizeof(double)); if (_values != NULL) { _capacity = count; memcpy(_values, values, count * sizeof(double)); _count = count; } else { [self release]; [NSException raise:NSMallocException format:@"Failed to allocate %lu bytes", (unsigned long)(count * sizeof(double))]; } } } return self; } - (instancetype)initWithCapacity:(NSUInteger)count { self = [self initWithValues:NULL count:0]; if (self && count) { [self internalResizeToCapacity:count]; } return self; } - (instancetype)copyWithZone:(NSZone *)zone { return [[GPBDoubleArray allocWithZone:zone] initWithValues:_values count:_count]; } - (void)dealloc { NSAssert(!_autocreator, @"%@: Autocreator must be cleared before release, autocreator: %@", [self class], _autocreator); free(_values); [super dealloc]; } - (BOOL)isEqual:(id)other { if (self == other) { return YES; } if (![other isKindOfClass:[GPBDoubleArray class]]) { return NO; } GPBDoubleArray *otherArray = other; return (_count == otherArray->_count && memcmp(_values, otherArray->_values, (_count * sizeof(double))) == 0); } - (NSUInteger)hash { // Follow NSArray's lead, and use the count as the hash. return _count; } - (NSString *)description { NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> { ", [self class], self]; for (NSUInteger i = 0, count = _count; i < count; ++i) { if (i == 0) { [result appendFormat:@"%lf", _values[i]]; } else { [result appendFormat:@", %lf", _values[i]]; } } [result appendFormat:@" }"]; return result; } - (void)enumerateValuesWithBlock:(void(NS_NOESCAPE ^)(double value, NSUInteger idx, BOOL *stop))block { [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block]; } - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts usingBlock:(void(NS_NOESCAPE ^)(double value, NSUInteger idx, BOOL *stop))block { // NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok). BOOL stop = NO; if ((opts & NSEnumerationReverse) == 0) { for (NSUInteger i = 0, count = _count; i < count; ++i) { block(_values[i], i, &stop); if (stop) break; } } else if (_count > 0) { for (NSUInteger i = _count; i > 0; --i) { block(_values[i - 1], (i - 1), &stop); if (stop) break; } } } - (double)valueAtIndex:(NSUInteger)index { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } return _values[index]; } - (void)internalResizeToCapacity:(NSUInteger)newCapacity { _values = reallocf(_values, newCapacity * sizeof(double)); if (_values == NULL) { _capacity = 0; _count = 0; [NSException raise:NSMallocException format:@"Failed to allocate %lu bytes", (unsigned long)(newCapacity * sizeof(double))]; } _capacity = newCapacity; } - (void)addValue:(double)value { [self addValues:&value count:1]; } - (void)addValues:(const double [])values count:(NSUInteger)count { if (values == NULL || count == 0) return; NSUInteger initialCount = _count; NSUInteger newCount = initialCount + count; if (newCount > _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } _count = newCount; memcpy(&_values[initialCount], values, count * sizeof(double)); if (_autocreator) { GPBAutocreatedArrayModified(_autocreator, self); } } - (void)insertValue:(double)value atIndex:(NSUInteger)index { if (index >= _count + 1) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count + 1]; } NSUInteger initialCount = _count; NSUInteger newCount = initialCount + 1; if (newCount > _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } _count = newCount; if (index != initialCount) { memmove(&_values[index + 1], &_values[index], (initialCount - index) * sizeof(double)); } _values[index] = value; if (_autocreator) { GPBAutocreatedArrayModified(_autocreator, self); } } - (void)replaceValueAtIndex:(NSUInteger)index withValue:(double)value { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } _values[index] = value; } - (void)addValuesFromArray:(GPBDoubleArray *)array { [self addValues:array->_values count:array->_count]; } - (void)removeValueAtIndex:(NSUInteger)index { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } NSUInteger newCount = _count - 1; if (index != newCount) { memmove(&_values[index], &_values[index + 1], (newCount - index) * sizeof(double)); } _count = newCount; if ((newCount + (2 * kChunkSize)) < _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } } - (void)removeAll { _count = 0; if ((0 + (2 * kChunkSize)) < _capacity) { [self internalResizeToCapacity:CapacityFromCount(0)]; } } - (void)exchangeValueAtIndex:(NSUInteger)idx1 withValueAtIndex:(NSUInteger)idx2 { if (idx1 >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)idx1, (unsigned long)_count]; } if (idx2 >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)idx2, (unsigned long)_count]; } double temp = _values[idx1]; _values[idx1] = _values[idx2]; _values[idx2] = temp; } @end //%PDDM-EXPAND ARRAY_INTERFACE_SIMPLE(Bool, BOOL, %d) // This block of code is generated, do not edit it directly. #pragma mark - Bool @implementation GPBBoolArray { @package BOOL *_values; NSUInteger _count; NSUInteger _capacity; } @synthesize count = _count; + (instancetype)array { return [[[self alloc] init] autorelease]; } + (instancetype)arrayWithValue:(BOOL)value { // Cast is needed so the compiler knows what class we are invoking initWithValues: on to get // the type correct. return [[(GPBBoolArray*)[self alloc] initWithValues:&value count:1] autorelease]; } + (instancetype)arrayWithValueArray:(GPBBoolArray *)array { return [[(GPBBoolArray*)[self alloc] initWithValueArray:array] autorelease]; } + (instancetype)arrayWithCapacity:(NSUInteger)count { return [[[self alloc] initWithCapacity:count] autorelease]; } - (instancetype)init { self = [super init]; // No work needed; return self; } - (instancetype)initWithValueArray:(GPBBoolArray *)array { return [self initWithValues:array->_values count:array->_count]; } - (instancetype)initWithValues:(const BOOL [])values count:(NSUInteger)count { self = [self init]; if (self) { if (count && values) { _values = reallocf(_values, count * sizeof(BOOL)); if (_values != NULL) { _capacity = count; memcpy(_values, values, count * sizeof(BOOL)); _count = count; } else { [self release]; [NSException raise:NSMallocException format:@"Failed to allocate %lu bytes", (unsigned long)(count * sizeof(BOOL))]; } } } return self; } - (instancetype)initWithCapacity:(NSUInteger)count { self = [self initWithValues:NULL count:0]; if (self && count) { [self internalResizeToCapacity:count]; } return self; } - (instancetype)copyWithZone:(NSZone *)zone { return [[GPBBoolArray allocWithZone:zone] initWithValues:_values count:_count]; } - (void)dealloc { NSAssert(!_autocreator, @"%@: Autocreator must be cleared before release, autocreator: %@", [self class], _autocreator); free(_values); [super dealloc]; } - (BOOL)isEqual:(id)other { if (self == other) { return YES; } if (![other isKindOfClass:[GPBBoolArray class]]) { return NO; } GPBBoolArray *otherArray = other; return (_count == otherArray->_count && memcmp(_values, otherArray->_values, (_count * sizeof(BOOL))) == 0); } - (NSUInteger)hash { // Follow NSArray's lead, and use the count as the hash. return _count; } - (NSString *)description { NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> { ", [self class], self]; for (NSUInteger i = 0, count = _count; i < count; ++i) { if (i == 0) { [result appendFormat:@"%d", _values[i]]; } else { [result appendFormat:@", %d", _values[i]]; } } [result appendFormat:@" }"]; return result; } - (void)enumerateValuesWithBlock:(void(NS_NOESCAPE ^)(BOOL value, NSUInteger idx, BOOL *stop))block { [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block]; } - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts usingBlock:(void(NS_NOESCAPE ^)(BOOL value, NSUInteger idx, BOOL *stop))block { // NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok). BOOL stop = NO; if ((opts & NSEnumerationReverse) == 0) { for (NSUInteger i = 0, count = _count; i < count; ++i) { block(_values[i], i, &stop); if (stop) break; } } else if (_count > 0) { for (NSUInteger i = _count; i > 0; --i) { block(_values[i - 1], (i - 1), &stop); if (stop) break; } } } - (BOOL)valueAtIndex:(NSUInteger)index { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } return _values[index]; } - (void)internalResizeToCapacity:(NSUInteger)newCapacity { _values = reallocf(_values, newCapacity * sizeof(BOOL)); if (_values == NULL) { _capacity = 0; _count = 0; [NSException raise:NSMallocException format:@"Failed to allocate %lu bytes", (unsigned long)(newCapacity * sizeof(BOOL))]; } _capacity = newCapacity; } - (void)addValue:(BOOL)value { [self addValues:&value count:1]; } - (void)addValues:(const BOOL [])values count:(NSUInteger)count { if (values == NULL || count == 0) return; NSUInteger initialCount = _count; NSUInteger newCount = initialCount + count; if (newCount > _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } _count = newCount; memcpy(&_values[initialCount], values, count * sizeof(BOOL)); if (_autocreator) { GPBAutocreatedArrayModified(_autocreator, self); } } - (void)insertValue:(BOOL)value atIndex:(NSUInteger)index { if (index >= _count + 1) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count + 1]; } NSUInteger initialCount = _count; NSUInteger newCount = initialCount + 1; if (newCount > _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } _count = newCount; if (index != initialCount) { memmove(&_values[index + 1], &_values[index], (initialCount - index) * sizeof(BOOL)); } _values[index] = value; if (_autocreator) { GPBAutocreatedArrayModified(_autocreator, self); } } - (void)replaceValueAtIndex:(NSUInteger)index withValue:(BOOL)value { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } _values[index] = value; } - (void)addValuesFromArray:(GPBBoolArray *)array { [self addValues:array->_values count:array->_count]; } - (void)removeValueAtIndex:(NSUInteger)index { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } NSUInteger newCount = _count - 1; if (index != newCount) { memmove(&_values[index], &_values[index + 1], (newCount - index) * sizeof(BOOL)); } _count = newCount; if ((newCount + (2 * kChunkSize)) < _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } } - (void)removeAll { _count = 0; if ((0 + (2 * kChunkSize)) < _capacity) { [self internalResizeToCapacity:CapacityFromCount(0)]; } } - (void)exchangeValueAtIndex:(NSUInteger)idx1 withValueAtIndex:(NSUInteger)idx2 { if (idx1 >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)idx1, (unsigned long)_count]; } if (idx2 >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)idx2, (unsigned long)_count]; } BOOL temp = _values[idx1]; _values[idx1] = _values[idx2]; _values[idx2] = temp; } @end //%PDDM-EXPAND-END (7 expansions) // clang-format on #pragma mark - Enum @implementation GPBEnumArray { @package GPBEnumValidationFunc _validationFunc; int32_t *_values; NSUInteger _count; NSUInteger _capacity; } @synthesize count = _count; @synthesize validationFunc = _validationFunc; + (instancetype)array { return [[[self alloc] initWithValidationFunction:NULL] autorelease]; } + (instancetype)arrayWithValidationFunction:(GPBEnumValidationFunc)func { return [[[self alloc] initWithValidationFunction:func] autorelease]; } + (instancetype)arrayWithValidationFunction:(GPBEnumValidationFunc)func rawValue:(int32_t)value { return [[[self alloc] initWithValidationFunction:func rawValues:&value count:1] autorelease]; } + (instancetype)arrayWithValueArray:(GPBEnumArray *)array { return [[(GPBEnumArray *)[self alloc] initWithValueArray:array] autorelease]; } + (instancetype)arrayWithValidationFunction:(GPBEnumValidationFunc)func capacity:(NSUInteger)count { return [[[self alloc] initWithValidationFunction:func capacity:count] autorelease]; } - (instancetype)init { return [self initWithValidationFunction:NULL]; } - (instancetype)initWithValueArray:(GPBEnumArray *)array { return [self initWithValidationFunction:array->_validationFunc rawValues:array->_values count:array->_count]; } - (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func { self = [super init]; if (self) { _validationFunc = (func != NULL ? func : ArrayDefault_IsValidValue); } return self; } - (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func rawValues:(const int32_t[])values count:(NSUInteger)count { self = [self initWithValidationFunction:func]; if (self) { if (count && values) { _values = reallocf(_values, count * sizeof(int32_t)); if (_values != NULL) { _capacity = count; memcpy(_values, values, count * sizeof(int32_t)); _count = count; } else { [self release]; [NSException raise:NSMallocException format:@"Failed to allocate %lu bytes", (unsigned long)(count * sizeof(int32_t))]; } } } return self; } - (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func capacity:(NSUInteger)count { self = [self initWithValidationFunction:func]; if (self && count) { [self internalResizeToCapacity:count]; } return self; } - (instancetype)copyWithZone:(NSZone *)zone { return [[GPBEnumArray allocWithZone:zone] initWithValidationFunction:_validationFunc rawValues:_values count:_count]; } // Disable clang-format for the macros. // clang-format off //%PDDM-EXPAND ARRAY_IMMUTABLE_CORE(Enum, int32_t, Raw, %d) // This block of code is generated, do not edit it directly. - (void)dealloc { NSAssert(!_autocreator, @"%@: Autocreator must be cleared before release, autocreator: %@", [self class], _autocreator); free(_values); [super dealloc]; } - (BOOL)isEqual:(id)other { if (self == other) { return YES; } if (![other isKindOfClass:[GPBEnumArray class]]) { return NO; } GPBEnumArray *otherArray = other; return (_count == otherArray->_count && memcmp(_values, otherArray->_values, (_count * sizeof(int32_t))) == 0); } - (NSUInteger)hash { // Follow NSArray's lead, and use the count as the hash. return _count; } - (NSString *)description { NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> { ", [self class], self]; for (NSUInteger i = 0, count = _count; i < count; ++i) { if (i == 0) { [result appendFormat:@"%d", _values[i]]; } else { [result appendFormat:@", %d", _values[i]]; } } [result appendFormat:@" }"]; return result; } - (void)enumerateRawValuesWithBlock:(void(NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block { [self enumerateRawValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block]; } - (void)enumerateRawValuesWithOptions:(NSEnumerationOptions)opts usingBlock:(void(NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block { // NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok). BOOL stop = NO; if ((opts & NSEnumerationReverse) == 0) { for (NSUInteger i = 0, count = _count; i < count; ++i) { block(_values[i], i, &stop); if (stop) break; } } else if (_count > 0) { for (NSUInteger i = _count; i > 0; --i) { block(_values[i - 1], (i - 1), &stop); if (stop) break; } } } //%PDDM-EXPAND-END ARRAY_IMMUTABLE_CORE(Enum, int32_t, Raw, %d) // clang-format on - (int32_t)valueAtIndex:(NSUInteger)index { // clang-format off //%PDDM-EXPAND VALIDATE_RANGE(index, _count) // This block of code is generated, do not edit it directly. if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } //%PDDM-EXPAND-END VALIDATE_RANGE(index, _count) // clang-format on int32_t result = _values[index]; if (!_validationFunc(result)) { result = kGPBUnrecognizedEnumeratorValue; } return result; } - (int32_t)rawValueAtIndex:(NSUInteger)index { // clang-format off //%PDDM-EXPAND VALIDATE_RANGE(index, _count) // This block of code is generated, do not edit it directly. if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } //%PDDM-EXPAND-END VALIDATE_RANGE(index, _count) // clang-format on return _values[index]; } - (void)enumerateValuesWithBlock:(void(NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop)) block { [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block]; } - (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts usingBlock:(void(NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop)) block { // NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok). BOOL stop = NO; GPBEnumValidationFunc func = _validationFunc; if ((opts & NSEnumerationReverse) == 0) { int32_t *scan = _values; int32_t *end = scan + _count; for (NSUInteger i = 0; scan < end; ++i, ++scan) { int32_t value = *scan; if (!func(value)) { value = kGPBUnrecognizedEnumeratorValue; } block(value, i, &stop); if (stop) break; } } else if (_count > 0) { int32_t *end = _values; int32_t *scan = end + (_count - 1); for (NSUInteger i = (_count - 1); scan >= end; --i, --scan) { int32_t value = *scan; if (!func(value)) { value = kGPBUnrecognizedEnumeratorValue; } block(value, i, &stop); if (stop) break; } } } // clang-format off //%PDDM-EXPAND ARRAY_MUTABLE_CORE(Enum, int32_t, Raw, %d) // This block of code is generated, do not edit it directly. - (void)internalResizeToCapacity:(NSUInteger)newCapacity { _values = reallocf(_values, newCapacity * sizeof(int32_t)); if (_values == NULL) { _capacity = 0; _count = 0; [NSException raise:NSMallocException format:@"Failed to allocate %lu bytes", (unsigned long)(newCapacity * sizeof(int32_t))]; } _capacity = newCapacity; } - (void)addRawValue:(int32_t)value { [self addRawValues:&value count:1]; } - (void)addRawValues:(const int32_t [])values count:(NSUInteger)count { if (values == NULL || count == 0) return; NSUInteger initialCount = _count; NSUInteger newCount = initialCount + count; if (newCount > _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } _count = newCount; memcpy(&_values[initialCount], values, count * sizeof(int32_t)); if (_autocreator) { GPBAutocreatedArrayModified(_autocreator, self); } } - (void)insertRawValue:(int32_t)value atIndex:(NSUInteger)index { if (index >= _count + 1) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count + 1]; } NSUInteger initialCount = _count; NSUInteger newCount = initialCount + 1; if (newCount > _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } _count = newCount; if (index != initialCount) { memmove(&_values[index + 1], &_values[index], (initialCount - index) * sizeof(int32_t)); } _values[index] = value; if (_autocreator) { GPBAutocreatedArrayModified(_autocreator, self); } } - (void)replaceValueAtIndex:(NSUInteger)index withRawValue:(int32_t)value { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } _values[index] = value; } - (void)addRawValuesFromArray:(GPBEnumArray *)array { [self addRawValues:array->_values count:array->_count]; } - (void)removeValueAtIndex:(NSUInteger)index { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } NSUInteger newCount = _count - 1; if (index != newCount) { memmove(&_values[index], &_values[index + 1], (newCount - index) * sizeof(int32_t)); } _count = newCount; if ((newCount + (2 * kChunkSize)) < _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } } - (void)removeAll { _count = 0; if ((0 + (2 * kChunkSize)) < _capacity) { [self internalResizeToCapacity:CapacityFromCount(0)]; } } - (void)exchangeValueAtIndex:(NSUInteger)idx1 withValueAtIndex:(NSUInteger)idx2 { if (idx1 >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)idx1, (unsigned long)_count]; } if (idx2 >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)idx2, (unsigned long)_count]; } int32_t temp = _values[idx1]; _values[idx1] = _values[idx2]; _values[idx2] = temp; } //%PDDM-EXPAND MUTATION_METHODS(Enum, int32_t, , EnumValidationList, EnumValidationOne) // This block of code is generated, do not edit it directly. - (void)addValue:(int32_t)value { [self addValues:&value count:1]; } - (void)addValues:(const int32_t [])values count:(NSUInteger)count { if (values == NULL || count == 0) return; GPBEnumValidationFunc func = _validationFunc; for (NSUInteger i = 0; i < count; ++i) { if (!func(values[i])) { [NSException raise:NSInvalidArgumentException format:@"%@: Attempt to set an unknown enum value (%d)", [self class], values[i]]; } } NSUInteger initialCount = _count; NSUInteger newCount = initialCount + count; if (newCount > _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } _count = newCount; memcpy(&_values[initialCount], values, count * sizeof(int32_t)); if (_autocreator) { GPBAutocreatedArrayModified(_autocreator, self); } } - (void)insertValue:(int32_t)value atIndex:(NSUInteger)index { if (index >= _count + 1) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count + 1]; } if (!_validationFunc(value)) { [NSException raise:NSInvalidArgumentException format:@"%@: Attempt to set an unknown enum value (%d)", [self class], value]; } NSUInteger initialCount = _count; NSUInteger newCount = initialCount + 1; if (newCount > _capacity) { [self internalResizeToCapacity:CapacityFromCount(newCount)]; } _count = newCount; if (index != initialCount) { memmove(&_values[index + 1], &_values[index], (initialCount - index) * sizeof(int32_t)); } _values[index] = value; if (_autocreator) { GPBAutocreatedArrayModified(_autocreator, self); } } - (void)replaceValueAtIndex:(NSUInteger)index withValue:(int32_t)value { if (index >= _count) { [NSException raise:NSRangeException format:@"Index (%lu) beyond bounds (%lu)", (unsigned long)index, (unsigned long)_count]; } if (!_validationFunc(value)) { [NSException raise:NSInvalidArgumentException format:@"%@: Attempt to set an unknown enum value (%d)", [self class], value]; } _values[index] = value; } //%PDDM-EXPAND-END (2 expansions) //%PDDM-DEFINE MUTATION_HOOK_EnumValidationList() //% GPBEnumValidationFunc func = _validationFunc; //% for (NSUInteger i = 0; i < count; ++i) { //% if (!func(values[i])) { //% [NSException raise:NSInvalidArgumentException //% format:@"%@: Attempt to set an unknown enum value (%d)", //% [self class], values[i]]; //% } //% } //% //%PDDM-DEFINE MUTATION_HOOK_EnumValidationOne() //% if (!_validationFunc(value)) { //% [NSException raise:NSInvalidArgumentException //% format:@"%@: Attempt to set an unknown enum value (%d)", //% [self class], value]; //% } //% // clang-format on @end #pragma mark - NSArray Subclass @implementation GPBAutocreatedArray { NSMutableArray *_array; } - (void)dealloc { NSAssert(!_autocreator, @"%@: Autocreator must be cleared before release, autocreator: %@", [self class], _autocreator); [_array release]; [super dealloc]; } #pragma mark Required NSArray overrides - (NSUInteger)count { return [_array count]; } - (id)objectAtIndex:(NSUInteger)idx { return [_array objectAtIndex:idx]; } #pragma mark Required NSMutableArray overrides // Only need to call GPBAutocreatedArrayModified() when adding things since // we only autocreate empty arrays. - (void)insertObject:(id)anObject atIndex:(NSUInteger)idx { if (_array == nil) { _array = [[NSMutableArray alloc] init]; } [_array insertObject:anObject atIndex:idx]; if (_autocreator) { GPBAutocreatedArrayModified(_autocreator, self); } } - (void)removeObject:(id)anObject { [_array removeObject:anObject]; } - (void)removeObjectAtIndex:(NSUInteger)idx { [_array removeObjectAtIndex:idx]; } - (void)addObject:(id)anObject { if (_array == nil) { _array = [[NSMutableArray alloc] init]; } [_array addObject:anObject]; if (_autocreator) { GPBAutocreatedArrayModified(_autocreator, self); } } - (void)removeLastObject { [_array removeLastObject]; } - (void)replaceObjectAtIndex:(NSUInteger)idx withObject:(id)anObject { [_array replaceObjectAtIndex:idx withObject:anObject]; } #pragma mark Extra things hooked - (id)copyWithZone:(NSZone *)zone { if (_array == nil) { return [[NSMutableArray allocWithZone:zone] init]; } return [_array copyWithZone:zone]; } - (id)mutableCopyWithZone:(NSZone *)zone { if (_array == nil) { return [[NSMutableArray allocWithZone:zone] init]; } return [_array mutableCopyWithZone:zone]; } - (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id __unsafe_unretained[])buffer count:(NSUInteger)len { return [_array countByEnumeratingWithState:state objects:buffer count:len]; } - (void)enumerateObjectsUsingBlock:(void(NS_NOESCAPE ^)(id obj, NSUInteger idx, BOOL *stop))block { [_array enumerateObjectsUsingBlock:block]; } - (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void(NS_NOESCAPE ^)(id obj, NSUInteger idx, BOOL *stop))block { [_array enumerateObjectsWithOptions:opts usingBlock:block]; } @end #pragma clang diagnostic pop