1*1b3f573fSAndroid Build Coastguard Worker// Protocol Buffers - Google's data interchange format 2*1b3f573fSAndroid Build Coastguard Worker// Copyright 2015 Google Inc. All rights reserved. 3*1b3f573fSAndroid Build Coastguard Worker// https://developers.google.com/protocol-buffers/ 4*1b3f573fSAndroid Build Coastguard Worker// 5*1b3f573fSAndroid Build Coastguard Worker// Redistribution and use in source and binary forms, with or without 6*1b3f573fSAndroid Build Coastguard Worker// modification, are permitted provided that the following conditions are 7*1b3f573fSAndroid Build Coastguard Worker// met: 8*1b3f573fSAndroid Build Coastguard Worker// 9*1b3f573fSAndroid Build Coastguard Worker// * Redistributions of source code must retain the above copyright 10*1b3f573fSAndroid Build Coastguard Worker// notice, this list of conditions and the following disclaimer. 11*1b3f573fSAndroid Build Coastguard Worker// * Redistributions in binary form must reproduce the above 12*1b3f573fSAndroid Build Coastguard Worker// copyright notice, this list of conditions and the following disclaimer 13*1b3f573fSAndroid Build Coastguard Worker// in the documentation and/or other materials provided with the 14*1b3f573fSAndroid Build Coastguard Worker// distribution. 15*1b3f573fSAndroid Build Coastguard Worker// * Neither the name of Google Inc. nor the names of its 16*1b3f573fSAndroid Build Coastguard Worker// contributors may be used to endorse or promote products derived from 17*1b3f573fSAndroid Build Coastguard Worker// this software without specific prior written permission. 18*1b3f573fSAndroid Build Coastguard Worker// 19*1b3f573fSAndroid Build Coastguard Worker// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20*1b3f573fSAndroid Build Coastguard Worker// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21*1b3f573fSAndroid Build Coastguard Worker// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22*1b3f573fSAndroid Build Coastguard Worker// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23*1b3f573fSAndroid Build Coastguard Worker// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24*1b3f573fSAndroid Build Coastguard Worker// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25*1b3f573fSAndroid Build Coastguard Worker// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26*1b3f573fSAndroid Build Coastguard Worker// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27*1b3f573fSAndroid Build Coastguard Worker// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28*1b3f573fSAndroid Build Coastguard Worker// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29*1b3f573fSAndroid Build Coastguard Worker// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30*1b3f573fSAndroid Build Coastguard Worker 31*1b3f573fSAndroid Build Coastguard Worker#import "GPBArray_PackagePrivate.h" 32*1b3f573fSAndroid Build Coastguard Worker 33*1b3f573fSAndroid Build Coastguard Worker#import "GPBMessage_PackagePrivate.h" 34*1b3f573fSAndroid Build Coastguard Worker 35*1b3f573fSAndroid Build Coastguard Worker// Direct access is use for speed, to avoid even internally declaring things 36*1b3f573fSAndroid Build Coastguard Worker// read/write, etc. The warning is enabled in the project to ensure code calling 37*1b3f573fSAndroid Build Coastguard Worker// protos can turn on -Wdirect-ivar-access without issues. 38*1b3f573fSAndroid Build Coastguard Worker#pragma clang diagnostic push 39*1b3f573fSAndroid Build Coastguard Worker#pragma clang diagnostic ignored "-Wdirect-ivar-access" 40*1b3f573fSAndroid Build Coastguard Worker 41*1b3f573fSAndroid Build Coastguard Worker// Mutable arrays use an internal buffer that can always hold a multiple of this elements. 42*1b3f573fSAndroid Build Coastguard Worker#define kChunkSize 16 43*1b3f573fSAndroid Build Coastguard Worker#define CapacityFromCount(x) (((x / kChunkSize) + 1) * kChunkSize) 44*1b3f573fSAndroid Build Coastguard Worker 45*1b3f573fSAndroid Build Coastguard Workerstatic BOOL ArrayDefault_IsValidValue(int32_t value) { 46*1b3f573fSAndroid Build Coastguard Worker // Anything but the bad value marker is allowed. 47*1b3f573fSAndroid Build Coastguard Worker return (value != kGPBUnrecognizedEnumeratorValue); 48*1b3f573fSAndroid Build Coastguard Worker} 49*1b3f573fSAndroid Build Coastguard Worker 50*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE VALIDATE_RANGE(INDEX, COUNT) 51*1b3f573fSAndroid Build Coastguard Worker//% if (INDEX >= COUNT) { 52*1b3f573fSAndroid Build Coastguard Worker//% [NSException raise:NSRangeException 53*1b3f573fSAndroid Build Coastguard Worker//% format:@"Index (%lu) beyond bounds (%lu)", 54*1b3f573fSAndroid Build Coastguard Worker//% (unsigned long)INDEX, (unsigned long)COUNT]; 55*1b3f573fSAndroid Build Coastguard Worker//% } 56*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE MAYBE_GROW_TO_SET_COUNT(NEW_COUNT) 57*1b3f573fSAndroid Build Coastguard Worker//% if (NEW_COUNT > _capacity) { 58*1b3f573fSAndroid Build Coastguard Worker//% [self internalResizeToCapacity:CapacityFromCount(NEW_COUNT)]; 59*1b3f573fSAndroid Build Coastguard Worker//% } 60*1b3f573fSAndroid Build Coastguard Worker//% _count = NEW_COUNT; 61*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE SET_COUNT_AND_MAYBE_SHRINK(NEW_COUNT) 62*1b3f573fSAndroid Build Coastguard Worker//% _count = NEW_COUNT; 63*1b3f573fSAndroid Build Coastguard Worker//% if ((NEW_COUNT + (2 * kChunkSize)) < _capacity) { 64*1b3f573fSAndroid Build Coastguard Worker//% [self internalResizeToCapacity:CapacityFromCount(NEW_COUNT)]; 65*1b3f573fSAndroid Build Coastguard Worker//% } 66*1b3f573fSAndroid Build Coastguard Worker 67*1b3f573fSAndroid Build Coastguard Worker// 68*1b3f573fSAndroid Build Coastguard Worker// Macros for the common basic cases. 69*1b3f573fSAndroid Build Coastguard Worker// 70*1b3f573fSAndroid Build Coastguard Worker 71*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE ARRAY_INTERFACE_SIMPLE(NAME, TYPE, FORMAT) 72*1b3f573fSAndroid Build Coastguard Worker//%#pragma mark - NAME 73*1b3f573fSAndroid Build Coastguard Worker//% 74*1b3f573fSAndroid Build Coastguard Worker//%@implementation GPB##NAME##Array { 75*1b3f573fSAndroid Build Coastguard Worker//% @package 76*1b3f573fSAndroid Build Coastguard Worker//% TYPE *_values; 77*1b3f573fSAndroid Build Coastguard Worker//% NSUInteger _count; 78*1b3f573fSAndroid Build Coastguard Worker//% NSUInteger _capacity; 79*1b3f573fSAndroid Build Coastguard Worker//%} 80*1b3f573fSAndroid Build Coastguard Worker//% 81*1b3f573fSAndroid Build Coastguard Worker//%@synthesize count = _count; 82*1b3f573fSAndroid Build Coastguard Worker//% 83*1b3f573fSAndroid Build Coastguard Worker//%+ (instancetype)array { 84*1b3f573fSAndroid Build Coastguard Worker//% return [[[self alloc] init] autorelease]; 85*1b3f573fSAndroid Build Coastguard Worker//%} 86*1b3f573fSAndroid Build Coastguard Worker//% 87*1b3f573fSAndroid Build Coastguard Worker//%+ (instancetype)arrayWithValue:(TYPE)value { 88*1b3f573fSAndroid Build Coastguard Worker//% // Cast is needed so the compiler knows what class we are invoking initWithValues: on to get 89*1b3f573fSAndroid Build Coastguard Worker//% // the type correct. 90*1b3f573fSAndroid Build Coastguard Worker//% return [[(GPB##NAME##Array*)[self alloc] initWithValues:&value count:1] autorelease]; 91*1b3f573fSAndroid Build Coastguard Worker//%} 92*1b3f573fSAndroid Build Coastguard Worker//% 93*1b3f573fSAndroid Build Coastguard Worker//%+ (instancetype)arrayWithValueArray:(GPB##NAME##Array *)array { 94*1b3f573fSAndroid Build Coastguard Worker//% return [[(GPB##NAME##Array*)[self alloc] initWithValueArray:array] autorelease]; 95*1b3f573fSAndroid Build Coastguard Worker//%} 96*1b3f573fSAndroid Build Coastguard Worker//% 97*1b3f573fSAndroid Build Coastguard Worker//%+ (instancetype)arrayWithCapacity:(NSUInteger)count { 98*1b3f573fSAndroid Build Coastguard Worker//% return [[[self alloc] initWithCapacity:count] autorelease]; 99*1b3f573fSAndroid Build Coastguard Worker//%} 100*1b3f573fSAndroid Build Coastguard Worker//% 101*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)init { 102*1b3f573fSAndroid Build Coastguard Worker//% self = [super init]; 103*1b3f573fSAndroid Build Coastguard Worker//% // No work needed; 104*1b3f573fSAndroid Build Coastguard Worker//% return self; 105*1b3f573fSAndroid Build Coastguard Worker//%} 106*1b3f573fSAndroid Build Coastguard Worker//% 107*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)initWithValueArray:(GPB##NAME##Array *)array { 108*1b3f573fSAndroid Build Coastguard Worker//% return [self initWithValues:array->_values count:array->_count]; 109*1b3f573fSAndroid Build Coastguard Worker//%} 110*1b3f573fSAndroid Build Coastguard Worker//% 111*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)initWithValues:(const TYPE [])values count:(NSUInteger)count { 112*1b3f573fSAndroid Build Coastguard Worker//% self = [self init]; 113*1b3f573fSAndroid Build Coastguard Worker//% if (self) { 114*1b3f573fSAndroid Build Coastguard Worker//% if (count && values) { 115*1b3f573fSAndroid Build Coastguard Worker//% _values = reallocf(_values, count * sizeof(TYPE)); 116*1b3f573fSAndroid Build Coastguard Worker//% if (_values != NULL) { 117*1b3f573fSAndroid Build Coastguard Worker//% _capacity = count; 118*1b3f573fSAndroid Build Coastguard Worker//% memcpy(_values, values, count * sizeof(TYPE)); 119*1b3f573fSAndroid Build Coastguard Worker//% _count = count; 120*1b3f573fSAndroid Build Coastguard Worker//% } else { 121*1b3f573fSAndroid Build Coastguard Worker//% [self release]; 122*1b3f573fSAndroid Build Coastguard Worker//% [NSException raise:NSMallocException 123*1b3f573fSAndroid Build Coastguard Worker//% format:@"Failed to allocate %lu bytes", 124*1b3f573fSAndroid Build Coastguard Worker//% (unsigned long)(count * sizeof(TYPE))]; 125*1b3f573fSAndroid Build Coastguard Worker//% } 126*1b3f573fSAndroid Build Coastguard Worker//% } 127*1b3f573fSAndroid Build Coastguard Worker//% } 128*1b3f573fSAndroid Build Coastguard Worker//% return self; 129*1b3f573fSAndroid Build Coastguard Worker//%} 130*1b3f573fSAndroid Build Coastguard Worker//% 131*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)initWithCapacity:(NSUInteger)count { 132*1b3f573fSAndroid Build Coastguard Worker//% self = [self initWithValues:NULL count:0]; 133*1b3f573fSAndroid Build Coastguard Worker//% if (self && count) { 134*1b3f573fSAndroid Build Coastguard Worker//% [self internalResizeToCapacity:count]; 135*1b3f573fSAndroid Build Coastguard Worker//% } 136*1b3f573fSAndroid Build Coastguard Worker//% return self; 137*1b3f573fSAndroid Build Coastguard Worker//%} 138*1b3f573fSAndroid Build Coastguard Worker//% 139*1b3f573fSAndroid Build Coastguard Worker//%- (instancetype)copyWithZone:(NSZone *)zone { 140*1b3f573fSAndroid Build Coastguard Worker//% return [[GPB##NAME##Array allocWithZone:zone] initWithValues:_values count:_count]; 141*1b3f573fSAndroid Build Coastguard Worker//%} 142*1b3f573fSAndroid Build Coastguard Worker//% 143*1b3f573fSAndroid Build Coastguard Worker//%ARRAY_IMMUTABLE_CORE(NAME, TYPE, , FORMAT) 144*1b3f573fSAndroid Build Coastguard Worker//% 145*1b3f573fSAndroid Build Coastguard Worker//%- (TYPE)valueAtIndex:(NSUInteger)index { 146*1b3f573fSAndroid Build Coastguard Worker//%VALIDATE_RANGE(index, _count) 147*1b3f573fSAndroid Build Coastguard Worker//% return _values[index]; 148*1b3f573fSAndroid Build Coastguard Worker//%} 149*1b3f573fSAndroid Build Coastguard Worker//% 150*1b3f573fSAndroid Build Coastguard Worker//%ARRAY_MUTABLE_CORE(NAME, TYPE, , FORMAT) 151*1b3f573fSAndroid Build Coastguard Worker//%@end 152*1b3f573fSAndroid Build Coastguard Worker//% 153*1b3f573fSAndroid Build Coastguard Worker 154*1b3f573fSAndroid Build Coastguard Worker// 155*1b3f573fSAndroid Build Coastguard Worker// Some core macros used for both the simple types and Enums. 156*1b3f573fSAndroid Build Coastguard Worker// 157*1b3f573fSAndroid Build Coastguard Worker 158*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE ARRAY_IMMUTABLE_CORE(NAME, TYPE, ACCESSOR_NAME, FORMAT) 159*1b3f573fSAndroid Build Coastguard Worker//%- (void)dealloc { 160*1b3f573fSAndroid Build Coastguard Worker//% NSAssert(!_autocreator, 161*1b3f573fSAndroid Build Coastguard Worker//% @"%@: Autocreator must be cleared before release, autocreator: %@", 162*1b3f573fSAndroid Build Coastguard Worker//% [self class], _autocreator); 163*1b3f573fSAndroid Build Coastguard Worker//% free(_values); 164*1b3f573fSAndroid Build Coastguard Worker//% [super dealloc]; 165*1b3f573fSAndroid Build Coastguard Worker//%} 166*1b3f573fSAndroid Build Coastguard Worker//% 167*1b3f573fSAndroid Build Coastguard Worker//%- (BOOL)isEqual:(id)other { 168*1b3f573fSAndroid Build Coastguard Worker//% if (self == other) { 169*1b3f573fSAndroid Build Coastguard Worker//% return YES; 170*1b3f573fSAndroid Build Coastguard Worker//% } 171*1b3f573fSAndroid Build Coastguard Worker//% if (![other isKindOfClass:[GPB##NAME##Array class]]) { 172*1b3f573fSAndroid Build Coastguard Worker//% return NO; 173*1b3f573fSAndroid Build Coastguard Worker//% } 174*1b3f573fSAndroid Build Coastguard Worker//% GPB##NAME##Array *otherArray = other; 175*1b3f573fSAndroid Build Coastguard Worker//% return (_count == otherArray->_count 176*1b3f573fSAndroid Build Coastguard Worker//% && memcmp(_values, otherArray->_values, (_count * sizeof(TYPE))) == 0); 177*1b3f573fSAndroid Build Coastguard Worker//%} 178*1b3f573fSAndroid Build Coastguard Worker//% 179*1b3f573fSAndroid Build Coastguard Worker//%- (NSUInteger)hash { 180*1b3f573fSAndroid Build Coastguard Worker//% // Follow NSArray's lead, and use the count as the hash. 181*1b3f573fSAndroid Build Coastguard Worker//% return _count; 182*1b3f573fSAndroid Build Coastguard Worker//%} 183*1b3f573fSAndroid Build Coastguard Worker//% 184*1b3f573fSAndroid Build Coastguard Worker//%- (NSString *)description { 185*1b3f573fSAndroid Build Coastguard Worker//% NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> { ", [self class], self]; 186*1b3f573fSAndroid Build Coastguard Worker//% for (NSUInteger i = 0, count = _count; i < count; ++i) { 187*1b3f573fSAndroid Build Coastguard Worker//% if (i == 0) { 188*1b3f573fSAndroid Build Coastguard Worker//% [result appendFormat:@"##FORMAT##", _values[i]]; 189*1b3f573fSAndroid Build Coastguard Worker//% } else { 190*1b3f573fSAndroid Build Coastguard Worker//% [result appendFormat:@", ##FORMAT##", _values[i]]; 191*1b3f573fSAndroid Build Coastguard Worker//% } 192*1b3f573fSAndroid Build Coastguard Worker//% } 193*1b3f573fSAndroid Build Coastguard Worker//% [result appendFormat:@" }"]; 194*1b3f573fSAndroid Build Coastguard Worker//% return result; 195*1b3f573fSAndroid Build Coastguard Worker//%} 196*1b3f573fSAndroid Build Coastguard Worker//% 197*1b3f573fSAndroid Build Coastguard Worker//%- (void)enumerate##ACCESSOR_NAME##ValuesWithBlock:(void (NS_NOESCAPE ^)(TYPE value, NSUInteger idx, BOOL *stop))block { 198*1b3f573fSAndroid Build Coastguard Worker//% [self enumerate##ACCESSOR_NAME##ValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block]; 199*1b3f573fSAndroid Build Coastguard Worker//%} 200*1b3f573fSAndroid Build Coastguard Worker//% 201*1b3f573fSAndroid Build Coastguard Worker//%- (void)enumerate##ACCESSOR_NAME##ValuesWithOptions:(NSEnumerationOptions)opts 202*1b3f573fSAndroid Build Coastguard Worker//% ACCESSOR_NAME$S usingBlock:(void (NS_NOESCAPE ^)(TYPE value, NSUInteger idx, BOOL *stop))block { 203*1b3f573fSAndroid Build Coastguard Worker//% // NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok). 204*1b3f573fSAndroid Build Coastguard Worker//% BOOL stop = NO; 205*1b3f573fSAndroid Build Coastguard Worker//% if ((opts & NSEnumerationReverse) == 0) { 206*1b3f573fSAndroid Build Coastguard Worker//% for (NSUInteger i = 0, count = _count; i < count; ++i) { 207*1b3f573fSAndroid Build Coastguard Worker//% block(_values[i], i, &stop); 208*1b3f573fSAndroid Build Coastguard Worker//% if (stop) break; 209*1b3f573fSAndroid Build Coastguard Worker//% } 210*1b3f573fSAndroid Build Coastguard Worker//% } else if (_count > 0) { 211*1b3f573fSAndroid Build Coastguard Worker//% for (NSUInteger i = _count; i > 0; --i) { 212*1b3f573fSAndroid Build Coastguard Worker//% block(_values[i - 1], (i - 1), &stop); 213*1b3f573fSAndroid Build Coastguard Worker//% if (stop) break; 214*1b3f573fSAndroid Build Coastguard Worker//% } 215*1b3f573fSAndroid Build Coastguard Worker//% } 216*1b3f573fSAndroid Build Coastguard Worker//%} 217*1b3f573fSAndroid Build Coastguard Worker 218*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE MUTATION_HOOK_None() 219*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE MUTATION_METHODS(NAME, TYPE, ACCESSOR_NAME, HOOK_1, HOOK_2) 220*1b3f573fSAndroid Build Coastguard Worker//%- (void)add##ACCESSOR_NAME##Value:(TYPE)value { 221*1b3f573fSAndroid Build Coastguard Worker//% [self add##ACCESSOR_NAME##Values:&value count:1]; 222*1b3f573fSAndroid Build Coastguard Worker//%} 223*1b3f573fSAndroid Build Coastguard Worker//% 224*1b3f573fSAndroid Build Coastguard Worker//%- (void)add##ACCESSOR_NAME##Values:(const TYPE [])values count:(NSUInteger)count { 225*1b3f573fSAndroid Build Coastguard Worker//% if (values == NULL || count == 0) return; 226*1b3f573fSAndroid Build Coastguard Worker//%MUTATION_HOOK_##HOOK_1() NSUInteger initialCount = _count; 227*1b3f573fSAndroid Build Coastguard Worker//% NSUInteger newCount = initialCount + count; 228*1b3f573fSAndroid Build Coastguard Worker//%MAYBE_GROW_TO_SET_COUNT(newCount) 229*1b3f573fSAndroid Build Coastguard Worker//% memcpy(&_values[initialCount], values, count * sizeof(TYPE)); 230*1b3f573fSAndroid Build Coastguard Worker//% if (_autocreator) { 231*1b3f573fSAndroid Build Coastguard Worker//% GPBAutocreatedArrayModified(_autocreator, self); 232*1b3f573fSAndroid Build Coastguard Worker//% } 233*1b3f573fSAndroid Build Coastguard Worker//%} 234*1b3f573fSAndroid Build Coastguard Worker//% 235*1b3f573fSAndroid Build Coastguard Worker//%- (void)insert##ACCESSOR_NAME##Value:(TYPE)value atIndex:(NSUInteger)index { 236*1b3f573fSAndroid Build Coastguard Worker//%VALIDATE_RANGE(index, _count + 1) 237*1b3f573fSAndroid Build Coastguard Worker//%MUTATION_HOOK_##HOOK_2() NSUInteger initialCount = _count; 238*1b3f573fSAndroid Build Coastguard Worker//% NSUInteger newCount = initialCount + 1; 239*1b3f573fSAndroid Build Coastguard Worker//%MAYBE_GROW_TO_SET_COUNT(newCount) 240*1b3f573fSAndroid Build Coastguard Worker//% if (index != initialCount) { 241*1b3f573fSAndroid Build Coastguard Worker//% memmove(&_values[index + 1], &_values[index], (initialCount - index) * sizeof(TYPE)); 242*1b3f573fSAndroid Build Coastguard Worker//% } 243*1b3f573fSAndroid Build Coastguard Worker//% _values[index] = value; 244*1b3f573fSAndroid Build Coastguard Worker//% if (_autocreator) { 245*1b3f573fSAndroid Build Coastguard Worker//% GPBAutocreatedArrayModified(_autocreator, self); 246*1b3f573fSAndroid Build Coastguard Worker//% } 247*1b3f573fSAndroid Build Coastguard Worker//%} 248*1b3f573fSAndroid Build Coastguard Worker//% 249*1b3f573fSAndroid Build Coastguard Worker//%- (void)replaceValueAtIndex:(NSUInteger)index with##ACCESSOR_NAME##Value:(TYPE)value { 250*1b3f573fSAndroid Build Coastguard Worker//%VALIDATE_RANGE(index, _count) 251*1b3f573fSAndroid Build Coastguard Worker//%MUTATION_HOOK_##HOOK_2() _values[index] = value; 252*1b3f573fSAndroid Build Coastguard Worker//%} 253*1b3f573fSAndroid Build Coastguard Worker 254*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE ARRAY_MUTABLE_CORE(NAME, TYPE, ACCESSOR_NAME, FORMAT) 255*1b3f573fSAndroid Build Coastguard Worker//%- (void)internalResizeToCapacity:(NSUInteger)newCapacity { 256*1b3f573fSAndroid Build Coastguard Worker//% _values = reallocf(_values, newCapacity * sizeof(TYPE)); 257*1b3f573fSAndroid Build Coastguard Worker//% if (_values == NULL) { 258*1b3f573fSAndroid Build Coastguard Worker//% _capacity = 0; 259*1b3f573fSAndroid Build Coastguard Worker//% _count = 0; 260*1b3f573fSAndroid Build Coastguard Worker//% [NSException raise:NSMallocException 261*1b3f573fSAndroid Build Coastguard Worker//% format:@"Failed to allocate %lu bytes", 262*1b3f573fSAndroid Build Coastguard Worker//% (unsigned long)(newCapacity * sizeof(TYPE))]; 263*1b3f573fSAndroid Build Coastguard Worker//% } 264*1b3f573fSAndroid Build Coastguard Worker//% _capacity = newCapacity; 265*1b3f573fSAndroid Build Coastguard Worker//%} 266*1b3f573fSAndroid Build Coastguard Worker//% 267*1b3f573fSAndroid Build Coastguard Worker//%MUTATION_METHODS(NAME, TYPE, ACCESSOR_NAME, None, None) 268*1b3f573fSAndroid Build Coastguard Worker//% 269*1b3f573fSAndroid Build Coastguard Worker//%- (void)add##ACCESSOR_NAME##ValuesFromArray:(GPB##NAME##Array *)array { 270*1b3f573fSAndroid Build Coastguard Worker//% [self add##ACCESSOR_NAME##Values:array->_values count:array->_count]; 271*1b3f573fSAndroid Build Coastguard Worker//%} 272*1b3f573fSAndroid Build Coastguard Worker//% 273*1b3f573fSAndroid Build Coastguard Worker//%- (void)removeValueAtIndex:(NSUInteger)index { 274*1b3f573fSAndroid Build Coastguard Worker//%VALIDATE_RANGE(index, _count) 275*1b3f573fSAndroid Build Coastguard Worker//% NSUInteger newCount = _count - 1; 276*1b3f573fSAndroid Build Coastguard Worker//% if (index != newCount) { 277*1b3f573fSAndroid Build Coastguard Worker//% memmove(&_values[index], &_values[index + 1], (newCount - index) * sizeof(TYPE)); 278*1b3f573fSAndroid Build Coastguard Worker//% } 279*1b3f573fSAndroid Build Coastguard Worker//%SET_COUNT_AND_MAYBE_SHRINK(newCount) 280*1b3f573fSAndroid Build Coastguard Worker//%} 281*1b3f573fSAndroid Build Coastguard Worker//% 282*1b3f573fSAndroid Build Coastguard Worker//%- (void)removeAll { 283*1b3f573fSAndroid Build Coastguard Worker//%SET_COUNT_AND_MAYBE_SHRINK(0) 284*1b3f573fSAndroid Build Coastguard Worker//%} 285*1b3f573fSAndroid Build Coastguard Worker//% 286*1b3f573fSAndroid Build Coastguard Worker//%- (void)exchangeValueAtIndex:(NSUInteger)idx1 287*1b3f573fSAndroid Build Coastguard Worker//% withValueAtIndex:(NSUInteger)idx2 { 288*1b3f573fSAndroid Build Coastguard Worker//%VALIDATE_RANGE(idx1, _count) 289*1b3f573fSAndroid Build Coastguard Worker//%VALIDATE_RANGE(idx2, _count) 290*1b3f573fSAndroid Build Coastguard Worker//% TYPE temp = _values[idx1]; 291*1b3f573fSAndroid Build Coastguard Worker//% _values[idx1] = _values[idx2]; 292*1b3f573fSAndroid Build Coastguard Worker//% _values[idx2] = temp; 293*1b3f573fSAndroid Build Coastguard Worker//%} 294*1b3f573fSAndroid Build Coastguard Worker//% 295*1b3f573fSAndroid Build Coastguard Worker 296*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND ARRAY_INTERFACE_SIMPLE(Int32, int32_t, %d) 297*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 298*1b3f573fSAndroid Build Coastguard Worker// clang-format off 299*1b3f573fSAndroid Build Coastguard Worker 300*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Int32 301*1b3f573fSAndroid Build Coastguard Worker 302*1b3f573fSAndroid Build Coastguard Worker@implementation GPBInt32Array { 303*1b3f573fSAndroid Build Coastguard Worker @package 304*1b3f573fSAndroid Build Coastguard Worker int32_t *_values; 305*1b3f573fSAndroid Build Coastguard Worker NSUInteger _count; 306*1b3f573fSAndroid Build Coastguard Worker NSUInteger _capacity; 307*1b3f573fSAndroid Build Coastguard Worker} 308*1b3f573fSAndroid Build Coastguard Worker 309*1b3f573fSAndroid Build Coastguard Worker@synthesize count = _count; 310*1b3f573fSAndroid Build Coastguard Worker 311*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)array { 312*1b3f573fSAndroid Build Coastguard Worker return [[[self alloc] init] autorelease]; 313*1b3f573fSAndroid Build Coastguard Worker} 314*1b3f573fSAndroid Build Coastguard Worker 315*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithValue:(int32_t)value { 316*1b3f573fSAndroid Build Coastguard Worker // Cast is needed so the compiler knows what class we are invoking initWithValues: on to get 317*1b3f573fSAndroid Build Coastguard Worker // the type correct. 318*1b3f573fSAndroid Build Coastguard Worker return [[(GPBInt32Array*)[self alloc] initWithValues:&value count:1] autorelease]; 319*1b3f573fSAndroid Build Coastguard Worker} 320*1b3f573fSAndroid Build Coastguard Worker 321*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithValueArray:(GPBInt32Array *)array { 322*1b3f573fSAndroid Build Coastguard Worker return [[(GPBInt32Array*)[self alloc] initWithValueArray:array] autorelease]; 323*1b3f573fSAndroid Build Coastguard Worker} 324*1b3f573fSAndroid Build Coastguard Worker 325*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithCapacity:(NSUInteger)count { 326*1b3f573fSAndroid Build Coastguard Worker return [[[self alloc] initWithCapacity:count] autorelease]; 327*1b3f573fSAndroid Build Coastguard Worker} 328*1b3f573fSAndroid Build Coastguard Worker 329*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init { 330*1b3f573fSAndroid Build Coastguard Worker self = [super init]; 331*1b3f573fSAndroid Build Coastguard Worker // No work needed; 332*1b3f573fSAndroid Build Coastguard Worker return self; 333*1b3f573fSAndroid Build Coastguard Worker} 334*1b3f573fSAndroid Build Coastguard Worker 335*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValueArray:(GPBInt32Array *)array { 336*1b3f573fSAndroid Build Coastguard Worker return [self initWithValues:array->_values count:array->_count]; 337*1b3f573fSAndroid Build Coastguard Worker} 338*1b3f573fSAndroid Build Coastguard Worker 339*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValues:(const int32_t [])values count:(NSUInteger)count { 340*1b3f573fSAndroid Build Coastguard Worker self = [self init]; 341*1b3f573fSAndroid Build Coastguard Worker if (self) { 342*1b3f573fSAndroid Build Coastguard Worker if (count && values) { 343*1b3f573fSAndroid Build Coastguard Worker _values = reallocf(_values, count * sizeof(int32_t)); 344*1b3f573fSAndroid Build Coastguard Worker if (_values != NULL) { 345*1b3f573fSAndroid Build Coastguard Worker _capacity = count; 346*1b3f573fSAndroid Build Coastguard Worker memcpy(_values, values, count * sizeof(int32_t)); 347*1b3f573fSAndroid Build Coastguard Worker _count = count; 348*1b3f573fSAndroid Build Coastguard Worker } else { 349*1b3f573fSAndroid Build Coastguard Worker [self release]; 350*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSMallocException 351*1b3f573fSAndroid Build Coastguard Worker format:@"Failed to allocate %lu bytes", 352*1b3f573fSAndroid Build Coastguard Worker (unsigned long)(count * sizeof(int32_t))]; 353*1b3f573fSAndroid Build Coastguard Worker } 354*1b3f573fSAndroid Build Coastguard Worker } 355*1b3f573fSAndroid Build Coastguard Worker } 356*1b3f573fSAndroid Build Coastguard Worker return self; 357*1b3f573fSAndroid Build Coastguard Worker} 358*1b3f573fSAndroid Build Coastguard Worker 359*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)count { 360*1b3f573fSAndroid Build Coastguard Worker self = [self initWithValues:NULL count:0]; 361*1b3f573fSAndroid Build Coastguard Worker if (self && count) { 362*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:count]; 363*1b3f573fSAndroid Build Coastguard Worker } 364*1b3f573fSAndroid Build Coastguard Worker return self; 365*1b3f573fSAndroid Build Coastguard Worker} 366*1b3f573fSAndroid Build Coastguard Worker 367*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 368*1b3f573fSAndroid Build Coastguard Worker return [[GPBInt32Array allocWithZone:zone] initWithValues:_values count:_count]; 369*1b3f573fSAndroid Build Coastguard Worker} 370*1b3f573fSAndroid Build Coastguard Worker 371*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc { 372*1b3f573fSAndroid Build Coastguard Worker NSAssert(!_autocreator, 373*1b3f573fSAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 374*1b3f573fSAndroid Build Coastguard Worker [self class], _autocreator); 375*1b3f573fSAndroid Build Coastguard Worker free(_values); 376*1b3f573fSAndroid Build Coastguard Worker [super dealloc]; 377*1b3f573fSAndroid Build Coastguard Worker} 378*1b3f573fSAndroid Build Coastguard Worker 379*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 380*1b3f573fSAndroid Build Coastguard Worker if (self == other) { 381*1b3f573fSAndroid Build Coastguard Worker return YES; 382*1b3f573fSAndroid Build Coastguard Worker } 383*1b3f573fSAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBInt32Array class]]) { 384*1b3f573fSAndroid Build Coastguard Worker return NO; 385*1b3f573fSAndroid Build Coastguard Worker } 386*1b3f573fSAndroid Build Coastguard Worker GPBInt32Array *otherArray = other; 387*1b3f573fSAndroid Build Coastguard Worker return (_count == otherArray->_count 388*1b3f573fSAndroid Build Coastguard Worker && memcmp(_values, otherArray->_values, (_count * sizeof(int32_t))) == 0); 389*1b3f573fSAndroid Build Coastguard Worker} 390*1b3f573fSAndroid Build Coastguard Worker 391*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash { 392*1b3f573fSAndroid Build Coastguard Worker // Follow NSArray's lead, and use the count as the hash. 393*1b3f573fSAndroid Build Coastguard Worker return _count; 394*1b3f573fSAndroid Build Coastguard Worker} 395*1b3f573fSAndroid Build Coastguard Worker 396*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description { 397*1b3f573fSAndroid Build Coastguard Worker NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> { ", [self class], self]; 398*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = 0, count = _count; i < count; ++i) { 399*1b3f573fSAndroid Build Coastguard Worker if (i == 0) { 400*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@"%d", _values[i]]; 401*1b3f573fSAndroid Build Coastguard Worker } else { 402*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@", %d", _values[i]]; 403*1b3f573fSAndroid Build Coastguard Worker } 404*1b3f573fSAndroid Build Coastguard Worker } 405*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@" }"]; 406*1b3f573fSAndroid Build Coastguard Worker return result; 407*1b3f573fSAndroid Build Coastguard Worker} 408*1b3f573fSAndroid Build Coastguard Worker 409*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block { 410*1b3f573fSAndroid Build Coastguard Worker [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block]; 411*1b3f573fSAndroid Build Coastguard Worker} 412*1b3f573fSAndroid Build Coastguard Worker 413*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts 414*1b3f573fSAndroid Build Coastguard Worker usingBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block { 415*1b3f573fSAndroid Build Coastguard Worker // NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok). 416*1b3f573fSAndroid Build Coastguard Worker BOOL stop = NO; 417*1b3f573fSAndroid Build Coastguard Worker if ((opts & NSEnumerationReverse) == 0) { 418*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = 0, count = _count; i < count; ++i) { 419*1b3f573fSAndroid Build Coastguard Worker block(_values[i], i, &stop); 420*1b3f573fSAndroid Build Coastguard Worker if (stop) break; 421*1b3f573fSAndroid Build Coastguard Worker } 422*1b3f573fSAndroid Build Coastguard Worker } else if (_count > 0) { 423*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = _count; i > 0; --i) { 424*1b3f573fSAndroid Build Coastguard Worker block(_values[i - 1], (i - 1), &stop); 425*1b3f573fSAndroid Build Coastguard Worker if (stop) break; 426*1b3f573fSAndroid Build Coastguard Worker } 427*1b3f573fSAndroid Build Coastguard Worker } 428*1b3f573fSAndroid Build Coastguard Worker} 429*1b3f573fSAndroid Build Coastguard Worker 430*1b3f573fSAndroid Build Coastguard Worker- (int32_t)valueAtIndex:(NSUInteger)index { 431*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 432*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 433*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 434*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 435*1b3f573fSAndroid Build Coastguard Worker } 436*1b3f573fSAndroid Build Coastguard Worker return _values[index]; 437*1b3f573fSAndroid Build Coastguard Worker} 438*1b3f573fSAndroid Build Coastguard Worker 439*1b3f573fSAndroid Build Coastguard Worker- (void)internalResizeToCapacity:(NSUInteger)newCapacity { 440*1b3f573fSAndroid Build Coastguard Worker _values = reallocf(_values, newCapacity * sizeof(int32_t)); 441*1b3f573fSAndroid Build Coastguard Worker if (_values == NULL) { 442*1b3f573fSAndroid Build Coastguard Worker _capacity = 0; 443*1b3f573fSAndroid Build Coastguard Worker _count = 0; 444*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSMallocException 445*1b3f573fSAndroid Build Coastguard Worker format:@"Failed to allocate %lu bytes", 446*1b3f573fSAndroid Build Coastguard Worker (unsigned long)(newCapacity * sizeof(int32_t))]; 447*1b3f573fSAndroid Build Coastguard Worker } 448*1b3f573fSAndroid Build Coastguard Worker _capacity = newCapacity; 449*1b3f573fSAndroid Build Coastguard Worker} 450*1b3f573fSAndroid Build Coastguard Worker 451*1b3f573fSAndroid Build Coastguard Worker- (void)addValue:(int32_t)value { 452*1b3f573fSAndroid Build Coastguard Worker [self addValues:&value count:1]; 453*1b3f573fSAndroid Build Coastguard Worker} 454*1b3f573fSAndroid Build Coastguard Worker 455*1b3f573fSAndroid Build Coastguard Worker- (void)addValues:(const int32_t [])values count:(NSUInteger)count { 456*1b3f573fSAndroid Build Coastguard Worker if (values == NULL || count == 0) return; 457*1b3f573fSAndroid Build Coastguard Worker NSUInteger initialCount = _count; 458*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = initialCount + count; 459*1b3f573fSAndroid Build Coastguard Worker if (newCount > _capacity) { 460*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 461*1b3f573fSAndroid Build Coastguard Worker } 462*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 463*1b3f573fSAndroid Build Coastguard Worker memcpy(&_values[initialCount], values, count * sizeof(int32_t)); 464*1b3f573fSAndroid Build Coastguard Worker if (_autocreator) { 465*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedArrayModified(_autocreator, self); 466*1b3f573fSAndroid Build Coastguard Worker } 467*1b3f573fSAndroid Build Coastguard Worker} 468*1b3f573fSAndroid Build Coastguard Worker 469*1b3f573fSAndroid Build Coastguard Worker- (void)insertValue:(int32_t)value atIndex:(NSUInteger)index { 470*1b3f573fSAndroid Build Coastguard Worker if (index >= _count + 1) { 471*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 472*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 473*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count + 1]; 474*1b3f573fSAndroid Build Coastguard Worker } 475*1b3f573fSAndroid Build Coastguard Worker NSUInteger initialCount = _count; 476*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = initialCount + 1; 477*1b3f573fSAndroid Build Coastguard Worker if (newCount > _capacity) { 478*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 479*1b3f573fSAndroid Build Coastguard Worker } 480*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 481*1b3f573fSAndroid Build Coastguard Worker if (index != initialCount) { 482*1b3f573fSAndroid Build Coastguard Worker memmove(&_values[index + 1], &_values[index], (initialCount - index) * sizeof(int32_t)); 483*1b3f573fSAndroid Build Coastguard Worker } 484*1b3f573fSAndroid Build Coastguard Worker _values[index] = value; 485*1b3f573fSAndroid Build Coastguard Worker if (_autocreator) { 486*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedArrayModified(_autocreator, self); 487*1b3f573fSAndroid Build Coastguard Worker } 488*1b3f573fSAndroid Build Coastguard Worker} 489*1b3f573fSAndroid Build Coastguard Worker 490*1b3f573fSAndroid Build Coastguard Worker- (void)replaceValueAtIndex:(NSUInteger)index withValue:(int32_t)value { 491*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 492*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 493*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 494*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 495*1b3f573fSAndroid Build Coastguard Worker } 496*1b3f573fSAndroid Build Coastguard Worker _values[index] = value; 497*1b3f573fSAndroid Build Coastguard Worker} 498*1b3f573fSAndroid Build Coastguard Worker 499*1b3f573fSAndroid Build Coastguard Worker- (void)addValuesFromArray:(GPBInt32Array *)array { 500*1b3f573fSAndroid Build Coastguard Worker [self addValues:array->_values count:array->_count]; 501*1b3f573fSAndroid Build Coastguard Worker} 502*1b3f573fSAndroid Build Coastguard Worker 503*1b3f573fSAndroid Build Coastguard Worker- (void)removeValueAtIndex:(NSUInteger)index { 504*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 505*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 506*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 507*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 508*1b3f573fSAndroid Build Coastguard Worker } 509*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = _count - 1; 510*1b3f573fSAndroid Build Coastguard Worker if (index != newCount) { 511*1b3f573fSAndroid Build Coastguard Worker memmove(&_values[index], &_values[index + 1], (newCount - index) * sizeof(int32_t)); 512*1b3f573fSAndroid Build Coastguard Worker } 513*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 514*1b3f573fSAndroid Build Coastguard Worker if ((newCount + (2 * kChunkSize)) < _capacity) { 515*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 516*1b3f573fSAndroid Build Coastguard Worker } 517*1b3f573fSAndroid Build Coastguard Worker} 518*1b3f573fSAndroid Build Coastguard Worker 519*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll { 520*1b3f573fSAndroid Build Coastguard Worker _count = 0; 521*1b3f573fSAndroid Build Coastguard Worker if ((0 + (2 * kChunkSize)) < _capacity) { 522*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(0)]; 523*1b3f573fSAndroid Build Coastguard Worker } 524*1b3f573fSAndroid Build Coastguard Worker} 525*1b3f573fSAndroid Build Coastguard Worker 526*1b3f573fSAndroid Build Coastguard Worker- (void)exchangeValueAtIndex:(NSUInteger)idx1 527*1b3f573fSAndroid Build Coastguard Worker withValueAtIndex:(NSUInteger)idx2 { 528*1b3f573fSAndroid Build Coastguard Worker if (idx1 >= _count) { 529*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 530*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 531*1b3f573fSAndroid Build Coastguard Worker (unsigned long)idx1, (unsigned long)_count]; 532*1b3f573fSAndroid Build Coastguard Worker } 533*1b3f573fSAndroid Build Coastguard Worker if (idx2 >= _count) { 534*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 535*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 536*1b3f573fSAndroid Build Coastguard Worker (unsigned long)idx2, (unsigned long)_count]; 537*1b3f573fSAndroid Build Coastguard Worker } 538*1b3f573fSAndroid Build Coastguard Worker int32_t temp = _values[idx1]; 539*1b3f573fSAndroid Build Coastguard Worker _values[idx1] = _values[idx2]; 540*1b3f573fSAndroid Build Coastguard Worker _values[idx2] = temp; 541*1b3f573fSAndroid Build Coastguard Worker} 542*1b3f573fSAndroid Build Coastguard Worker 543*1b3f573fSAndroid Build Coastguard Worker@end 544*1b3f573fSAndroid Build Coastguard Worker 545*1b3f573fSAndroid Build Coastguard Worker// clang-format on 546*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND ARRAY_INTERFACE_SIMPLE(UInt32, uint32_t, %u) 547*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 548*1b3f573fSAndroid Build Coastguard Worker// clang-format off 549*1b3f573fSAndroid Build Coastguard Worker 550*1b3f573fSAndroid Build Coastguard Worker#pragma mark - UInt32 551*1b3f573fSAndroid Build Coastguard Worker 552*1b3f573fSAndroid Build Coastguard Worker@implementation GPBUInt32Array { 553*1b3f573fSAndroid Build Coastguard Worker @package 554*1b3f573fSAndroid Build Coastguard Worker uint32_t *_values; 555*1b3f573fSAndroid Build Coastguard Worker NSUInteger _count; 556*1b3f573fSAndroid Build Coastguard Worker NSUInteger _capacity; 557*1b3f573fSAndroid Build Coastguard Worker} 558*1b3f573fSAndroid Build Coastguard Worker 559*1b3f573fSAndroid Build Coastguard Worker@synthesize count = _count; 560*1b3f573fSAndroid Build Coastguard Worker 561*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)array { 562*1b3f573fSAndroid Build Coastguard Worker return [[[self alloc] init] autorelease]; 563*1b3f573fSAndroid Build Coastguard Worker} 564*1b3f573fSAndroid Build Coastguard Worker 565*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithValue:(uint32_t)value { 566*1b3f573fSAndroid Build Coastguard Worker // Cast is needed so the compiler knows what class we are invoking initWithValues: on to get 567*1b3f573fSAndroid Build Coastguard Worker // the type correct. 568*1b3f573fSAndroid Build Coastguard Worker return [[(GPBUInt32Array*)[self alloc] initWithValues:&value count:1] autorelease]; 569*1b3f573fSAndroid Build Coastguard Worker} 570*1b3f573fSAndroid Build Coastguard Worker 571*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithValueArray:(GPBUInt32Array *)array { 572*1b3f573fSAndroid Build Coastguard Worker return [[(GPBUInt32Array*)[self alloc] initWithValueArray:array] autorelease]; 573*1b3f573fSAndroid Build Coastguard Worker} 574*1b3f573fSAndroid Build Coastguard Worker 575*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithCapacity:(NSUInteger)count { 576*1b3f573fSAndroid Build Coastguard Worker return [[[self alloc] initWithCapacity:count] autorelease]; 577*1b3f573fSAndroid Build Coastguard Worker} 578*1b3f573fSAndroid Build Coastguard Worker 579*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init { 580*1b3f573fSAndroid Build Coastguard Worker self = [super init]; 581*1b3f573fSAndroid Build Coastguard Worker // No work needed; 582*1b3f573fSAndroid Build Coastguard Worker return self; 583*1b3f573fSAndroid Build Coastguard Worker} 584*1b3f573fSAndroid Build Coastguard Worker 585*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValueArray:(GPBUInt32Array *)array { 586*1b3f573fSAndroid Build Coastguard Worker return [self initWithValues:array->_values count:array->_count]; 587*1b3f573fSAndroid Build Coastguard Worker} 588*1b3f573fSAndroid Build Coastguard Worker 589*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValues:(const uint32_t [])values count:(NSUInteger)count { 590*1b3f573fSAndroid Build Coastguard Worker self = [self init]; 591*1b3f573fSAndroid Build Coastguard Worker if (self) { 592*1b3f573fSAndroid Build Coastguard Worker if (count && values) { 593*1b3f573fSAndroid Build Coastguard Worker _values = reallocf(_values, count * sizeof(uint32_t)); 594*1b3f573fSAndroid Build Coastguard Worker if (_values != NULL) { 595*1b3f573fSAndroid Build Coastguard Worker _capacity = count; 596*1b3f573fSAndroid Build Coastguard Worker memcpy(_values, values, count * sizeof(uint32_t)); 597*1b3f573fSAndroid Build Coastguard Worker _count = count; 598*1b3f573fSAndroid Build Coastguard Worker } else { 599*1b3f573fSAndroid Build Coastguard Worker [self release]; 600*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSMallocException 601*1b3f573fSAndroid Build Coastguard Worker format:@"Failed to allocate %lu bytes", 602*1b3f573fSAndroid Build Coastguard Worker (unsigned long)(count * sizeof(uint32_t))]; 603*1b3f573fSAndroid Build Coastguard Worker } 604*1b3f573fSAndroid Build Coastguard Worker } 605*1b3f573fSAndroid Build Coastguard Worker } 606*1b3f573fSAndroid Build Coastguard Worker return self; 607*1b3f573fSAndroid Build Coastguard Worker} 608*1b3f573fSAndroid Build Coastguard Worker 609*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)count { 610*1b3f573fSAndroid Build Coastguard Worker self = [self initWithValues:NULL count:0]; 611*1b3f573fSAndroid Build Coastguard Worker if (self && count) { 612*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:count]; 613*1b3f573fSAndroid Build Coastguard Worker } 614*1b3f573fSAndroid Build Coastguard Worker return self; 615*1b3f573fSAndroid Build Coastguard Worker} 616*1b3f573fSAndroid Build Coastguard Worker 617*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 618*1b3f573fSAndroid Build Coastguard Worker return [[GPBUInt32Array allocWithZone:zone] initWithValues:_values count:_count]; 619*1b3f573fSAndroid Build Coastguard Worker} 620*1b3f573fSAndroid Build Coastguard Worker 621*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc { 622*1b3f573fSAndroid Build Coastguard Worker NSAssert(!_autocreator, 623*1b3f573fSAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 624*1b3f573fSAndroid Build Coastguard Worker [self class], _autocreator); 625*1b3f573fSAndroid Build Coastguard Worker free(_values); 626*1b3f573fSAndroid Build Coastguard Worker [super dealloc]; 627*1b3f573fSAndroid Build Coastguard Worker} 628*1b3f573fSAndroid Build Coastguard Worker 629*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 630*1b3f573fSAndroid Build Coastguard Worker if (self == other) { 631*1b3f573fSAndroid Build Coastguard Worker return YES; 632*1b3f573fSAndroid Build Coastguard Worker } 633*1b3f573fSAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBUInt32Array class]]) { 634*1b3f573fSAndroid Build Coastguard Worker return NO; 635*1b3f573fSAndroid Build Coastguard Worker } 636*1b3f573fSAndroid Build Coastguard Worker GPBUInt32Array *otherArray = other; 637*1b3f573fSAndroid Build Coastguard Worker return (_count == otherArray->_count 638*1b3f573fSAndroid Build Coastguard Worker && memcmp(_values, otherArray->_values, (_count * sizeof(uint32_t))) == 0); 639*1b3f573fSAndroid Build Coastguard Worker} 640*1b3f573fSAndroid Build Coastguard Worker 641*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash { 642*1b3f573fSAndroid Build Coastguard Worker // Follow NSArray's lead, and use the count as the hash. 643*1b3f573fSAndroid Build Coastguard Worker return _count; 644*1b3f573fSAndroid Build Coastguard Worker} 645*1b3f573fSAndroid Build Coastguard Worker 646*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description { 647*1b3f573fSAndroid Build Coastguard Worker NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> { ", [self class], self]; 648*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = 0, count = _count; i < count; ++i) { 649*1b3f573fSAndroid Build Coastguard Worker if (i == 0) { 650*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@"%u", _values[i]]; 651*1b3f573fSAndroid Build Coastguard Worker } else { 652*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@", %u", _values[i]]; 653*1b3f573fSAndroid Build Coastguard Worker } 654*1b3f573fSAndroid Build Coastguard Worker } 655*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@" }"]; 656*1b3f573fSAndroid Build Coastguard Worker return result; 657*1b3f573fSAndroid Build Coastguard Worker} 658*1b3f573fSAndroid Build Coastguard Worker 659*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(uint32_t value, NSUInteger idx, BOOL *stop))block { 660*1b3f573fSAndroid Build Coastguard Worker [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block]; 661*1b3f573fSAndroid Build Coastguard Worker} 662*1b3f573fSAndroid Build Coastguard Worker 663*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts 664*1b3f573fSAndroid Build Coastguard Worker usingBlock:(void (NS_NOESCAPE ^)(uint32_t value, NSUInteger idx, BOOL *stop))block { 665*1b3f573fSAndroid Build Coastguard Worker // NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok). 666*1b3f573fSAndroid Build Coastguard Worker BOOL stop = NO; 667*1b3f573fSAndroid Build Coastguard Worker if ((opts & NSEnumerationReverse) == 0) { 668*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = 0, count = _count; i < count; ++i) { 669*1b3f573fSAndroid Build Coastguard Worker block(_values[i], i, &stop); 670*1b3f573fSAndroid Build Coastguard Worker if (stop) break; 671*1b3f573fSAndroid Build Coastguard Worker } 672*1b3f573fSAndroid Build Coastguard Worker } else if (_count > 0) { 673*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = _count; i > 0; --i) { 674*1b3f573fSAndroid Build Coastguard Worker block(_values[i - 1], (i - 1), &stop); 675*1b3f573fSAndroid Build Coastguard Worker if (stop) break; 676*1b3f573fSAndroid Build Coastguard Worker } 677*1b3f573fSAndroid Build Coastguard Worker } 678*1b3f573fSAndroid Build Coastguard Worker} 679*1b3f573fSAndroid Build Coastguard Worker 680*1b3f573fSAndroid Build Coastguard Worker- (uint32_t)valueAtIndex:(NSUInteger)index { 681*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 682*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 683*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 684*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 685*1b3f573fSAndroid Build Coastguard Worker } 686*1b3f573fSAndroid Build Coastguard Worker return _values[index]; 687*1b3f573fSAndroid Build Coastguard Worker} 688*1b3f573fSAndroid Build Coastguard Worker 689*1b3f573fSAndroid Build Coastguard Worker- (void)internalResizeToCapacity:(NSUInteger)newCapacity { 690*1b3f573fSAndroid Build Coastguard Worker _values = reallocf(_values, newCapacity * sizeof(uint32_t)); 691*1b3f573fSAndroid Build Coastguard Worker if (_values == NULL) { 692*1b3f573fSAndroid Build Coastguard Worker _capacity = 0; 693*1b3f573fSAndroid Build Coastguard Worker _count = 0; 694*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSMallocException 695*1b3f573fSAndroid Build Coastguard Worker format:@"Failed to allocate %lu bytes", 696*1b3f573fSAndroid Build Coastguard Worker (unsigned long)(newCapacity * sizeof(uint32_t))]; 697*1b3f573fSAndroid Build Coastguard Worker } 698*1b3f573fSAndroid Build Coastguard Worker _capacity = newCapacity; 699*1b3f573fSAndroid Build Coastguard Worker} 700*1b3f573fSAndroid Build Coastguard Worker 701*1b3f573fSAndroid Build Coastguard Worker- (void)addValue:(uint32_t)value { 702*1b3f573fSAndroid Build Coastguard Worker [self addValues:&value count:1]; 703*1b3f573fSAndroid Build Coastguard Worker} 704*1b3f573fSAndroid Build Coastguard Worker 705*1b3f573fSAndroid Build Coastguard Worker- (void)addValues:(const uint32_t [])values count:(NSUInteger)count { 706*1b3f573fSAndroid Build Coastguard Worker if (values == NULL || count == 0) return; 707*1b3f573fSAndroid Build Coastguard Worker NSUInteger initialCount = _count; 708*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = initialCount + count; 709*1b3f573fSAndroid Build Coastguard Worker if (newCount > _capacity) { 710*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 711*1b3f573fSAndroid Build Coastguard Worker } 712*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 713*1b3f573fSAndroid Build Coastguard Worker memcpy(&_values[initialCount], values, count * sizeof(uint32_t)); 714*1b3f573fSAndroid Build Coastguard Worker if (_autocreator) { 715*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedArrayModified(_autocreator, self); 716*1b3f573fSAndroid Build Coastguard Worker } 717*1b3f573fSAndroid Build Coastguard Worker} 718*1b3f573fSAndroid Build Coastguard Worker 719*1b3f573fSAndroid Build Coastguard Worker- (void)insertValue:(uint32_t)value atIndex:(NSUInteger)index { 720*1b3f573fSAndroid Build Coastguard Worker if (index >= _count + 1) { 721*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 722*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 723*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count + 1]; 724*1b3f573fSAndroid Build Coastguard Worker } 725*1b3f573fSAndroid Build Coastguard Worker NSUInteger initialCount = _count; 726*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = initialCount + 1; 727*1b3f573fSAndroid Build Coastguard Worker if (newCount > _capacity) { 728*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 729*1b3f573fSAndroid Build Coastguard Worker } 730*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 731*1b3f573fSAndroid Build Coastguard Worker if (index != initialCount) { 732*1b3f573fSAndroid Build Coastguard Worker memmove(&_values[index + 1], &_values[index], (initialCount - index) * sizeof(uint32_t)); 733*1b3f573fSAndroid Build Coastguard Worker } 734*1b3f573fSAndroid Build Coastguard Worker _values[index] = value; 735*1b3f573fSAndroid Build Coastguard Worker if (_autocreator) { 736*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedArrayModified(_autocreator, self); 737*1b3f573fSAndroid Build Coastguard Worker } 738*1b3f573fSAndroid Build Coastguard Worker} 739*1b3f573fSAndroid Build Coastguard Worker 740*1b3f573fSAndroid Build Coastguard Worker- (void)replaceValueAtIndex:(NSUInteger)index withValue:(uint32_t)value { 741*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 742*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 743*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 744*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 745*1b3f573fSAndroid Build Coastguard Worker } 746*1b3f573fSAndroid Build Coastguard Worker _values[index] = value; 747*1b3f573fSAndroid Build Coastguard Worker} 748*1b3f573fSAndroid Build Coastguard Worker 749*1b3f573fSAndroid Build Coastguard Worker- (void)addValuesFromArray:(GPBUInt32Array *)array { 750*1b3f573fSAndroid Build Coastguard Worker [self addValues:array->_values count:array->_count]; 751*1b3f573fSAndroid Build Coastguard Worker} 752*1b3f573fSAndroid Build Coastguard Worker 753*1b3f573fSAndroid Build Coastguard Worker- (void)removeValueAtIndex:(NSUInteger)index { 754*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 755*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 756*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 757*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 758*1b3f573fSAndroid Build Coastguard Worker } 759*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = _count - 1; 760*1b3f573fSAndroid Build Coastguard Worker if (index != newCount) { 761*1b3f573fSAndroid Build Coastguard Worker memmove(&_values[index], &_values[index + 1], (newCount - index) * sizeof(uint32_t)); 762*1b3f573fSAndroid Build Coastguard Worker } 763*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 764*1b3f573fSAndroid Build Coastguard Worker if ((newCount + (2 * kChunkSize)) < _capacity) { 765*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 766*1b3f573fSAndroid Build Coastguard Worker } 767*1b3f573fSAndroid Build Coastguard Worker} 768*1b3f573fSAndroid Build Coastguard Worker 769*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll { 770*1b3f573fSAndroid Build Coastguard Worker _count = 0; 771*1b3f573fSAndroid Build Coastguard Worker if ((0 + (2 * kChunkSize)) < _capacity) { 772*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(0)]; 773*1b3f573fSAndroid Build Coastguard Worker } 774*1b3f573fSAndroid Build Coastguard Worker} 775*1b3f573fSAndroid Build Coastguard Worker 776*1b3f573fSAndroid Build Coastguard Worker- (void)exchangeValueAtIndex:(NSUInteger)idx1 777*1b3f573fSAndroid Build Coastguard Worker withValueAtIndex:(NSUInteger)idx2 { 778*1b3f573fSAndroid Build Coastguard Worker if (idx1 >= _count) { 779*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 780*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 781*1b3f573fSAndroid Build Coastguard Worker (unsigned long)idx1, (unsigned long)_count]; 782*1b3f573fSAndroid Build Coastguard Worker } 783*1b3f573fSAndroid Build Coastguard Worker if (idx2 >= _count) { 784*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 785*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 786*1b3f573fSAndroid Build Coastguard Worker (unsigned long)idx2, (unsigned long)_count]; 787*1b3f573fSAndroid Build Coastguard Worker } 788*1b3f573fSAndroid Build Coastguard Worker uint32_t temp = _values[idx1]; 789*1b3f573fSAndroid Build Coastguard Worker _values[idx1] = _values[idx2]; 790*1b3f573fSAndroid Build Coastguard Worker _values[idx2] = temp; 791*1b3f573fSAndroid Build Coastguard Worker} 792*1b3f573fSAndroid Build Coastguard Worker 793*1b3f573fSAndroid Build Coastguard Worker@end 794*1b3f573fSAndroid Build Coastguard Worker 795*1b3f573fSAndroid Build Coastguard Worker// clang-format on 796*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND ARRAY_INTERFACE_SIMPLE(Int64, int64_t, %lld) 797*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 798*1b3f573fSAndroid Build Coastguard Worker// clang-format off 799*1b3f573fSAndroid Build Coastguard Worker 800*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Int64 801*1b3f573fSAndroid Build Coastguard Worker 802*1b3f573fSAndroid Build Coastguard Worker@implementation GPBInt64Array { 803*1b3f573fSAndroid Build Coastguard Worker @package 804*1b3f573fSAndroid Build Coastguard Worker int64_t *_values; 805*1b3f573fSAndroid Build Coastguard Worker NSUInteger _count; 806*1b3f573fSAndroid Build Coastguard Worker NSUInteger _capacity; 807*1b3f573fSAndroid Build Coastguard Worker} 808*1b3f573fSAndroid Build Coastguard Worker 809*1b3f573fSAndroid Build Coastguard Worker@synthesize count = _count; 810*1b3f573fSAndroid Build Coastguard Worker 811*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)array { 812*1b3f573fSAndroid Build Coastguard Worker return [[[self alloc] init] autorelease]; 813*1b3f573fSAndroid Build Coastguard Worker} 814*1b3f573fSAndroid Build Coastguard Worker 815*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithValue:(int64_t)value { 816*1b3f573fSAndroid Build Coastguard Worker // Cast is needed so the compiler knows what class we are invoking initWithValues: on to get 817*1b3f573fSAndroid Build Coastguard Worker // the type correct. 818*1b3f573fSAndroid Build Coastguard Worker return [[(GPBInt64Array*)[self alloc] initWithValues:&value count:1] autorelease]; 819*1b3f573fSAndroid Build Coastguard Worker} 820*1b3f573fSAndroid Build Coastguard Worker 821*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithValueArray:(GPBInt64Array *)array { 822*1b3f573fSAndroid Build Coastguard Worker return [[(GPBInt64Array*)[self alloc] initWithValueArray:array] autorelease]; 823*1b3f573fSAndroid Build Coastguard Worker} 824*1b3f573fSAndroid Build Coastguard Worker 825*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithCapacity:(NSUInteger)count { 826*1b3f573fSAndroid Build Coastguard Worker return [[[self alloc] initWithCapacity:count] autorelease]; 827*1b3f573fSAndroid Build Coastguard Worker} 828*1b3f573fSAndroid Build Coastguard Worker 829*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init { 830*1b3f573fSAndroid Build Coastguard Worker self = [super init]; 831*1b3f573fSAndroid Build Coastguard Worker // No work needed; 832*1b3f573fSAndroid Build Coastguard Worker return self; 833*1b3f573fSAndroid Build Coastguard Worker} 834*1b3f573fSAndroid Build Coastguard Worker 835*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValueArray:(GPBInt64Array *)array { 836*1b3f573fSAndroid Build Coastguard Worker return [self initWithValues:array->_values count:array->_count]; 837*1b3f573fSAndroid Build Coastguard Worker} 838*1b3f573fSAndroid Build Coastguard Worker 839*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValues:(const int64_t [])values count:(NSUInteger)count { 840*1b3f573fSAndroid Build Coastguard Worker self = [self init]; 841*1b3f573fSAndroid Build Coastguard Worker if (self) { 842*1b3f573fSAndroid Build Coastguard Worker if (count && values) { 843*1b3f573fSAndroid Build Coastguard Worker _values = reallocf(_values, count * sizeof(int64_t)); 844*1b3f573fSAndroid Build Coastguard Worker if (_values != NULL) { 845*1b3f573fSAndroid Build Coastguard Worker _capacity = count; 846*1b3f573fSAndroid Build Coastguard Worker memcpy(_values, values, count * sizeof(int64_t)); 847*1b3f573fSAndroid Build Coastguard Worker _count = count; 848*1b3f573fSAndroid Build Coastguard Worker } else { 849*1b3f573fSAndroid Build Coastguard Worker [self release]; 850*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSMallocException 851*1b3f573fSAndroid Build Coastguard Worker format:@"Failed to allocate %lu bytes", 852*1b3f573fSAndroid Build Coastguard Worker (unsigned long)(count * sizeof(int64_t))]; 853*1b3f573fSAndroid Build Coastguard Worker } 854*1b3f573fSAndroid Build Coastguard Worker } 855*1b3f573fSAndroid Build Coastguard Worker } 856*1b3f573fSAndroid Build Coastguard Worker return self; 857*1b3f573fSAndroid Build Coastguard Worker} 858*1b3f573fSAndroid Build Coastguard Worker 859*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)count { 860*1b3f573fSAndroid Build Coastguard Worker self = [self initWithValues:NULL count:0]; 861*1b3f573fSAndroid Build Coastguard Worker if (self && count) { 862*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:count]; 863*1b3f573fSAndroid Build Coastguard Worker } 864*1b3f573fSAndroid Build Coastguard Worker return self; 865*1b3f573fSAndroid Build Coastguard Worker} 866*1b3f573fSAndroid Build Coastguard Worker 867*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 868*1b3f573fSAndroid Build Coastguard Worker return [[GPBInt64Array allocWithZone:zone] initWithValues:_values count:_count]; 869*1b3f573fSAndroid Build Coastguard Worker} 870*1b3f573fSAndroid Build Coastguard Worker 871*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc { 872*1b3f573fSAndroid Build Coastguard Worker NSAssert(!_autocreator, 873*1b3f573fSAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 874*1b3f573fSAndroid Build Coastguard Worker [self class], _autocreator); 875*1b3f573fSAndroid Build Coastguard Worker free(_values); 876*1b3f573fSAndroid Build Coastguard Worker [super dealloc]; 877*1b3f573fSAndroid Build Coastguard Worker} 878*1b3f573fSAndroid Build Coastguard Worker 879*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 880*1b3f573fSAndroid Build Coastguard Worker if (self == other) { 881*1b3f573fSAndroid Build Coastguard Worker return YES; 882*1b3f573fSAndroid Build Coastguard Worker } 883*1b3f573fSAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBInt64Array class]]) { 884*1b3f573fSAndroid Build Coastguard Worker return NO; 885*1b3f573fSAndroid Build Coastguard Worker } 886*1b3f573fSAndroid Build Coastguard Worker GPBInt64Array *otherArray = other; 887*1b3f573fSAndroid Build Coastguard Worker return (_count == otherArray->_count 888*1b3f573fSAndroid Build Coastguard Worker && memcmp(_values, otherArray->_values, (_count * sizeof(int64_t))) == 0); 889*1b3f573fSAndroid Build Coastguard Worker} 890*1b3f573fSAndroid Build Coastguard Worker 891*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash { 892*1b3f573fSAndroid Build Coastguard Worker // Follow NSArray's lead, and use the count as the hash. 893*1b3f573fSAndroid Build Coastguard Worker return _count; 894*1b3f573fSAndroid Build Coastguard Worker} 895*1b3f573fSAndroid Build Coastguard Worker 896*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description { 897*1b3f573fSAndroid Build Coastguard Worker NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> { ", [self class], self]; 898*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = 0, count = _count; i < count; ++i) { 899*1b3f573fSAndroid Build Coastguard Worker if (i == 0) { 900*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@"%lld", _values[i]]; 901*1b3f573fSAndroid Build Coastguard Worker } else { 902*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@", %lld", _values[i]]; 903*1b3f573fSAndroid Build Coastguard Worker } 904*1b3f573fSAndroid Build Coastguard Worker } 905*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@" }"]; 906*1b3f573fSAndroid Build Coastguard Worker return result; 907*1b3f573fSAndroid Build Coastguard Worker} 908*1b3f573fSAndroid Build Coastguard Worker 909*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(int64_t value, NSUInteger idx, BOOL *stop))block { 910*1b3f573fSAndroid Build Coastguard Worker [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block]; 911*1b3f573fSAndroid Build Coastguard Worker} 912*1b3f573fSAndroid Build Coastguard Worker 913*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts 914*1b3f573fSAndroid Build Coastguard Worker usingBlock:(void (NS_NOESCAPE ^)(int64_t value, NSUInteger idx, BOOL *stop))block { 915*1b3f573fSAndroid Build Coastguard Worker // NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok). 916*1b3f573fSAndroid Build Coastguard Worker BOOL stop = NO; 917*1b3f573fSAndroid Build Coastguard Worker if ((opts & NSEnumerationReverse) == 0) { 918*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = 0, count = _count; i < count; ++i) { 919*1b3f573fSAndroid Build Coastguard Worker block(_values[i], i, &stop); 920*1b3f573fSAndroid Build Coastguard Worker if (stop) break; 921*1b3f573fSAndroid Build Coastguard Worker } 922*1b3f573fSAndroid Build Coastguard Worker } else if (_count > 0) { 923*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = _count; i > 0; --i) { 924*1b3f573fSAndroid Build Coastguard Worker block(_values[i - 1], (i - 1), &stop); 925*1b3f573fSAndroid Build Coastguard Worker if (stop) break; 926*1b3f573fSAndroid Build Coastguard Worker } 927*1b3f573fSAndroid Build Coastguard Worker } 928*1b3f573fSAndroid Build Coastguard Worker} 929*1b3f573fSAndroid Build Coastguard Worker 930*1b3f573fSAndroid Build Coastguard Worker- (int64_t)valueAtIndex:(NSUInteger)index { 931*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 932*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 933*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 934*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 935*1b3f573fSAndroid Build Coastguard Worker } 936*1b3f573fSAndroid Build Coastguard Worker return _values[index]; 937*1b3f573fSAndroid Build Coastguard Worker} 938*1b3f573fSAndroid Build Coastguard Worker 939*1b3f573fSAndroid Build Coastguard Worker- (void)internalResizeToCapacity:(NSUInteger)newCapacity { 940*1b3f573fSAndroid Build Coastguard Worker _values = reallocf(_values, newCapacity * sizeof(int64_t)); 941*1b3f573fSAndroid Build Coastguard Worker if (_values == NULL) { 942*1b3f573fSAndroid Build Coastguard Worker _capacity = 0; 943*1b3f573fSAndroid Build Coastguard Worker _count = 0; 944*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSMallocException 945*1b3f573fSAndroid Build Coastguard Worker format:@"Failed to allocate %lu bytes", 946*1b3f573fSAndroid Build Coastguard Worker (unsigned long)(newCapacity * sizeof(int64_t))]; 947*1b3f573fSAndroid Build Coastguard Worker } 948*1b3f573fSAndroid Build Coastguard Worker _capacity = newCapacity; 949*1b3f573fSAndroid Build Coastguard Worker} 950*1b3f573fSAndroid Build Coastguard Worker 951*1b3f573fSAndroid Build Coastguard Worker- (void)addValue:(int64_t)value { 952*1b3f573fSAndroid Build Coastguard Worker [self addValues:&value count:1]; 953*1b3f573fSAndroid Build Coastguard Worker} 954*1b3f573fSAndroid Build Coastguard Worker 955*1b3f573fSAndroid Build Coastguard Worker- (void)addValues:(const int64_t [])values count:(NSUInteger)count { 956*1b3f573fSAndroid Build Coastguard Worker if (values == NULL || count == 0) return; 957*1b3f573fSAndroid Build Coastguard Worker NSUInteger initialCount = _count; 958*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = initialCount + count; 959*1b3f573fSAndroid Build Coastguard Worker if (newCount > _capacity) { 960*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 961*1b3f573fSAndroid Build Coastguard Worker } 962*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 963*1b3f573fSAndroid Build Coastguard Worker memcpy(&_values[initialCount], values, count * sizeof(int64_t)); 964*1b3f573fSAndroid Build Coastguard Worker if (_autocreator) { 965*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedArrayModified(_autocreator, self); 966*1b3f573fSAndroid Build Coastguard Worker } 967*1b3f573fSAndroid Build Coastguard Worker} 968*1b3f573fSAndroid Build Coastguard Worker 969*1b3f573fSAndroid Build Coastguard Worker- (void)insertValue:(int64_t)value atIndex:(NSUInteger)index { 970*1b3f573fSAndroid Build Coastguard Worker if (index >= _count + 1) { 971*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 972*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 973*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count + 1]; 974*1b3f573fSAndroid Build Coastguard Worker } 975*1b3f573fSAndroid Build Coastguard Worker NSUInteger initialCount = _count; 976*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = initialCount + 1; 977*1b3f573fSAndroid Build Coastguard Worker if (newCount > _capacity) { 978*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 979*1b3f573fSAndroid Build Coastguard Worker } 980*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 981*1b3f573fSAndroid Build Coastguard Worker if (index != initialCount) { 982*1b3f573fSAndroid Build Coastguard Worker memmove(&_values[index + 1], &_values[index], (initialCount - index) * sizeof(int64_t)); 983*1b3f573fSAndroid Build Coastguard Worker } 984*1b3f573fSAndroid Build Coastguard Worker _values[index] = value; 985*1b3f573fSAndroid Build Coastguard Worker if (_autocreator) { 986*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedArrayModified(_autocreator, self); 987*1b3f573fSAndroid Build Coastguard Worker } 988*1b3f573fSAndroid Build Coastguard Worker} 989*1b3f573fSAndroid Build Coastguard Worker 990*1b3f573fSAndroid Build Coastguard Worker- (void)replaceValueAtIndex:(NSUInteger)index withValue:(int64_t)value { 991*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 992*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 993*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 994*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 995*1b3f573fSAndroid Build Coastguard Worker } 996*1b3f573fSAndroid Build Coastguard Worker _values[index] = value; 997*1b3f573fSAndroid Build Coastguard Worker} 998*1b3f573fSAndroid Build Coastguard Worker 999*1b3f573fSAndroid Build Coastguard Worker- (void)addValuesFromArray:(GPBInt64Array *)array { 1000*1b3f573fSAndroid Build Coastguard Worker [self addValues:array->_values count:array->_count]; 1001*1b3f573fSAndroid Build Coastguard Worker} 1002*1b3f573fSAndroid Build Coastguard Worker 1003*1b3f573fSAndroid Build Coastguard Worker- (void)removeValueAtIndex:(NSUInteger)index { 1004*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 1005*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1006*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1007*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 1008*1b3f573fSAndroid Build Coastguard Worker } 1009*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = _count - 1; 1010*1b3f573fSAndroid Build Coastguard Worker if (index != newCount) { 1011*1b3f573fSAndroid Build Coastguard Worker memmove(&_values[index], &_values[index + 1], (newCount - index) * sizeof(int64_t)); 1012*1b3f573fSAndroid Build Coastguard Worker } 1013*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 1014*1b3f573fSAndroid Build Coastguard Worker if ((newCount + (2 * kChunkSize)) < _capacity) { 1015*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 1016*1b3f573fSAndroid Build Coastguard Worker } 1017*1b3f573fSAndroid Build Coastguard Worker} 1018*1b3f573fSAndroid Build Coastguard Worker 1019*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll { 1020*1b3f573fSAndroid Build Coastguard Worker _count = 0; 1021*1b3f573fSAndroid Build Coastguard Worker if ((0 + (2 * kChunkSize)) < _capacity) { 1022*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(0)]; 1023*1b3f573fSAndroid Build Coastguard Worker } 1024*1b3f573fSAndroid Build Coastguard Worker} 1025*1b3f573fSAndroid Build Coastguard Worker 1026*1b3f573fSAndroid Build Coastguard Worker- (void)exchangeValueAtIndex:(NSUInteger)idx1 1027*1b3f573fSAndroid Build Coastguard Worker withValueAtIndex:(NSUInteger)idx2 { 1028*1b3f573fSAndroid Build Coastguard Worker if (idx1 >= _count) { 1029*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1030*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1031*1b3f573fSAndroid Build Coastguard Worker (unsigned long)idx1, (unsigned long)_count]; 1032*1b3f573fSAndroid Build Coastguard Worker } 1033*1b3f573fSAndroid Build Coastguard Worker if (idx2 >= _count) { 1034*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1035*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1036*1b3f573fSAndroid Build Coastguard Worker (unsigned long)idx2, (unsigned long)_count]; 1037*1b3f573fSAndroid Build Coastguard Worker } 1038*1b3f573fSAndroid Build Coastguard Worker int64_t temp = _values[idx1]; 1039*1b3f573fSAndroid Build Coastguard Worker _values[idx1] = _values[idx2]; 1040*1b3f573fSAndroid Build Coastguard Worker _values[idx2] = temp; 1041*1b3f573fSAndroid Build Coastguard Worker} 1042*1b3f573fSAndroid Build Coastguard Worker 1043*1b3f573fSAndroid Build Coastguard Worker@end 1044*1b3f573fSAndroid Build Coastguard Worker 1045*1b3f573fSAndroid Build Coastguard Worker// clang-format on 1046*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND ARRAY_INTERFACE_SIMPLE(UInt64, uint64_t, %llu) 1047*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 1048*1b3f573fSAndroid Build Coastguard Worker// clang-format off 1049*1b3f573fSAndroid Build Coastguard Worker 1050*1b3f573fSAndroid Build Coastguard Worker#pragma mark - UInt64 1051*1b3f573fSAndroid Build Coastguard Worker 1052*1b3f573fSAndroid Build Coastguard Worker@implementation GPBUInt64Array { 1053*1b3f573fSAndroid Build Coastguard Worker @package 1054*1b3f573fSAndroid Build Coastguard Worker uint64_t *_values; 1055*1b3f573fSAndroid Build Coastguard Worker NSUInteger _count; 1056*1b3f573fSAndroid Build Coastguard Worker NSUInteger _capacity; 1057*1b3f573fSAndroid Build Coastguard Worker} 1058*1b3f573fSAndroid Build Coastguard Worker 1059*1b3f573fSAndroid Build Coastguard Worker@synthesize count = _count; 1060*1b3f573fSAndroid Build Coastguard Worker 1061*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)array { 1062*1b3f573fSAndroid Build Coastguard Worker return [[[self alloc] init] autorelease]; 1063*1b3f573fSAndroid Build Coastguard Worker} 1064*1b3f573fSAndroid Build Coastguard Worker 1065*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithValue:(uint64_t)value { 1066*1b3f573fSAndroid Build Coastguard Worker // Cast is needed so the compiler knows what class we are invoking initWithValues: on to get 1067*1b3f573fSAndroid Build Coastguard Worker // the type correct. 1068*1b3f573fSAndroid Build Coastguard Worker return [[(GPBUInt64Array*)[self alloc] initWithValues:&value count:1] autorelease]; 1069*1b3f573fSAndroid Build Coastguard Worker} 1070*1b3f573fSAndroid Build Coastguard Worker 1071*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithValueArray:(GPBUInt64Array *)array { 1072*1b3f573fSAndroid Build Coastguard Worker return [[(GPBUInt64Array*)[self alloc] initWithValueArray:array] autorelease]; 1073*1b3f573fSAndroid Build Coastguard Worker} 1074*1b3f573fSAndroid Build Coastguard Worker 1075*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithCapacity:(NSUInteger)count { 1076*1b3f573fSAndroid Build Coastguard Worker return [[[self alloc] initWithCapacity:count] autorelease]; 1077*1b3f573fSAndroid Build Coastguard Worker} 1078*1b3f573fSAndroid Build Coastguard Worker 1079*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init { 1080*1b3f573fSAndroid Build Coastguard Worker self = [super init]; 1081*1b3f573fSAndroid Build Coastguard Worker // No work needed; 1082*1b3f573fSAndroid Build Coastguard Worker return self; 1083*1b3f573fSAndroid Build Coastguard Worker} 1084*1b3f573fSAndroid Build Coastguard Worker 1085*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValueArray:(GPBUInt64Array *)array { 1086*1b3f573fSAndroid Build Coastguard Worker return [self initWithValues:array->_values count:array->_count]; 1087*1b3f573fSAndroid Build Coastguard Worker} 1088*1b3f573fSAndroid Build Coastguard Worker 1089*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValues:(const uint64_t [])values count:(NSUInteger)count { 1090*1b3f573fSAndroid Build Coastguard Worker self = [self init]; 1091*1b3f573fSAndroid Build Coastguard Worker if (self) { 1092*1b3f573fSAndroid Build Coastguard Worker if (count && values) { 1093*1b3f573fSAndroid Build Coastguard Worker _values = reallocf(_values, count * sizeof(uint64_t)); 1094*1b3f573fSAndroid Build Coastguard Worker if (_values != NULL) { 1095*1b3f573fSAndroid Build Coastguard Worker _capacity = count; 1096*1b3f573fSAndroid Build Coastguard Worker memcpy(_values, values, count * sizeof(uint64_t)); 1097*1b3f573fSAndroid Build Coastguard Worker _count = count; 1098*1b3f573fSAndroid Build Coastguard Worker } else { 1099*1b3f573fSAndroid Build Coastguard Worker [self release]; 1100*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSMallocException 1101*1b3f573fSAndroid Build Coastguard Worker format:@"Failed to allocate %lu bytes", 1102*1b3f573fSAndroid Build Coastguard Worker (unsigned long)(count * sizeof(uint64_t))]; 1103*1b3f573fSAndroid Build Coastguard Worker } 1104*1b3f573fSAndroid Build Coastguard Worker } 1105*1b3f573fSAndroid Build Coastguard Worker } 1106*1b3f573fSAndroid Build Coastguard Worker return self; 1107*1b3f573fSAndroid Build Coastguard Worker} 1108*1b3f573fSAndroid Build Coastguard Worker 1109*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)count { 1110*1b3f573fSAndroid Build Coastguard Worker self = [self initWithValues:NULL count:0]; 1111*1b3f573fSAndroid Build Coastguard Worker if (self && count) { 1112*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:count]; 1113*1b3f573fSAndroid Build Coastguard Worker } 1114*1b3f573fSAndroid Build Coastguard Worker return self; 1115*1b3f573fSAndroid Build Coastguard Worker} 1116*1b3f573fSAndroid Build Coastguard Worker 1117*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 1118*1b3f573fSAndroid Build Coastguard Worker return [[GPBUInt64Array allocWithZone:zone] initWithValues:_values count:_count]; 1119*1b3f573fSAndroid Build Coastguard Worker} 1120*1b3f573fSAndroid Build Coastguard Worker 1121*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc { 1122*1b3f573fSAndroid Build Coastguard Worker NSAssert(!_autocreator, 1123*1b3f573fSAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 1124*1b3f573fSAndroid Build Coastguard Worker [self class], _autocreator); 1125*1b3f573fSAndroid Build Coastguard Worker free(_values); 1126*1b3f573fSAndroid Build Coastguard Worker [super dealloc]; 1127*1b3f573fSAndroid Build Coastguard Worker} 1128*1b3f573fSAndroid Build Coastguard Worker 1129*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 1130*1b3f573fSAndroid Build Coastguard Worker if (self == other) { 1131*1b3f573fSAndroid Build Coastguard Worker return YES; 1132*1b3f573fSAndroid Build Coastguard Worker } 1133*1b3f573fSAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBUInt64Array class]]) { 1134*1b3f573fSAndroid Build Coastguard Worker return NO; 1135*1b3f573fSAndroid Build Coastguard Worker } 1136*1b3f573fSAndroid Build Coastguard Worker GPBUInt64Array *otherArray = other; 1137*1b3f573fSAndroid Build Coastguard Worker return (_count == otherArray->_count 1138*1b3f573fSAndroid Build Coastguard Worker && memcmp(_values, otherArray->_values, (_count * sizeof(uint64_t))) == 0); 1139*1b3f573fSAndroid Build Coastguard Worker} 1140*1b3f573fSAndroid Build Coastguard Worker 1141*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash { 1142*1b3f573fSAndroid Build Coastguard Worker // Follow NSArray's lead, and use the count as the hash. 1143*1b3f573fSAndroid Build Coastguard Worker return _count; 1144*1b3f573fSAndroid Build Coastguard Worker} 1145*1b3f573fSAndroid Build Coastguard Worker 1146*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description { 1147*1b3f573fSAndroid Build Coastguard Worker NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> { ", [self class], self]; 1148*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = 0, count = _count; i < count; ++i) { 1149*1b3f573fSAndroid Build Coastguard Worker if (i == 0) { 1150*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@"%llu", _values[i]]; 1151*1b3f573fSAndroid Build Coastguard Worker } else { 1152*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@", %llu", _values[i]]; 1153*1b3f573fSAndroid Build Coastguard Worker } 1154*1b3f573fSAndroid Build Coastguard Worker } 1155*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@" }"]; 1156*1b3f573fSAndroid Build Coastguard Worker return result; 1157*1b3f573fSAndroid Build Coastguard Worker} 1158*1b3f573fSAndroid Build Coastguard Worker 1159*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(uint64_t value, NSUInteger idx, BOOL *stop))block { 1160*1b3f573fSAndroid Build Coastguard Worker [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block]; 1161*1b3f573fSAndroid Build Coastguard Worker} 1162*1b3f573fSAndroid Build Coastguard Worker 1163*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts 1164*1b3f573fSAndroid Build Coastguard Worker usingBlock:(void (NS_NOESCAPE ^)(uint64_t value, NSUInteger idx, BOOL *stop))block { 1165*1b3f573fSAndroid Build Coastguard Worker // NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok). 1166*1b3f573fSAndroid Build Coastguard Worker BOOL stop = NO; 1167*1b3f573fSAndroid Build Coastguard Worker if ((opts & NSEnumerationReverse) == 0) { 1168*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = 0, count = _count; i < count; ++i) { 1169*1b3f573fSAndroid Build Coastguard Worker block(_values[i], i, &stop); 1170*1b3f573fSAndroid Build Coastguard Worker if (stop) break; 1171*1b3f573fSAndroid Build Coastguard Worker } 1172*1b3f573fSAndroid Build Coastguard Worker } else if (_count > 0) { 1173*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = _count; i > 0; --i) { 1174*1b3f573fSAndroid Build Coastguard Worker block(_values[i - 1], (i - 1), &stop); 1175*1b3f573fSAndroid Build Coastguard Worker if (stop) break; 1176*1b3f573fSAndroid Build Coastguard Worker } 1177*1b3f573fSAndroid Build Coastguard Worker } 1178*1b3f573fSAndroid Build Coastguard Worker} 1179*1b3f573fSAndroid Build Coastguard Worker 1180*1b3f573fSAndroid Build Coastguard Worker- (uint64_t)valueAtIndex:(NSUInteger)index { 1181*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 1182*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1183*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1184*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 1185*1b3f573fSAndroid Build Coastguard Worker } 1186*1b3f573fSAndroid Build Coastguard Worker return _values[index]; 1187*1b3f573fSAndroid Build Coastguard Worker} 1188*1b3f573fSAndroid Build Coastguard Worker 1189*1b3f573fSAndroid Build Coastguard Worker- (void)internalResizeToCapacity:(NSUInteger)newCapacity { 1190*1b3f573fSAndroid Build Coastguard Worker _values = reallocf(_values, newCapacity * sizeof(uint64_t)); 1191*1b3f573fSAndroid Build Coastguard Worker if (_values == NULL) { 1192*1b3f573fSAndroid Build Coastguard Worker _capacity = 0; 1193*1b3f573fSAndroid Build Coastguard Worker _count = 0; 1194*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSMallocException 1195*1b3f573fSAndroid Build Coastguard Worker format:@"Failed to allocate %lu bytes", 1196*1b3f573fSAndroid Build Coastguard Worker (unsigned long)(newCapacity * sizeof(uint64_t))]; 1197*1b3f573fSAndroid Build Coastguard Worker } 1198*1b3f573fSAndroid Build Coastguard Worker _capacity = newCapacity; 1199*1b3f573fSAndroid Build Coastguard Worker} 1200*1b3f573fSAndroid Build Coastguard Worker 1201*1b3f573fSAndroid Build Coastguard Worker- (void)addValue:(uint64_t)value { 1202*1b3f573fSAndroid Build Coastguard Worker [self addValues:&value count:1]; 1203*1b3f573fSAndroid Build Coastguard Worker} 1204*1b3f573fSAndroid Build Coastguard Worker 1205*1b3f573fSAndroid Build Coastguard Worker- (void)addValues:(const uint64_t [])values count:(NSUInteger)count { 1206*1b3f573fSAndroid Build Coastguard Worker if (values == NULL || count == 0) return; 1207*1b3f573fSAndroid Build Coastguard Worker NSUInteger initialCount = _count; 1208*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = initialCount + count; 1209*1b3f573fSAndroid Build Coastguard Worker if (newCount > _capacity) { 1210*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 1211*1b3f573fSAndroid Build Coastguard Worker } 1212*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 1213*1b3f573fSAndroid Build Coastguard Worker memcpy(&_values[initialCount], values, count * sizeof(uint64_t)); 1214*1b3f573fSAndroid Build Coastguard Worker if (_autocreator) { 1215*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedArrayModified(_autocreator, self); 1216*1b3f573fSAndroid Build Coastguard Worker } 1217*1b3f573fSAndroid Build Coastguard Worker} 1218*1b3f573fSAndroid Build Coastguard Worker 1219*1b3f573fSAndroid Build Coastguard Worker- (void)insertValue:(uint64_t)value atIndex:(NSUInteger)index { 1220*1b3f573fSAndroid Build Coastguard Worker if (index >= _count + 1) { 1221*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1222*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1223*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count + 1]; 1224*1b3f573fSAndroid Build Coastguard Worker } 1225*1b3f573fSAndroid Build Coastguard Worker NSUInteger initialCount = _count; 1226*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = initialCount + 1; 1227*1b3f573fSAndroid Build Coastguard Worker if (newCount > _capacity) { 1228*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 1229*1b3f573fSAndroid Build Coastguard Worker } 1230*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 1231*1b3f573fSAndroid Build Coastguard Worker if (index != initialCount) { 1232*1b3f573fSAndroid Build Coastguard Worker memmove(&_values[index + 1], &_values[index], (initialCount - index) * sizeof(uint64_t)); 1233*1b3f573fSAndroid Build Coastguard Worker } 1234*1b3f573fSAndroid Build Coastguard Worker _values[index] = value; 1235*1b3f573fSAndroid Build Coastguard Worker if (_autocreator) { 1236*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedArrayModified(_autocreator, self); 1237*1b3f573fSAndroid Build Coastguard Worker } 1238*1b3f573fSAndroid Build Coastguard Worker} 1239*1b3f573fSAndroid Build Coastguard Worker 1240*1b3f573fSAndroid Build Coastguard Worker- (void)replaceValueAtIndex:(NSUInteger)index withValue:(uint64_t)value { 1241*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 1242*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1243*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1244*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 1245*1b3f573fSAndroid Build Coastguard Worker } 1246*1b3f573fSAndroid Build Coastguard Worker _values[index] = value; 1247*1b3f573fSAndroid Build Coastguard Worker} 1248*1b3f573fSAndroid Build Coastguard Worker 1249*1b3f573fSAndroid Build Coastguard Worker- (void)addValuesFromArray:(GPBUInt64Array *)array { 1250*1b3f573fSAndroid Build Coastguard Worker [self addValues:array->_values count:array->_count]; 1251*1b3f573fSAndroid Build Coastguard Worker} 1252*1b3f573fSAndroid Build Coastguard Worker 1253*1b3f573fSAndroid Build Coastguard Worker- (void)removeValueAtIndex:(NSUInteger)index { 1254*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 1255*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1256*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1257*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 1258*1b3f573fSAndroid Build Coastguard Worker } 1259*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = _count - 1; 1260*1b3f573fSAndroid Build Coastguard Worker if (index != newCount) { 1261*1b3f573fSAndroid Build Coastguard Worker memmove(&_values[index], &_values[index + 1], (newCount - index) * sizeof(uint64_t)); 1262*1b3f573fSAndroid Build Coastguard Worker } 1263*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 1264*1b3f573fSAndroid Build Coastguard Worker if ((newCount + (2 * kChunkSize)) < _capacity) { 1265*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 1266*1b3f573fSAndroid Build Coastguard Worker } 1267*1b3f573fSAndroid Build Coastguard Worker} 1268*1b3f573fSAndroid Build Coastguard Worker 1269*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll { 1270*1b3f573fSAndroid Build Coastguard Worker _count = 0; 1271*1b3f573fSAndroid Build Coastguard Worker if ((0 + (2 * kChunkSize)) < _capacity) { 1272*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(0)]; 1273*1b3f573fSAndroid Build Coastguard Worker } 1274*1b3f573fSAndroid Build Coastguard Worker} 1275*1b3f573fSAndroid Build Coastguard Worker 1276*1b3f573fSAndroid Build Coastguard Worker- (void)exchangeValueAtIndex:(NSUInteger)idx1 1277*1b3f573fSAndroid Build Coastguard Worker withValueAtIndex:(NSUInteger)idx2 { 1278*1b3f573fSAndroid Build Coastguard Worker if (idx1 >= _count) { 1279*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1280*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1281*1b3f573fSAndroid Build Coastguard Worker (unsigned long)idx1, (unsigned long)_count]; 1282*1b3f573fSAndroid Build Coastguard Worker } 1283*1b3f573fSAndroid Build Coastguard Worker if (idx2 >= _count) { 1284*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1285*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1286*1b3f573fSAndroid Build Coastguard Worker (unsigned long)idx2, (unsigned long)_count]; 1287*1b3f573fSAndroid Build Coastguard Worker } 1288*1b3f573fSAndroid Build Coastguard Worker uint64_t temp = _values[idx1]; 1289*1b3f573fSAndroid Build Coastguard Worker _values[idx1] = _values[idx2]; 1290*1b3f573fSAndroid Build Coastguard Worker _values[idx2] = temp; 1291*1b3f573fSAndroid Build Coastguard Worker} 1292*1b3f573fSAndroid Build Coastguard Worker 1293*1b3f573fSAndroid Build Coastguard Worker@end 1294*1b3f573fSAndroid Build Coastguard Worker 1295*1b3f573fSAndroid Build Coastguard Worker// clang-format on 1296*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND ARRAY_INTERFACE_SIMPLE(Float, float, %f) 1297*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 1298*1b3f573fSAndroid Build Coastguard Worker// clang-format off 1299*1b3f573fSAndroid Build Coastguard Worker 1300*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Float 1301*1b3f573fSAndroid Build Coastguard Worker 1302*1b3f573fSAndroid Build Coastguard Worker@implementation GPBFloatArray { 1303*1b3f573fSAndroid Build Coastguard Worker @package 1304*1b3f573fSAndroid Build Coastguard Worker float *_values; 1305*1b3f573fSAndroid Build Coastguard Worker NSUInteger _count; 1306*1b3f573fSAndroid Build Coastguard Worker NSUInteger _capacity; 1307*1b3f573fSAndroid Build Coastguard Worker} 1308*1b3f573fSAndroid Build Coastguard Worker 1309*1b3f573fSAndroid Build Coastguard Worker@synthesize count = _count; 1310*1b3f573fSAndroid Build Coastguard Worker 1311*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)array { 1312*1b3f573fSAndroid Build Coastguard Worker return [[[self alloc] init] autorelease]; 1313*1b3f573fSAndroid Build Coastguard Worker} 1314*1b3f573fSAndroid Build Coastguard Worker 1315*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithValue:(float)value { 1316*1b3f573fSAndroid Build Coastguard Worker // Cast is needed so the compiler knows what class we are invoking initWithValues: on to get 1317*1b3f573fSAndroid Build Coastguard Worker // the type correct. 1318*1b3f573fSAndroid Build Coastguard Worker return [[(GPBFloatArray*)[self alloc] initWithValues:&value count:1] autorelease]; 1319*1b3f573fSAndroid Build Coastguard Worker} 1320*1b3f573fSAndroid Build Coastguard Worker 1321*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithValueArray:(GPBFloatArray *)array { 1322*1b3f573fSAndroid Build Coastguard Worker return [[(GPBFloatArray*)[self alloc] initWithValueArray:array] autorelease]; 1323*1b3f573fSAndroid Build Coastguard Worker} 1324*1b3f573fSAndroid Build Coastguard Worker 1325*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithCapacity:(NSUInteger)count { 1326*1b3f573fSAndroid Build Coastguard Worker return [[[self alloc] initWithCapacity:count] autorelease]; 1327*1b3f573fSAndroid Build Coastguard Worker} 1328*1b3f573fSAndroid Build Coastguard Worker 1329*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init { 1330*1b3f573fSAndroid Build Coastguard Worker self = [super init]; 1331*1b3f573fSAndroid Build Coastguard Worker // No work needed; 1332*1b3f573fSAndroid Build Coastguard Worker return self; 1333*1b3f573fSAndroid Build Coastguard Worker} 1334*1b3f573fSAndroid Build Coastguard Worker 1335*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValueArray:(GPBFloatArray *)array { 1336*1b3f573fSAndroid Build Coastguard Worker return [self initWithValues:array->_values count:array->_count]; 1337*1b3f573fSAndroid Build Coastguard Worker} 1338*1b3f573fSAndroid Build Coastguard Worker 1339*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValues:(const float [])values count:(NSUInteger)count { 1340*1b3f573fSAndroid Build Coastguard Worker self = [self init]; 1341*1b3f573fSAndroid Build Coastguard Worker if (self) { 1342*1b3f573fSAndroid Build Coastguard Worker if (count && values) { 1343*1b3f573fSAndroid Build Coastguard Worker _values = reallocf(_values, count * sizeof(float)); 1344*1b3f573fSAndroid Build Coastguard Worker if (_values != NULL) { 1345*1b3f573fSAndroid Build Coastguard Worker _capacity = count; 1346*1b3f573fSAndroid Build Coastguard Worker memcpy(_values, values, count * sizeof(float)); 1347*1b3f573fSAndroid Build Coastguard Worker _count = count; 1348*1b3f573fSAndroid Build Coastguard Worker } else { 1349*1b3f573fSAndroid Build Coastguard Worker [self release]; 1350*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSMallocException 1351*1b3f573fSAndroid Build Coastguard Worker format:@"Failed to allocate %lu bytes", 1352*1b3f573fSAndroid Build Coastguard Worker (unsigned long)(count * sizeof(float))]; 1353*1b3f573fSAndroid Build Coastguard Worker } 1354*1b3f573fSAndroid Build Coastguard Worker } 1355*1b3f573fSAndroid Build Coastguard Worker } 1356*1b3f573fSAndroid Build Coastguard Worker return self; 1357*1b3f573fSAndroid Build Coastguard Worker} 1358*1b3f573fSAndroid Build Coastguard Worker 1359*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)count { 1360*1b3f573fSAndroid Build Coastguard Worker self = [self initWithValues:NULL count:0]; 1361*1b3f573fSAndroid Build Coastguard Worker if (self && count) { 1362*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:count]; 1363*1b3f573fSAndroid Build Coastguard Worker } 1364*1b3f573fSAndroid Build Coastguard Worker return self; 1365*1b3f573fSAndroid Build Coastguard Worker} 1366*1b3f573fSAndroid Build Coastguard Worker 1367*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 1368*1b3f573fSAndroid Build Coastguard Worker return [[GPBFloatArray allocWithZone:zone] initWithValues:_values count:_count]; 1369*1b3f573fSAndroid Build Coastguard Worker} 1370*1b3f573fSAndroid Build Coastguard Worker 1371*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc { 1372*1b3f573fSAndroid Build Coastguard Worker NSAssert(!_autocreator, 1373*1b3f573fSAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 1374*1b3f573fSAndroid Build Coastguard Worker [self class], _autocreator); 1375*1b3f573fSAndroid Build Coastguard Worker free(_values); 1376*1b3f573fSAndroid Build Coastguard Worker [super dealloc]; 1377*1b3f573fSAndroid Build Coastguard Worker} 1378*1b3f573fSAndroid Build Coastguard Worker 1379*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 1380*1b3f573fSAndroid Build Coastguard Worker if (self == other) { 1381*1b3f573fSAndroid Build Coastguard Worker return YES; 1382*1b3f573fSAndroid Build Coastguard Worker } 1383*1b3f573fSAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBFloatArray class]]) { 1384*1b3f573fSAndroid Build Coastguard Worker return NO; 1385*1b3f573fSAndroid Build Coastguard Worker } 1386*1b3f573fSAndroid Build Coastguard Worker GPBFloatArray *otherArray = other; 1387*1b3f573fSAndroid Build Coastguard Worker return (_count == otherArray->_count 1388*1b3f573fSAndroid Build Coastguard Worker && memcmp(_values, otherArray->_values, (_count * sizeof(float))) == 0); 1389*1b3f573fSAndroid Build Coastguard Worker} 1390*1b3f573fSAndroid Build Coastguard Worker 1391*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash { 1392*1b3f573fSAndroid Build Coastguard Worker // Follow NSArray's lead, and use the count as the hash. 1393*1b3f573fSAndroid Build Coastguard Worker return _count; 1394*1b3f573fSAndroid Build Coastguard Worker} 1395*1b3f573fSAndroid Build Coastguard Worker 1396*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description { 1397*1b3f573fSAndroid Build Coastguard Worker NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> { ", [self class], self]; 1398*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = 0, count = _count; i < count; ++i) { 1399*1b3f573fSAndroid Build Coastguard Worker if (i == 0) { 1400*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@"%f", _values[i]]; 1401*1b3f573fSAndroid Build Coastguard Worker } else { 1402*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@", %f", _values[i]]; 1403*1b3f573fSAndroid Build Coastguard Worker } 1404*1b3f573fSAndroid Build Coastguard Worker } 1405*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@" }"]; 1406*1b3f573fSAndroid Build Coastguard Worker return result; 1407*1b3f573fSAndroid Build Coastguard Worker} 1408*1b3f573fSAndroid Build Coastguard Worker 1409*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(float value, NSUInteger idx, BOOL *stop))block { 1410*1b3f573fSAndroid Build Coastguard Worker [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block]; 1411*1b3f573fSAndroid Build Coastguard Worker} 1412*1b3f573fSAndroid Build Coastguard Worker 1413*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts 1414*1b3f573fSAndroid Build Coastguard Worker usingBlock:(void (NS_NOESCAPE ^)(float value, NSUInteger idx, BOOL *stop))block { 1415*1b3f573fSAndroid Build Coastguard Worker // NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok). 1416*1b3f573fSAndroid Build Coastguard Worker BOOL stop = NO; 1417*1b3f573fSAndroid Build Coastguard Worker if ((opts & NSEnumerationReverse) == 0) { 1418*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = 0, count = _count; i < count; ++i) { 1419*1b3f573fSAndroid Build Coastguard Worker block(_values[i], i, &stop); 1420*1b3f573fSAndroid Build Coastguard Worker if (stop) break; 1421*1b3f573fSAndroid Build Coastguard Worker } 1422*1b3f573fSAndroid Build Coastguard Worker } else if (_count > 0) { 1423*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = _count; i > 0; --i) { 1424*1b3f573fSAndroid Build Coastguard Worker block(_values[i - 1], (i - 1), &stop); 1425*1b3f573fSAndroid Build Coastguard Worker if (stop) break; 1426*1b3f573fSAndroid Build Coastguard Worker } 1427*1b3f573fSAndroid Build Coastguard Worker } 1428*1b3f573fSAndroid Build Coastguard Worker} 1429*1b3f573fSAndroid Build Coastguard Worker 1430*1b3f573fSAndroid Build Coastguard Worker- (float)valueAtIndex:(NSUInteger)index { 1431*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 1432*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1433*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1434*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 1435*1b3f573fSAndroid Build Coastguard Worker } 1436*1b3f573fSAndroid Build Coastguard Worker return _values[index]; 1437*1b3f573fSAndroid Build Coastguard Worker} 1438*1b3f573fSAndroid Build Coastguard Worker 1439*1b3f573fSAndroid Build Coastguard Worker- (void)internalResizeToCapacity:(NSUInteger)newCapacity { 1440*1b3f573fSAndroid Build Coastguard Worker _values = reallocf(_values, newCapacity * sizeof(float)); 1441*1b3f573fSAndroid Build Coastguard Worker if (_values == NULL) { 1442*1b3f573fSAndroid Build Coastguard Worker _capacity = 0; 1443*1b3f573fSAndroid Build Coastguard Worker _count = 0; 1444*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSMallocException 1445*1b3f573fSAndroid Build Coastguard Worker format:@"Failed to allocate %lu bytes", 1446*1b3f573fSAndroid Build Coastguard Worker (unsigned long)(newCapacity * sizeof(float))]; 1447*1b3f573fSAndroid Build Coastguard Worker } 1448*1b3f573fSAndroid Build Coastguard Worker _capacity = newCapacity; 1449*1b3f573fSAndroid Build Coastguard Worker} 1450*1b3f573fSAndroid Build Coastguard Worker 1451*1b3f573fSAndroid Build Coastguard Worker- (void)addValue:(float)value { 1452*1b3f573fSAndroid Build Coastguard Worker [self addValues:&value count:1]; 1453*1b3f573fSAndroid Build Coastguard Worker} 1454*1b3f573fSAndroid Build Coastguard Worker 1455*1b3f573fSAndroid Build Coastguard Worker- (void)addValues:(const float [])values count:(NSUInteger)count { 1456*1b3f573fSAndroid Build Coastguard Worker if (values == NULL || count == 0) return; 1457*1b3f573fSAndroid Build Coastguard Worker NSUInteger initialCount = _count; 1458*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = initialCount + count; 1459*1b3f573fSAndroid Build Coastguard Worker if (newCount > _capacity) { 1460*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 1461*1b3f573fSAndroid Build Coastguard Worker } 1462*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 1463*1b3f573fSAndroid Build Coastguard Worker memcpy(&_values[initialCount], values, count * sizeof(float)); 1464*1b3f573fSAndroid Build Coastguard Worker if (_autocreator) { 1465*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedArrayModified(_autocreator, self); 1466*1b3f573fSAndroid Build Coastguard Worker } 1467*1b3f573fSAndroid Build Coastguard Worker} 1468*1b3f573fSAndroid Build Coastguard Worker 1469*1b3f573fSAndroid Build Coastguard Worker- (void)insertValue:(float)value atIndex:(NSUInteger)index { 1470*1b3f573fSAndroid Build Coastguard Worker if (index >= _count + 1) { 1471*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1472*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1473*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count + 1]; 1474*1b3f573fSAndroid Build Coastguard Worker } 1475*1b3f573fSAndroid Build Coastguard Worker NSUInteger initialCount = _count; 1476*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = initialCount + 1; 1477*1b3f573fSAndroid Build Coastguard Worker if (newCount > _capacity) { 1478*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 1479*1b3f573fSAndroid Build Coastguard Worker } 1480*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 1481*1b3f573fSAndroid Build Coastguard Worker if (index != initialCount) { 1482*1b3f573fSAndroid Build Coastguard Worker memmove(&_values[index + 1], &_values[index], (initialCount - index) * sizeof(float)); 1483*1b3f573fSAndroid Build Coastguard Worker } 1484*1b3f573fSAndroid Build Coastguard Worker _values[index] = value; 1485*1b3f573fSAndroid Build Coastguard Worker if (_autocreator) { 1486*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedArrayModified(_autocreator, self); 1487*1b3f573fSAndroid Build Coastguard Worker } 1488*1b3f573fSAndroid Build Coastguard Worker} 1489*1b3f573fSAndroid Build Coastguard Worker 1490*1b3f573fSAndroid Build Coastguard Worker- (void)replaceValueAtIndex:(NSUInteger)index withValue:(float)value { 1491*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 1492*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1493*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1494*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 1495*1b3f573fSAndroid Build Coastguard Worker } 1496*1b3f573fSAndroid Build Coastguard Worker _values[index] = value; 1497*1b3f573fSAndroid Build Coastguard Worker} 1498*1b3f573fSAndroid Build Coastguard Worker 1499*1b3f573fSAndroid Build Coastguard Worker- (void)addValuesFromArray:(GPBFloatArray *)array { 1500*1b3f573fSAndroid Build Coastguard Worker [self addValues:array->_values count:array->_count]; 1501*1b3f573fSAndroid Build Coastguard Worker} 1502*1b3f573fSAndroid Build Coastguard Worker 1503*1b3f573fSAndroid Build Coastguard Worker- (void)removeValueAtIndex:(NSUInteger)index { 1504*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 1505*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1506*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1507*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 1508*1b3f573fSAndroid Build Coastguard Worker } 1509*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = _count - 1; 1510*1b3f573fSAndroid Build Coastguard Worker if (index != newCount) { 1511*1b3f573fSAndroid Build Coastguard Worker memmove(&_values[index], &_values[index + 1], (newCount - index) * sizeof(float)); 1512*1b3f573fSAndroid Build Coastguard Worker } 1513*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 1514*1b3f573fSAndroid Build Coastguard Worker if ((newCount + (2 * kChunkSize)) < _capacity) { 1515*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 1516*1b3f573fSAndroid Build Coastguard Worker } 1517*1b3f573fSAndroid Build Coastguard Worker} 1518*1b3f573fSAndroid Build Coastguard Worker 1519*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll { 1520*1b3f573fSAndroid Build Coastguard Worker _count = 0; 1521*1b3f573fSAndroid Build Coastguard Worker if ((0 + (2 * kChunkSize)) < _capacity) { 1522*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(0)]; 1523*1b3f573fSAndroid Build Coastguard Worker } 1524*1b3f573fSAndroid Build Coastguard Worker} 1525*1b3f573fSAndroid Build Coastguard Worker 1526*1b3f573fSAndroid Build Coastguard Worker- (void)exchangeValueAtIndex:(NSUInteger)idx1 1527*1b3f573fSAndroid Build Coastguard Worker withValueAtIndex:(NSUInteger)idx2 { 1528*1b3f573fSAndroid Build Coastguard Worker if (idx1 >= _count) { 1529*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1530*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1531*1b3f573fSAndroid Build Coastguard Worker (unsigned long)idx1, (unsigned long)_count]; 1532*1b3f573fSAndroid Build Coastguard Worker } 1533*1b3f573fSAndroid Build Coastguard Worker if (idx2 >= _count) { 1534*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1535*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1536*1b3f573fSAndroid Build Coastguard Worker (unsigned long)idx2, (unsigned long)_count]; 1537*1b3f573fSAndroid Build Coastguard Worker } 1538*1b3f573fSAndroid Build Coastguard Worker float temp = _values[idx1]; 1539*1b3f573fSAndroid Build Coastguard Worker _values[idx1] = _values[idx2]; 1540*1b3f573fSAndroid Build Coastguard Worker _values[idx2] = temp; 1541*1b3f573fSAndroid Build Coastguard Worker} 1542*1b3f573fSAndroid Build Coastguard Worker 1543*1b3f573fSAndroid Build Coastguard Worker@end 1544*1b3f573fSAndroid Build Coastguard Worker 1545*1b3f573fSAndroid Build Coastguard Worker// clang-format on 1546*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND ARRAY_INTERFACE_SIMPLE(Double, double, %lf) 1547*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 1548*1b3f573fSAndroid Build Coastguard Worker// clang-format off 1549*1b3f573fSAndroid Build Coastguard Worker 1550*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Double 1551*1b3f573fSAndroid Build Coastguard Worker 1552*1b3f573fSAndroid Build Coastguard Worker@implementation GPBDoubleArray { 1553*1b3f573fSAndroid Build Coastguard Worker @package 1554*1b3f573fSAndroid Build Coastguard Worker double *_values; 1555*1b3f573fSAndroid Build Coastguard Worker NSUInteger _count; 1556*1b3f573fSAndroid Build Coastguard Worker NSUInteger _capacity; 1557*1b3f573fSAndroid Build Coastguard Worker} 1558*1b3f573fSAndroid Build Coastguard Worker 1559*1b3f573fSAndroid Build Coastguard Worker@synthesize count = _count; 1560*1b3f573fSAndroid Build Coastguard Worker 1561*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)array { 1562*1b3f573fSAndroid Build Coastguard Worker return [[[self alloc] init] autorelease]; 1563*1b3f573fSAndroid Build Coastguard Worker} 1564*1b3f573fSAndroid Build Coastguard Worker 1565*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithValue:(double)value { 1566*1b3f573fSAndroid Build Coastguard Worker // Cast is needed so the compiler knows what class we are invoking initWithValues: on to get 1567*1b3f573fSAndroid Build Coastguard Worker // the type correct. 1568*1b3f573fSAndroid Build Coastguard Worker return [[(GPBDoubleArray*)[self alloc] initWithValues:&value count:1] autorelease]; 1569*1b3f573fSAndroid Build Coastguard Worker} 1570*1b3f573fSAndroid Build Coastguard Worker 1571*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithValueArray:(GPBDoubleArray *)array { 1572*1b3f573fSAndroid Build Coastguard Worker return [[(GPBDoubleArray*)[self alloc] initWithValueArray:array] autorelease]; 1573*1b3f573fSAndroid Build Coastguard Worker} 1574*1b3f573fSAndroid Build Coastguard Worker 1575*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithCapacity:(NSUInteger)count { 1576*1b3f573fSAndroid Build Coastguard Worker return [[[self alloc] initWithCapacity:count] autorelease]; 1577*1b3f573fSAndroid Build Coastguard Worker} 1578*1b3f573fSAndroid Build Coastguard Worker 1579*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init { 1580*1b3f573fSAndroid Build Coastguard Worker self = [super init]; 1581*1b3f573fSAndroid Build Coastguard Worker // No work needed; 1582*1b3f573fSAndroid Build Coastguard Worker return self; 1583*1b3f573fSAndroid Build Coastguard Worker} 1584*1b3f573fSAndroid Build Coastguard Worker 1585*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValueArray:(GPBDoubleArray *)array { 1586*1b3f573fSAndroid Build Coastguard Worker return [self initWithValues:array->_values count:array->_count]; 1587*1b3f573fSAndroid Build Coastguard Worker} 1588*1b3f573fSAndroid Build Coastguard Worker 1589*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValues:(const double [])values count:(NSUInteger)count { 1590*1b3f573fSAndroid Build Coastguard Worker self = [self init]; 1591*1b3f573fSAndroid Build Coastguard Worker if (self) { 1592*1b3f573fSAndroid Build Coastguard Worker if (count && values) { 1593*1b3f573fSAndroid Build Coastguard Worker _values = reallocf(_values, count * sizeof(double)); 1594*1b3f573fSAndroid Build Coastguard Worker if (_values != NULL) { 1595*1b3f573fSAndroid Build Coastguard Worker _capacity = count; 1596*1b3f573fSAndroid Build Coastguard Worker memcpy(_values, values, count * sizeof(double)); 1597*1b3f573fSAndroid Build Coastguard Worker _count = count; 1598*1b3f573fSAndroid Build Coastguard Worker } else { 1599*1b3f573fSAndroid Build Coastguard Worker [self release]; 1600*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSMallocException 1601*1b3f573fSAndroid Build Coastguard Worker format:@"Failed to allocate %lu bytes", 1602*1b3f573fSAndroid Build Coastguard Worker (unsigned long)(count * sizeof(double))]; 1603*1b3f573fSAndroid Build Coastguard Worker } 1604*1b3f573fSAndroid Build Coastguard Worker } 1605*1b3f573fSAndroid Build Coastguard Worker } 1606*1b3f573fSAndroid Build Coastguard Worker return self; 1607*1b3f573fSAndroid Build Coastguard Worker} 1608*1b3f573fSAndroid Build Coastguard Worker 1609*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)count { 1610*1b3f573fSAndroid Build Coastguard Worker self = [self initWithValues:NULL count:0]; 1611*1b3f573fSAndroid Build Coastguard Worker if (self && count) { 1612*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:count]; 1613*1b3f573fSAndroid Build Coastguard Worker } 1614*1b3f573fSAndroid Build Coastguard Worker return self; 1615*1b3f573fSAndroid Build Coastguard Worker} 1616*1b3f573fSAndroid Build Coastguard Worker 1617*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 1618*1b3f573fSAndroid Build Coastguard Worker return [[GPBDoubleArray allocWithZone:zone] initWithValues:_values count:_count]; 1619*1b3f573fSAndroid Build Coastguard Worker} 1620*1b3f573fSAndroid Build Coastguard Worker 1621*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc { 1622*1b3f573fSAndroid Build Coastguard Worker NSAssert(!_autocreator, 1623*1b3f573fSAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 1624*1b3f573fSAndroid Build Coastguard Worker [self class], _autocreator); 1625*1b3f573fSAndroid Build Coastguard Worker free(_values); 1626*1b3f573fSAndroid Build Coastguard Worker [super dealloc]; 1627*1b3f573fSAndroid Build Coastguard Worker} 1628*1b3f573fSAndroid Build Coastguard Worker 1629*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 1630*1b3f573fSAndroid Build Coastguard Worker if (self == other) { 1631*1b3f573fSAndroid Build Coastguard Worker return YES; 1632*1b3f573fSAndroid Build Coastguard Worker } 1633*1b3f573fSAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBDoubleArray class]]) { 1634*1b3f573fSAndroid Build Coastguard Worker return NO; 1635*1b3f573fSAndroid Build Coastguard Worker } 1636*1b3f573fSAndroid Build Coastguard Worker GPBDoubleArray *otherArray = other; 1637*1b3f573fSAndroid Build Coastguard Worker return (_count == otherArray->_count 1638*1b3f573fSAndroid Build Coastguard Worker && memcmp(_values, otherArray->_values, (_count * sizeof(double))) == 0); 1639*1b3f573fSAndroid Build Coastguard Worker} 1640*1b3f573fSAndroid Build Coastguard Worker 1641*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash { 1642*1b3f573fSAndroid Build Coastguard Worker // Follow NSArray's lead, and use the count as the hash. 1643*1b3f573fSAndroid Build Coastguard Worker return _count; 1644*1b3f573fSAndroid Build Coastguard Worker} 1645*1b3f573fSAndroid Build Coastguard Worker 1646*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description { 1647*1b3f573fSAndroid Build Coastguard Worker NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> { ", [self class], self]; 1648*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = 0, count = _count; i < count; ++i) { 1649*1b3f573fSAndroid Build Coastguard Worker if (i == 0) { 1650*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@"%lf", _values[i]]; 1651*1b3f573fSAndroid Build Coastguard Worker } else { 1652*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@", %lf", _values[i]]; 1653*1b3f573fSAndroid Build Coastguard Worker } 1654*1b3f573fSAndroid Build Coastguard Worker } 1655*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@" }"]; 1656*1b3f573fSAndroid Build Coastguard Worker return result; 1657*1b3f573fSAndroid Build Coastguard Worker} 1658*1b3f573fSAndroid Build Coastguard Worker 1659*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(double value, NSUInteger idx, BOOL *stop))block { 1660*1b3f573fSAndroid Build Coastguard Worker [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block]; 1661*1b3f573fSAndroid Build Coastguard Worker} 1662*1b3f573fSAndroid Build Coastguard Worker 1663*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts 1664*1b3f573fSAndroid Build Coastguard Worker usingBlock:(void (NS_NOESCAPE ^)(double value, NSUInteger idx, BOOL *stop))block { 1665*1b3f573fSAndroid Build Coastguard Worker // NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok). 1666*1b3f573fSAndroid Build Coastguard Worker BOOL stop = NO; 1667*1b3f573fSAndroid Build Coastguard Worker if ((opts & NSEnumerationReverse) == 0) { 1668*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = 0, count = _count; i < count; ++i) { 1669*1b3f573fSAndroid Build Coastguard Worker block(_values[i], i, &stop); 1670*1b3f573fSAndroid Build Coastguard Worker if (stop) break; 1671*1b3f573fSAndroid Build Coastguard Worker } 1672*1b3f573fSAndroid Build Coastguard Worker } else if (_count > 0) { 1673*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = _count; i > 0; --i) { 1674*1b3f573fSAndroid Build Coastguard Worker block(_values[i - 1], (i - 1), &stop); 1675*1b3f573fSAndroid Build Coastguard Worker if (stop) break; 1676*1b3f573fSAndroid Build Coastguard Worker } 1677*1b3f573fSAndroid Build Coastguard Worker } 1678*1b3f573fSAndroid Build Coastguard Worker} 1679*1b3f573fSAndroid Build Coastguard Worker 1680*1b3f573fSAndroid Build Coastguard Worker- (double)valueAtIndex:(NSUInteger)index { 1681*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 1682*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1683*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1684*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 1685*1b3f573fSAndroid Build Coastguard Worker } 1686*1b3f573fSAndroid Build Coastguard Worker return _values[index]; 1687*1b3f573fSAndroid Build Coastguard Worker} 1688*1b3f573fSAndroid Build Coastguard Worker 1689*1b3f573fSAndroid Build Coastguard Worker- (void)internalResizeToCapacity:(NSUInteger)newCapacity { 1690*1b3f573fSAndroid Build Coastguard Worker _values = reallocf(_values, newCapacity * sizeof(double)); 1691*1b3f573fSAndroid Build Coastguard Worker if (_values == NULL) { 1692*1b3f573fSAndroid Build Coastguard Worker _capacity = 0; 1693*1b3f573fSAndroid Build Coastguard Worker _count = 0; 1694*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSMallocException 1695*1b3f573fSAndroid Build Coastguard Worker format:@"Failed to allocate %lu bytes", 1696*1b3f573fSAndroid Build Coastguard Worker (unsigned long)(newCapacity * sizeof(double))]; 1697*1b3f573fSAndroid Build Coastguard Worker } 1698*1b3f573fSAndroid Build Coastguard Worker _capacity = newCapacity; 1699*1b3f573fSAndroid Build Coastguard Worker} 1700*1b3f573fSAndroid Build Coastguard Worker 1701*1b3f573fSAndroid Build Coastguard Worker- (void)addValue:(double)value { 1702*1b3f573fSAndroid Build Coastguard Worker [self addValues:&value count:1]; 1703*1b3f573fSAndroid Build Coastguard Worker} 1704*1b3f573fSAndroid Build Coastguard Worker 1705*1b3f573fSAndroid Build Coastguard Worker- (void)addValues:(const double [])values count:(NSUInteger)count { 1706*1b3f573fSAndroid Build Coastguard Worker if (values == NULL || count == 0) return; 1707*1b3f573fSAndroid Build Coastguard Worker NSUInteger initialCount = _count; 1708*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = initialCount + count; 1709*1b3f573fSAndroid Build Coastguard Worker if (newCount > _capacity) { 1710*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 1711*1b3f573fSAndroid Build Coastguard Worker } 1712*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 1713*1b3f573fSAndroid Build Coastguard Worker memcpy(&_values[initialCount], values, count * sizeof(double)); 1714*1b3f573fSAndroid Build Coastguard Worker if (_autocreator) { 1715*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedArrayModified(_autocreator, self); 1716*1b3f573fSAndroid Build Coastguard Worker } 1717*1b3f573fSAndroid Build Coastguard Worker} 1718*1b3f573fSAndroid Build Coastguard Worker 1719*1b3f573fSAndroid Build Coastguard Worker- (void)insertValue:(double)value atIndex:(NSUInteger)index { 1720*1b3f573fSAndroid Build Coastguard Worker if (index >= _count + 1) { 1721*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1722*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1723*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count + 1]; 1724*1b3f573fSAndroid Build Coastguard Worker } 1725*1b3f573fSAndroid Build Coastguard Worker NSUInteger initialCount = _count; 1726*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = initialCount + 1; 1727*1b3f573fSAndroid Build Coastguard Worker if (newCount > _capacity) { 1728*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 1729*1b3f573fSAndroid Build Coastguard Worker } 1730*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 1731*1b3f573fSAndroid Build Coastguard Worker if (index != initialCount) { 1732*1b3f573fSAndroid Build Coastguard Worker memmove(&_values[index + 1], &_values[index], (initialCount - index) * sizeof(double)); 1733*1b3f573fSAndroid Build Coastguard Worker } 1734*1b3f573fSAndroid Build Coastguard Worker _values[index] = value; 1735*1b3f573fSAndroid Build Coastguard Worker if (_autocreator) { 1736*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedArrayModified(_autocreator, self); 1737*1b3f573fSAndroid Build Coastguard Worker } 1738*1b3f573fSAndroid Build Coastguard Worker} 1739*1b3f573fSAndroid Build Coastguard Worker 1740*1b3f573fSAndroid Build Coastguard Worker- (void)replaceValueAtIndex:(NSUInteger)index withValue:(double)value { 1741*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 1742*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1743*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1744*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 1745*1b3f573fSAndroid Build Coastguard Worker } 1746*1b3f573fSAndroid Build Coastguard Worker _values[index] = value; 1747*1b3f573fSAndroid Build Coastguard Worker} 1748*1b3f573fSAndroid Build Coastguard Worker 1749*1b3f573fSAndroid Build Coastguard Worker- (void)addValuesFromArray:(GPBDoubleArray *)array { 1750*1b3f573fSAndroid Build Coastguard Worker [self addValues:array->_values count:array->_count]; 1751*1b3f573fSAndroid Build Coastguard Worker} 1752*1b3f573fSAndroid Build Coastguard Worker 1753*1b3f573fSAndroid Build Coastguard Worker- (void)removeValueAtIndex:(NSUInteger)index { 1754*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 1755*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1756*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1757*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 1758*1b3f573fSAndroid Build Coastguard Worker } 1759*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = _count - 1; 1760*1b3f573fSAndroid Build Coastguard Worker if (index != newCount) { 1761*1b3f573fSAndroid Build Coastguard Worker memmove(&_values[index], &_values[index + 1], (newCount - index) * sizeof(double)); 1762*1b3f573fSAndroid Build Coastguard Worker } 1763*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 1764*1b3f573fSAndroid Build Coastguard Worker if ((newCount + (2 * kChunkSize)) < _capacity) { 1765*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 1766*1b3f573fSAndroid Build Coastguard Worker } 1767*1b3f573fSAndroid Build Coastguard Worker} 1768*1b3f573fSAndroid Build Coastguard Worker 1769*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll { 1770*1b3f573fSAndroid Build Coastguard Worker _count = 0; 1771*1b3f573fSAndroid Build Coastguard Worker if ((0 + (2 * kChunkSize)) < _capacity) { 1772*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(0)]; 1773*1b3f573fSAndroid Build Coastguard Worker } 1774*1b3f573fSAndroid Build Coastguard Worker} 1775*1b3f573fSAndroid Build Coastguard Worker 1776*1b3f573fSAndroid Build Coastguard Worker- (void)exchangeValueAtIndex:(NSUInteger)idx1 1777*1b3f573fSAndroid Build Coastguard Worker withValueAtIndex:(NSUInteger)idx2 { 1778*1b3f573fSAndroid Build Coastguard Worker if (idx1 >= _count) { 1779*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1780*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1781*1b3f573fSAndroid Build Coastguard Worker (unsigned long)idx1, (unsigned long)_count]; 1782*1b3f573fSAndroid Build Coastguard Worker } 1783*1b3f573fSAndroid Build Coastguard Worker if (idx2 >= _count) { 1784*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1785*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1786*1b3f573fSAndroid Build Coastguard Worker (unsigned long)idx2, (unsigned long)_count]; 1787*1b3f573fSAndroid Build Coastguard Worker } 1788*1b3f573fSAndroid Build Coastguard Worker double temp = _values[idx1]; 1789*1b3f573fSAndroid Build Coastguard Worker _values[idx1] = _values[idx2]; 1790*1b3f573fSAndroid Build Coastguard Worker _values[idx2] = temp; 1791*1b3f573fSAndroid Build Coastguard Worker} 1792*1b3f573fSAndroid Build Coastguard Worker 1793*1b3f573fSAndroid Build Coastguard Worker@end 1794*1b3f573fSAndroid Build Coastguard Worker 1795*1b3f573fSAndroid Build Coastguard Worker// clang-format on 1796*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND ARRAY_INTERFACE_SIMPLE(Bool, BOOL, %d) 1797*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 1798*1b3f573fSAndroid Build Coastguard Worker// clang-format off 1799*1b3f573fSAndroid Build Coastguard Worker 1800*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Bool 1801*1b3f573fSAndroid Build Coastguard Worker 1802*1b3f573fSAndroid Build Coastguard Worker@implementation GPBBoolArray { 1803*1b3f573fSAndroid Build Coastguard Worker @package 1804*1b3f573fSAndroid Build Coastguard Worker BOOL *_values; 1805*1b3f573fSAndroid Build Coastguard Worker NSUInteger _count; 1806*1b3f573fSAndroid Build Coastguard Worker NSUInteger _capacity; 1807*1b3f573fSAndroid Build Coastguard Worker} 1808*1b3f573fSAndroid Build Coastguard Worker 1809*1b3f573fSAndroid Build Coastguard Worker@synthesize count = _count; 1810*1b3f573fSAndroid Build Coastguard Worker 1811*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)array { 1812*1b3f573fSAndroid Build Coastguard Worker return [[[self alloc] init] autorelease]; 1813*1b3f573fSAndroid Build Coastguard Worker} 1814*1b3f573fSAndroid Build Coastguard Worker 1815*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithValue:(BOOL)value { 1816*1b3f573fSAndroid Build Coastguard Worker // Cast is needed so the compiler knows what class we are invoking initWithValues: on to get 1817*1b3f573fSAndroid Build Coastguard Worker // the type correct. 1818*1b3f573fSAndroid Build Coastguard Worker return [[(GPBBoolArray*)[self alloc] initWithValues:&value count:1] autorelease]; 1819*1b3f573fSAndroid Build Coastguard Worker} 1820*1b3f573fSAndroid Build Coastguard Worker 1821*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithValueArray:(GPBBoolArray *)array { 1822*1b3f573fSAndroid Build Coastguard Worker return [[(GPBBoolArray*)[self alloc] initWithValueArray:array] autorelease]; 1823*1b3f573fSAndroid Build Coastguard Worker} 1824*1b3f573fSAndroid Build Coastguard Worker 1825*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithCapacity:(NSUInteger)count { 1826*1b3f573fSAndroid Build Coastguard Worker return [[[self alloc] initWithCapacity:count] autorelease]; 1827*1b3f573fSAndroid Build Coastguard Worker} 1828*1b3f573fSAndroid Build Coastguard Worker 1829*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init { 1830*1b3f573fSAndroid Build Coastguard Worker self = [super init]; 1831*1b3f573fSAndroid Build Coastguard Worker // No work needed; 1832*1b3f573fSAndroid Build Coastguard Worker return self; 1833*1b3f573fSAndroid Build Coastguard Worker} 1834*1b3f573fSAndroid Build Coastguard Worker 1835*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValueArray:(GPBBoolArray *)array { 1836*1b3f573fSAndroid Build Coastguard Worker return [self initWithValues:array->_values count:array->_count]; 1837*1b3f573fSAndroid Build Coastguard Worker} 1838*1b3f573fSAndroid Build Coastguard Worker 1839*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValues:(const BOOL [])values count:(NSUInteger)count { 1840*1b3f573fSAndroid Build Coastguard Worker self = [self init]; 1841*1b3f573fSAndroid Build Coastguard Worker if (self) { 1842*1b3f573fSAndroid Build Coastguard Worker if (count && values) { 1843*1b3f573fSAndroid Build Coastguard Worker _values = reallocf(_values, count * sizeof(BOOL)); 1844*1b3f573fSAndroid Build Coastguard Worker if (_values != NULL) { 1845*1b3f573fSAndroid Build Coastguard Worker _capacity = count; 1846*1b3f573fSAndroid Build Coastguard Worker memcpy(_values, values, count * sizeof(BOOL)); 1847*1b3f573fSAndroid Build Coastguard Worker _count = count; 1848*1b3f573fSAndroid Build Coastguard Worker } else { 1849*1b3f573fSAndroid Build Coastguard Worker [self release]; 1850*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSMallocException 1851*1b3f573fSAndroid Build Coastguard Worker format:@"Failed to allocate %lu bytes", 1852*1b3f573fSAndroid Build Coastguard Worker (unsigned long)(count * sizeof(BOOL))]; 1853*1b3f573fSAndroid Build Coastguard Worker } 1854*1b3f573fSAndroid Build Coastguard Worker } 1855*1b3f573fSAndroid Build Coastguard Worker } 1856*1b3f573fSAndroid Build Coastguard Worker return self; 1857*1b3f573fSAndroid Build Coastguard Worker} 1858*1b3f573fSAndroid Build Coastguard Worker 1859*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithCapacity:(NSUInteger)count { 1860*1b3f573fSAndroid Build Coastguard Worker self = [self initWithValues:NULL count:0]; 1861*1b3f573fSAndroid Build Coastguard Worker if (self && count) { 1862*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:count]; 1863*1b3f573fSAndroid Build Coastguard Worker } 1864*1b3f573fSAndroid Build Coastguard Worker return self; 1865*1b3f573fSAndroid Build Coastguard Worker} 1866*1b3f573fSAndroid Build Coastguard Worker 1867*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 1868*1b3f573fSAndroid Build Coastguard Worker return [[GPBBoolArray allocWithZone:zone] initWithValues:_values count:_count]; 1869*1b3f573fSAndroid Build Coastguard Worker} 1870*1b3f573fSAndroid Build Coastguard Worker 1871*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc { 1872*1b3f573fSAndroid Build Coastguard Worker NSAssert(!_autocreator, 1873*1b3f573fSAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 1874*1b3f573fSAndroid Build Coastguard Worker [self class], _autocreator); 1875*1b3f573fSAndroid Build Coastguard Worker free(_values); 1876*1b3f573fSAndroid Build Coastguard Worker [super dealloc]; 1877*1b3f573fSAndroid Build Coastguard Worker} 1878*1b3f573fSAndroid Build Coastguard Worker 1879*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 1880*1b3f573fSAndroid Build Coastguard Worker if (self == other) { 1881*1b3f573fSAndroid Build Coastguard Worker return YES; 1882*1b3f573fSAndroid Build Coastguard Worker } 1883*1b3f573fSAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBBoolArray class]]) { 1884*1b3f573fSAndroid Build Coastguard Worker return NO; 1885*1b3f573fSAndroid Build Coastguard Worker } 1886*1b3f573fSAndroid Build Coastguard Worker GPBBoolArray *otherArray = other; 1887*1b3f573fSAndroid Build Coastguard Worker return (_count == otherArray->_count 1888*1b3f573fSAndroid Build Coastguard Worker && memcmp(_values, otherArray->_values, (_count * sizeof(BOOL))) == 0); 1889*1b3f573fSAndroid Build Coastguard Worker} 1890*1b3f573fSAndroid Build Coastguard Worker 1891*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash { 1892*1b3f573fSAndroid Build Coastguard Worker // Follow NSArray's lead, and use the count as the hash. 1893*1b3f573fSAndroid Build Coastguard Worker return _count; 1894*1b3f573fSAndroid Build Coastguard Worker} 1895*1b3f573fSAndroid Build Coastguard Worker 1896*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description { 1897*1b3f573fSAndroid Build Coastguard Worker NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> { ", [self class], self]; 1898*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = 0, count = _count; i < count; ++i) { 1899*1b3f573fSAndroid Build Coastguard Worker if (i == 0) { 1900*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@"%d", _values[i]]; 1901*1b3f573fSAndroid Build Coastguard Worker } else { 1902*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@", %d", _values[i]]; 1903*1b3f573fSAndroid Build Coastguard Worker } 1904*1b3f573fSAndroid Build Coastguard Worker } 1905*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@" }"]; 1906*1b3f573fSAndroid Build Coastguard Worker return result; 1907*1b3f573fSAndroid Build Coastguard Worker} 1908*1b3f573fSAndroid Build Coastguard Worker 1909*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(BOOL value, NSUInteger idx, BOOL *stop))block { 1910*1b3f573fSAndroid Build Coastguard Worker [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block]; 1911*1b3f573fSAndroid Build Coastguard Worker} 1912*1b3f573fSAndroid Build Coastguard Worker 1913*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts 1914*1b3f573fSAndroid Build Coastguard Worker usingBlock:(void (NS_NOESCAPE ^)(BOOL value, NSUInteger idx, BOOL *stop))block { 1915*1b3f573fSAndroid Build Coastguard Worker // NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok). 1916*1b3f573fSAndroid Build Coastguard Worker BOOL stop = NO; 1917*1b3f573fSAndroid Build Coastguard Worker if ((opts & NSEnumerationReverse) == 0) { 1918*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = 0, count = _count; i < count; ++i) { 1919*1b3f573fSAndroid Build Coastguard Worker block(_values[i], i, &stop); 1920*1b3f573fSAndroid Build Coastguard Worker if (stop) break; 1921*1b3f573fSAndroid Build Coastguard Worker } 1922*1b3f573fSAndroid Build Coastguard Worker } else if (_count > 0) { 1923*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = _count; i > 0; --i) { 1924*1b3f573fSAndroid Build Coastguard Worker block(_values[i - 1], (i - 1), &stop); 1925*1b3f573fSAndroid Build Coastguard Worker if (stop) break; 1926*1b3f573fSAndroid Build Coastguard Worker } 1927*1b3f573fSAndroid Build Coastguard Worker } 1928*1b3f573fSAndroid Build Coastguard Worker} 1929*1b3f573fSAndroid Build Coastguard Worker 1930*1b3f573fSAndroid Build Coastguard Worker- (BOOL)valueAtIndex:(NSUInteger)index { 1931*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 1932*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1933*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1934*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 1935*1b3f573fSAndroid Build Coastguard Worker } 1936*1b3f573fSAndroid Build Coastguard Worker return _values[index]; 1937*1b3f573fSAndroid Build Coastguard Worker} 1938*1b3f573fSAndroid Build Coastguard Worker 1939*1b3f573fSAndroid Build Coastguard Worker- (void)internalResizeToCapacity:(NSUInteger)newCapacity { 1940*1b3f573fSAndroid Build Coastguard Worker _values = reallocf(_values, newCapacity * sizeof(BOOL)); 1941*1b3f573fSAndroid Build Coastguard Worker if (_values == NULL) { 1942*1b3f573fSAndroid Build Coastguard Worker _capacity = 0; 1943*1b3f573fSAndroid Build Coastguard Worker _count = 0; 1944*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSMallocException 1945*1b3f573fSAndroid Build Coastguard Worker format:@"Failed to allocate %lu bytes", 1946*1b3f573fSAndroid Build Coastguard Worker (unsigned long)(newCapacity * sizeof(BOOL))]; 1947*1b3f573fSAndroid Build Coastguard Worker } 1948*1b3f573fSAndroid Build Coastguard Worker _capacity = newCapacity; 1949*1b3f573fSAndroid Build Coastguard Worker} 1950*1b3f573fSAndroid Build Coastguard Worker 1951*1b3f573fSAndroid Build Coastguard Worker- (void)addValue:(BOOL)value { 1952*1b3f573fSAndroid Build Coastguard Worker [self addValues:&value count:1]; 1953*1b3f573fSAndroid Build Coastguard Worker} 1954*1b3f573fSAndroid Build Coastguard Worker 1955*1b3f573fSAndroid Build Coastguard Worker- (void)addValues:(const BOOL [])values count:(NSUInteger)count { 1956*1b3f573fSAndroid Build Coastguard Worker if (values == NULL || count == 0) return; 1957*1b3f573fSAndroid Build Coastguard Worker NSUInteger initialCount = _count; 1958*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = initialCount + count; 1959*1b3f573fSAndroid Build Coastguard Worker if (newCount > _capacity) { 1960*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 1961*1b3f573fSAndroid Build Coastguard Worker } 1962*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 1963*1b3f573fSAndroid Build Coastguard Worker memcpy(&_values[initialCount], values, count * sizeof(BOOL)); 1964*1b3f573fSAndroid Build Coastguard Worker if (_autocreator) { 1965*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedArrayModified(_autocreator, self); 1966*1b3f573fSAndroid Build Coastguard Worker } 1967*1b3f573fSAndroid Build Coastguard Worker} 1968*1b3f573fSAndroid Build Coastguard Worker 1969*1b3f573fSAndroid Build Coastguard Worker- (void)insertValue:(BOOL)value atIndex:(NSUInteger)index { 1970*1b3f573fSAndroid Build Coastguard Worker if (index >= _count + 1) { 1971*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1972*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1973*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count + 1]; 1974*1b3f573fSAndroid Build Coastguard Worker } 1975*1b3f573fSAndroid Build Coastguard Worker NSUInteger initialCount = _count; 1976*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = initialCount + 1; 1977*1b3f573fSAndroid Build Coastguard Worker if (newCount > _capacity) { 1978*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 1979*1b3f573fSAndroid Build Coastguard Worker } 1980*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 1981*1b3f573fSAndroid Build Coastguard Worker if (index != initialCount) { 1982*1b3f573fSAndroid Build Coastguard Worker memmove(&_values[index + 1], &_values[index], (initialCount - index) * sizeof(BOOL)); 1983*1b3f573fSAndroid Build Coastguard Worker } 1984*1b3f573fSAndroid Build Coastguard Worker _values[index] = value; 1985*1b3f573fSAndroid Build Coastguard Worker if (_autocreator) { 1986*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedArrayModified(_autocreator, self); 1987*1b3f573fSAndroid Build Coastguard Worker } 1988*1b3f573fSAndroid Build Coastguard Worker} 1989*1b3f573fSAndroid Build Coastguard Worker 1990*1b3f573fSAndroid Build Coastguard Worker- (void)replaceValueAtIndex:(NSUInteger)index withValue:(BOOL)value { 1991*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 1992*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 1993*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 1994*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 1995*1b3f573fSAndroid Build Coastguard Worker } 1996*1b3f573fSAndroid Build Coastguard Worker _values[index] = value; 1997*1b3f573fSAndroid Build Coastguard Worker} 1998*1b3f573fSAndroid Build Coastguard Worker 1999*1b3f573fSAndroid Build Coastguard Worker- (void)addValuesFromArray:(GPBBoolArray *)array { 2000*1b3f573fSAndroid Build Coastguard Worker [self addValues:array->_values count:array->_count]; 2001*1b3f573fSAndroid Build Coastguard Worker} 2002*1b3f573fSAndroid Build Coastguard Worker 2003*1b3f573fSAndroid Build Coastguard Worker- (void)removeValueAtIndex:(NSUInteger)index { 2004*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 2005*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 2006*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 2007*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 2008*1b3f573fSAndroid Build Coastguard Worker } 2009*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = _count - 1; 2010*1b3f573fSAndroid Build Coastguard Worker if (index != newCount) { 2011*1b3f573fSAndroid Build Coastguard Worker memmove(&_values[index], &_values[index + 1], (newCount - index) * sizeof(BOOL)); 2012*1b3f573fSAndroid Build Coastguard Worker } 2013*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 2014*1b3f573fSAndroid Build Coastguard Worker if ((newCount + (2 * kChunkSize)) < _capacity) { 2015*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 2016*1b3f573fSAndroid Build Coastguard Worker } 2017*1b3f573fSAndroid Build Coastguard Worker} 2018*1b3f573fSAndroid Build Coastguard Worker 2019*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll { 2020*1b3f573fSAndroid Build Coastguard Worker _count = 0; 2021*1b3f573fSAndroid Build Coastguard Worker if ((0 + (2 * kChunkSize)) < _capacity) { 2022*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(0)]; 2023*1b3f573fSAndroid Build Coastguard Worker } 2024*1b3f573fSAndroid Build Coastguard Worker} 2025*1b3f573fSAndroid Build Coastguard Worker 2026*1b3f573fSAndroid Build Coastguard Worker- (void)exchangeValueAtIndex:(NSUInteger)idx1 2027*1b3f573fSAndroid Build Coastguard Worker withValueAtIndex:(NSUInteger)idx2 { 2028*1b3f573fSAndroid Build Coastguard Worker if (idx1 >= _count) { 2029*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 2030*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 2031*1b3f573fSAndroid Build Coastguard Worker (unsigned long)idx1, (unsigned long)_count]; 2032*1b3f573fSAndroid Build Coastguard Worker } 2033*1b3f573fSAndroid Build Coastguard Worker if (idx2 >= _count) { 2034*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 2035*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 2036*1b3f573fSAndroid Build Coastguard Worker (unsigned long)idx2, (unsigned long)_count]; 2037*1b3f573fSAndroid Build Coastguard Worker } 2038*1b3f573fSAndroid Build Coastguard Worker BOOL temp = _values[idx1]; 2039*1b3f573fSAndroid Build Coastguard Worker _values[idx1] = _values[idx2]; 2040*1b3f573fSAndroid Build Coastguard Worker _values[idx2] = temp; 2041*1b3f573fSAndroid Build Coastguard Worker} 2042*1b3f573fSAndroid Build Coastguard Worker 2043*1b3f573fSAndroid Build Coastguard Worker@end 2044*1b3f573fSAndroid Build Coastguard Worker 2045*1b3f573fSAndroid Build Coastguard Worker// clang-format on 2046*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND-END (7 expansions) 2047*1b3f573fSAndroid Build Coastguard Worker 2048*1b3f573fSAndroid Build Coastguard Worker#pragma mark - Enum 2049*1b3f573fSAndroid Build Coastguard Worker 2050*1b3f573fSAndroid Build Coastguard Worker@implementation GPBEnumArray { 2051*1b3f573fSAndroid Build Coastguard Worker @package 2052*1b3f573fSAndroid Build Coastguard Worker GPBEnumValidationFunc _validationFunc; 2053*1b3f573fSAndroid Build Coastguard Worker int32_t *_values; 2054*1b3f573fSAndroid Build Coastguard Worker NSUInteger _count; 2055*1b3f573fSAndroid Build Coastguard Worker NSUInteger _capacity; 2056*1b3f573fSAndroid Build Coastguard Worker} 2057*1b3f573fSAndroid Build Coastguard Worker 2058*1b3f573fSAndroid Build Coastguard Worker@synthesize count = _count; 2059*1b3f573fSAndroid Build Coastguard Worker@synthesize validationFunc = _validationFunc; 2060*1b3f573fSAndroid Build Coastguard Worker 2061*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)array { 2062*1b3f573fSAndroid Build Coastguard Worker return [[[self alloc] initWithValidationFunction:NULL] autorelease]; 2063*1b3f573fSAndroid Build Coastguard Worker} 2064*1b3f573fSAndroid Build Coastguard Worker 2065*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithValidationFunction:(GPBEnumValidationFunc)func { 2066*1b3f573fSAndroid Build Coastguard Worker return [[[self alloc] initWithValidationFunction:func] autorelease]; 2067*1b3f573fSAndroid Build Coastguard Worker} 2068*1b3f573fSAndroid Build Coastguard Worker 2069*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithValidationFunction:(GPBEnumValidationFunc)func 2070*1b3f573fSAndroid Build Coastguard Worker rawValue:(int32_t)value { 2071*1b3f573fSAndroid Build Coastguard Worker return [[[self alloc] initWithValidationFunction:func 2072*1b3f573fSAndroid Build Coastguard Worker rawValues:&value 2073*1b3f573fSAndroid Build Coastguard Worker count:1] autorelease]; 2074*1b3f573fSAndroid Build Coastguard Worker} 2075*1b3f573fSAndroid Build Coastguard Worker 2076*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithValueArray:(GPBEnumArray *)array { 2077*1b3f573fSAndroid Build Coastguard Worker return [[(GPBEnumArray*)[self alloc] initWithValueArray:array] autorelease]; 2078*1b3f573fSAndroid Build Coastguard Worker} 2079*1b3f573fSAndroid Build Coastguard Worker 2080*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)arrayWithValidationFunction:(GPBEnumValidationFunc)func 2081*1b3f573fSAndroid Build Coastguard Worker capacity:(NSUInteger)count { 2082*1b3f573fSAndroid Build Coastguard Worker return [[[self alloc] initWithValidationFunction:func capacity:count] autorelease]; 2083*1b3f573fSAndroid Build Coastguard Worker} 2084*1b3f573fSAndroid Build Coastguard Worker 2085*1b3f573fSAndroid Build Coastguard Worker- (instancetype)init { 2086*1b3f573fSAndroid Build Coastguard Worker return [self initWithValidationFunction:NULL]; 2087*1b3f573fSAndroid Build Coastguard Worker} 2088*1b3f573fSAndroid Build Coastguard Worker 2089*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValueArray:(GPBEnumArray *)array { 2090*1b3f573fSAndroid Build Coastguard Worker return [self initWithValidationFunction:array->_validationFunc 2091*1b3f573fSAndroid Build Coastguard Worker rawValues:array->_values 2092*1b3f573fSAndroid Build Coastguard Worker count:array->_count]; 2093*1b3f573fSAndroid Build Coastguard Worker} 2094*1b3f573fSAndroid Build Coastguard Worker 2095*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func { 2096*1b3f573fSAndroid Build Coastguard Worker self = [super init]; 2097*1b3f573fSAndroid Build Coastguard Worker if (self) { 2098*1b3f573fSAndroid Build Coastguard Worker _validationFunc = (func != NULL ? func : ArrayDefault_IsValidValue); 2099*1b3f573fSAndroid Build Coastguard Worker } 2100*1b3f573fSAndroid Build Coastguard Worker return self; 2101*1b3f573fSAndroid Build Coastguard Worker} 2102*1b3f573fSAndroid Build Coastguard Worker 2103*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func 2104*1b3f573fSAndroid Build Coastguard Worker rawValues:(const int32_t [])values 2105*1b3f573fSAndroid Build Coastguard Worker count:(NSUInteger)count { 2106*1b3f573fSAndroid Build Coastguard Worker self = [self initWithValidationFunction:func]; 2107*1b3f573fSAndroid Build Coastguard Worker if (self) { 2108*1b3f573fSAndroid Build Coastguard Worker if (count && values) { 2109*1b3f573fSAndroid Build Coastguard Worker _values = reallocf(_values, count * sizeof(int32_t)); 2110*1b3f573fSAndroid Build Coastguard Worker if (_values != NULL) { 2111*1b3f573fSAndroid Build Coastguard Worker _capacity = count; 2112*1b3f573fSAndroid Build Coastguard Worker memcpy(_values, values, count * sizeof(int32_t)); 2113*1b3f573fSAndroid Build Coastguard Worker _count = count; 2114*1b3f573fSAndroid Build Coastguard Worker } else { 2115*1b3f573fSAndroid Build Coastguard Worker [self release]; 2116*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSMallocException 2117*1b3f573fSAndroid Build Coastguard Worker format:@"Failed to allocate %lu bytes", 2118*1b3f573fSAndroid Build Coastguard Worker (unsigned long)(count * sizeof(int32_t))]; 2119*1b3f573fSAndroid Build Coastguard Worker } 2120*1b3f573fSAndroid Build Coastguard Worker } 2121*1b3f573fSAndroid Build Coastguard Worker } 2122*1b3f573fSAndroid Build Coastguard Worker return self; 2123*1b3f573fSAndroid Build Coastguard Worker} 2124*1b3f573fSAndroid Build Coastguard Worker 2125*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithValidationFunction:(GPBEnumValidationFunc)func 2126*1b3f573fSAndroid Build Coastguard Worker capacity:(NSUInteger)count { 2127*1b3f573fSAndroid Build Coastguard Worker self = [self initWithValidationFunction:func]; 2128*1b3f573fSAndroid Build Coastguard Worker if (self && count) { 2129*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:count]; 2130*1b3f573fSAndroid Build Coastguard Worker } 2131*1b3f573fSAndroid Build Coastguard Worker return self; 2132*1b3f573fSAndroid Build Coastguard Worker} 2133*1b3f573fSAndroid Build Coastguard Worker 2134*1b3f573fSAndroid Build Coastguard Worker- (instancetype)copyWithZone:(NSZone *)zone { 2135*1b3f573fSAndroid Build Coastguard Worker return [[GPBEnumArray allocWithZone:zone] 2136*1b3f573fSAndroid Build Coastguard Worker initWithValidationFunction:_validationFunc 2137*1b3f573fSAndroid Build Coastguard Worker rawValues:_values 2138*1b3f573fSAndroid Build Coastguard Worker count:_count]; 2139*1b3f573fSAndroid Build Coastguard Worker} 2140*1b3f573fSAndroid Build Coastguard Worker 2141*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND ARRAY_IMMUTABLE_CORE(Enum, int32_t, Raw, %d) 2142*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 2143*1b3f573fSAndroid Build Coastguard Worker// clang-format off 2144*1b3f573fSAndroid Build Coastguard Worker 2145*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc { 2146*1b3f573fSAndroid Build Coastguard Worker NSAssert(!_autocreator, 2147*1b3f573fSAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 2148*1b3f573fSAndroid Build Coastguard Worker [self class], _autocreator); 2149*1b3f573fSAndroid Build Coastguard Worker free(_values); 2150*1b3f573fSAndroid Build Coastguard Worker [super dealloc]; 2151*1b3f573fSAndroid Build Coastguard Worker} 2152*1b3f573fSAndroid Build Coastguard Worker 2153*1b3f573fSAndroid Build Coastguard Worker- (BOOL)isEqual:(id)other { 2154*1b3f573fSAndroid Build Coastguard Worker if (self == other) { 2155*1b3f573fSAndroid Build Coastguard Worker return YES; 2156*1b3f573fSAndroid Build Coastguard Worker } 2157*1b3f573fSAndroid Build Coastguard Worker if (![other isKindOfClass:[GPBEnumArray class]]) { 2158*1b3f573fSAndroid Build Coastguard Worker return NO; 2159*1b3f573fSAndroid Build Coastguard Worker } 2160*1b3f573fSAndroid Build Coastguard Worker GPBEnumArray *otherArray = other; 2161*1b3f573fSAndroid Build Coastguard Worker return (_count == otherArray->_count 2162*1b3f573fSAndroid Build Coastguard Worker && memcmp(_values, otherArray->_values, (_count * sizeof(int32_t))) == 0); 2163*1b3f573fSAndroid Build Coastguard Worker} 2164*1b3f573fSAndroid Build Coastguard Worker 2165*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)hash { 2166*1b3f573fSAndroid Build Coastguard Worker // Follow NSArray's lead, and use the count as the hash. 2167*1b3f573fSAndroid Build Coastguard Worker return _count; 2168*1b3f573fSAndroid Build Coastguard Worker} 2169*1b3f573fSAndroid Build Coastguard Worker 2170*1b3f573fSAndroid Build Coastguard Worker- (NSString *)description { 2171*1b3f573fSAndroid Build Coastguard Worker NSMutableString *result = [NSMutableString stringWithFormat:@"<%@ %p> { ", [self class], self]; 2172*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = 0, count = _count; i < count; ++i) { 2173*1b3f573fSAndroid Build Coastguard Worker if (i == 0) { 2174*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@"%d", _values[i]]; 2175*1b3f573fSAndroid Build Coastguard Worker } else { 2176*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@", %d", _values[i]]; 2177*1b3f573fSAndroid Build Coastguard Worker } 2178*1b3f573fSAndroid Build Coastguard Worker } 2179*1b3f573fSAndroid Build Coastguard Worker [result appendFormat:@" }"]; 2180*1b3f573fSAndroid Build Coastguard Worker return result; 2181*1b3f573fSAndroid Build Coastguard Worker} 2182*1b3f573fSAndroid Build Coastguard Worker 2183*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateRawValuesWithBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block { 2184*1b3f573fSAndroid Build Coastguard Worker [self enumerateRawValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block]; 2185*1b3f573fSAndroid Build Coastguard Worker} 2186*1b3f573fSAndroid Build Coastguard Worker 2187*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateRawValuesWithOptions:(NSEnumerationOptions)opts 2188*1b3f573fSAndroid Build Coastguard Worker usingBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block { 2189*1b3f573fSAndroid Build Coastguard Worker // NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok). 2190*1b3f573fSAndroid Build Coastguard Worker BOOL stop = NO; 2191*1b3f573fSAndroid Build Coastguard Worker if ((opts & NSEnumerationReverse) == 0) { 2192*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = 0, count = _count; i < count; ++i) { 2193*1b3f573fSAndroid Build Coastguard Worker block(_values[i], i, &stop); 2194*1b3f573fSAndroid Build Coastguard Worker if (stop) break; 2195*1b3f573fSAndroid Build Coastguard Worker } 2196*1b3f573fSAndroid Build Coastguard Worker } else if (_count > 0) { 2197*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = _count; i > 0; --i) { 2198*1b3f573fSAndroid Build Coastguard Worker block(_values[i - 1], (i - 1), &stop); 2199*1b3f573fSAndroid Build Coastguard Worker if (stop) break; 2200*1b3f573fSAndroid Build Coastguard Worker } 2201*1b3f573fSAndroid Build Coastguard Worker } 2202*1b3f573fSAndroid Build Coastguard Worker} 2203*1b3f573fSAndroid Build Coastguard Worker// clang-format on 2204*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND-END ARRAY_IMMUTABLE_CORE(Enum, int32_t, Raw, %d) 2205*1b3f573fSAndroid Build Coastguard Worker 2206*1b3f573fSAndroid Build Coastguard Worker- (int32_t)valueAtIndex:(NSUInteger)index { 2207*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND VALIDATE_RANGE(index, _count) 2208*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 2209*1b3f573fSAndroid Build Coastguard Worker// clang-format off 2210*1b3f573fSAndroid Build Coastguard Worker 2211*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 2212*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 2213*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 2214*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 2215*1b3f573fSAndroid Build Coastguard Worker } 2216*1b3f573fSAndroid Build Coastguard Worker// clang-format on 2217*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND-END VALIDATE_RANGE(index, _count) 2218*1b3f573fSAndroid Build Coastguard Worker int32_t result = _values[index]; 2219*1b3f573fSAndroid Build Coastguard Worker if (!_validationFunc(result)) { 2220*1b3f573fSAndroid Build Coastguard Worker result = kGPBUnrecognizedEnumeratorValue; 2221*1b3f573fSAndroid Build Coastguard Worker } 2222*1b3f573fSAndroid Build Coastguard Worker return result; 2223*1b3f573fSAndroid Build Coastguard Worker} 2224*1b3f573fSAndroid Build Coastguard Worker 2225*1b3f573fSAndroid Build Coastguard Worker- (int32_t)rawValueAtIndex:(NSUInteger)index { 2226*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND VALIDATE_RANGE(index, _count) 2227*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 2228*1b3f573fSAndroid Build Coastguard Worker// clang-format off 2229*1b3f573fSAndroid Build Coastguard Worker 2230*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 2231*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 2232*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 2233*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 2234*1b3f573fSAndroid Build Coastguard Worker } 2235*1b3f573fSAndroid Build Coastguard Worker// clang-format on 2236*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND-END VALIDATE_RANGE(index, _count) 2237*1b3f573fSAndroid Build Coastguard Worker return _values[index]; 2238*1b3f573fSAndroid Build Coastguard Worker} 2239*1b3f573fSAndroid Build Coastguard Worker 2240*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateValuesWithBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block { 2241*1b3f573fSAndroid Build Coastguard Worker [self enumerateValuesWithOptions:(NSEnumerationOptions)0 usingBlock:block]; 2242*1b3f573fSAndroid Build Coastguard Worker} 2243*1b3f573fSAndroid Build Coastguard Worker 2244*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateValuesWithOptions:(NSEnumerationOptions)opts 2245*1b3f573fSAndroid Build Coastguard Worker usingBlock:(void (NS_NOESCAPE ^)(int32_t value, NSUInteger idx, BOOL *stop))block { 2246*1b3f573fSAndroid Build Coastguard Worker // NSEnumerationConcurrent isn't currently supported (and Apple's docs say that is ok). 2247*1b3f573fSAndroid Build Coastguard Worker BOOL stop = NO; 2248*1b3f573fSAndroid Build Coastguard Worker GPBEnumValidationFunc func = _validationFunc; 2249*1b3f573fSAndroid Build Coastguard Worker if ((opts & NSEnumerationReverse) == 0) { 2250*1b3f573fSAndroid Build Coastguard Worker int32_t *scan = _values; 2251*1b3f573fSAndroid Build Coastguard Worker int32_t *end = scan + _count; 2252*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = 0; scan < end; ++i, ++scan) { 2253*1b3f573fSAndroid Build Coastguard Worker int32_t value = *scan; 2254*1b3f573fSAndroid Build Coastguard Worker if (!func(value)) { 2255*1b3f573fSAndroid Build Coastguard Worker value = kGPBUnrecognizedEnumeratorValue; 2256*1b3f573fSAndroid Build Coastguard Worker } 2257*1b3f573fSAndroid Build Coastguard Worker block(value, i, &stop); 2258*1b3f573fSAndroid Build Coastguard Worker if (stop) break; 2259*1b3f573fSAndroid Build Coastguard Worker } 2260*1b3f573fSAndroid Build Coastguard Worker } else if (_count > 0) { 2261*1b3f573fSAndroid Build Coastguard Worker int32_t *end = _values; 2262*1b3f573fSAndroid Build Coastguard Worker int32_t *scan = end + (_count - 1); 2263*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = (_count - 1); scan >= end; --i, --scan) { 2264*1b3f573fSAndroid Build Coastguard Worker int32_t value = *scan; 2265*1b3f573fSAndroid Build Coastguard Worker if (!func(value)) { 2266*1b3f573fSAndroid Build Coastguard Worker value = kGPBUnrecognizedEnumeratorValue; 2267*1b3f573fSAndroid Build Coastguard Worker } 2268*1b3f573fSAndroid Build Coastguard Worker block(value, i, &stop); 2269*1b3f573fSAndroid Build Coastguard Worker if (stop) break; 2270*1b3f573fSAndroid Build Coastguard Worker } 2271*1b3f573fSAndroid Build Coastguard Worker } 2272*1b3f573fSAndroid Build Coastguard Worker} 2273*1b3f573fSAndroid Build Coastguard Worker 2274*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND ARRAY_MUTABLE_CORE(Enum, int32_t, Raw, %d) 2275*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 2276*1b3f573fSAndroid Build Coastguard Worker// clang-format off 2277*1b3f573fSAndroid Build Coastguard Worker 2278*1b3f573fSAndroid Build Coastguard Worker- (void)internalResizeToCapacity:(NSUInteger)newCapacity { 2279*1b3f573fSAndroid Build Coastguard Worker _values = reallocf(_values, newCapacity * sizeof(int32_t)); 2280*1b3f573fSAndroid Build Coastguard Worker if (_values == NULL) { 2281*1b3f573fSAndroid Build Coastguard Worker _capacity = 0; 2282*1b3f573fSAndroid Build Coastguard Worker _count = 0; 2283*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSMallocException 2284*1b3f573fSAndroid Build Coastguard Worker format:@"Failed to allocate %lu bytes", 2285*1b3f573fSAndroid Build Coastguard Worker (unsigned long)(newCapacity * sizeof(int32_t))]; 2286*1b3f573fSAndroid Build Coastguard Worker } 2287*1b3f573fSAndroid Build Coastguard Worker _capacity = newCapacity; 2288*1b3f573fSAndroid Build Coastguard Worker} 2289*1b3f573fSAndroid Build Coastguard Worker 2290*1b3f573fSAndroid Build Coastguard Worker- (void)addRawValue:(int32_t)value { 2291*1b3f573fSAndroid Build Coastguard Worker [self addRawValues:&value count:1]; 2292*1b3f573fSAndroid Build Coastguard Worker} 2293*1b3f573fSAndroid Build Coastguard Worker 2294*1b3f573fSAndroid Build Coastguard Worker- (void)addRawValues:(const int32_t [])values count:(NSUInteger)count { 2295*1b3f573fSAndroid Build Coastguard Worker if (values == NULL || count == 0) return; 2296*1b3f573fSAndroid Build Coastguard Worker NSUInteger initialCount = _count; 2297*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = initialCount + count; 2298*1b3f573fSAndroid Build Coastguard Worker if (newCount > _capacity) { 2299*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 2300*1b3f573fSAndroid Build Coastguard Worker } 2301*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 2302*1b3f573fSAndroid Build Coastguard Worker memcpy(&_values[initialCount], values, count * sizeof(int32_t)); 2303*1b3f573fSAndroid Build Coastguard Worker if (_autocreator) { 2304*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedArrayModified(_autocreator, self); 2305*1b3f573fSAndroid Build Coastguard Worker } 2306*1b3f573fSAndroid Build Coastguard Worker} 2307*1b3f573fSAndroid Build Coastguard Worker 2308*1b3f573fSAndroid Build Coastguard Worker- (void)insertRawValue:(int32_t)value atIndex:(NSUInteger)index { 2309*1b3f573fSAndroid Build Coastguard Worker if (index >= _count + 1) { 2310*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 2311*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 2312*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count + 1]; 2313*1b3f573fSAndroid Build Coastguard Worker } 2314*1b3f573fSAndroid Build Coastguard Worker NSUInteger initialCount = _count; 2315*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = initialCount + 1; 2316*1b3f573fSAndroid Build Coastguard Worker if (newCount > _capacity) { 2317*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 2318*1b3f573fSAndroid Build Coastguard Worker } 2319*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 2320*1b3f573fSAndroid Build Coastguard Worker if (index != initialCount) { 2321*1b3f573fSAndroid Build Coastguard Worker memmove(&_values[index + 1], &_values[index], (initialCount - index) * sizeof(int32_t)); 2322*1b3f573fSAndroid Build Coastguard Worker } 2323*1b3f573fSAndroid Build Coastguard Worker _values[index] = value; 2324*1b3f573fSAndroid Build Coastguard Worker if (_autocreator) { 2325*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedArrayModified(_autocreator, self); 2326*1b3f573fSAndroid Build Coastguard Worker } 2327*1b3f573fSAndroid Build Coastguard Worker} 2328*1b3f573fSAndroid Build Coastguard Worker 2329*1b3f573fSAndroid Build Coastguard Worker- (void)replaceValueAtIndex:(NSUInteger)index withRawValue:(int32_t)value { 2330*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 2331*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 2332*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 2333*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 2334*1b3f573fSAndroid Build Coastguard Worker } 2335*1b3f573fSAndroid Build Coastguard Worker _values[index] = value; 2336*1b3f573fSAndroid Build Coastguard Worker} 2337*1b3f573fSAndroid Build Coastguard Worker 2338*1b3f573fSAndroid Build Coastguard Worker- (void)addRawValuesFromArray:(GPBEnumArray *)array { 2339*1b3f573fSAndroid Build Coastguard Worker [self addRawValues:array->_values count:array->_count]; 2340*1b3f573fSAndroid Build Coastguard Worker} 2341*1b3f573fSAndroid Build Coastguard Worker 2342*1b3f573fSAndroid Build Coastguard Worker- (void)removeValueAtIndex:(NSUInteger)index { 2343*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 2344*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 2345*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 2346*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 2347*1b3f573fSAndroid Build Coastguard Worker } 2348*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = _count - 1; 2349*1b3f573fSAndroid Build Coastguard Worker if (index != newCount) { 2350*1b3f573fSAndroid Build Coastguard Worker memmove(&_values[index], &_values[index + 1], (newCount - index) * sizeof(int32_t)); 2351*1b3f573fSAndroid Build Coastguard Worker } 2352*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 2353*1b3f573fSAndroid Build Coastguard Worker if ((newCount + (2 * kChunkSize)) < _capacity) { 2354*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 2355*1b3f573fSAndroid Build Coastguard Worker } 2356*1b3f573fSAndroid Build Coastguard Worker} 2357*1b3f573fSAndroid Build Coastguard Worker 2358*1b3f573fSAndroid Build Coastguard Worker- (void)removeAll { 2359*1b3f573fSAndroid Build Coastguard Worker _count = 0; 2360*1b3f573fSAndroid Build Coastguard Worker if ((0 + (2 * kChunkSize)) < _capacity) { 2361*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(0)]; 2362*1b3f573fSAndroid Build Coastguard Worker } 2363*1b3f573fSAndroid Build Coastguard Worker} 2364*1b3f573fSAndroid Build Coastguard Worker 2365*1b3f573fSAndroid Build Coastguard Worker- (void)exchangeValueAtIndex:(NSUInteger)idx1 2366*1b3f573fSAndroid Build Coastguard Worker withValueAtIndex:(NSUInteger)idx2 { 2367*1b3f573fSAndroid Build Coastguard Worker if (idx1 >= _count) { 2368*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 2369*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 2370*1b3f573fSAndroid Build Coastguard Worker (unsigned long)idx1, (unsigned long)_count]; 2371*1b3f573fSAndroid Build Coastguard Worker } 2372*1b3f573fSAndroid Build Coastguard Worker if (idx2 >= _count) { 2373*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 2374*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 2375*1b3f573fSAndroid Build Coastguard Worker (unsigned long)idx2, (unsigned long)_count]; 2376*1b3f573fSAndroid Build Coastguard Worker } 2377*1b3f573fSAndroid Build Coastguard Worker int32_t temp = _values[idx1]; 2378*1b3f573fSAndroid Build Coastguard Worker _values[idx1] = _values[idx2]; 2379*1b3f573fSAndroid Build Coastguard Worker _values[idx2] = temp; 2380*1b3f573fSAndroid Build Coastguard Worker} 2381*1b3f573fSAndroid Build Coastguard Worker 2382*1b3f573fSAndroid Build Coastguard Worker// clang-format on 2383*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND MUTATION_METHODS(Enum, int32_t, , EnumValidationList, EnumValidationOne) 2384*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly. 2385*1b3f573fSAndroid Build Coastguard Worker// clang-format off 2386*1b3f573fSAndroid Build Coastguard Worker 2387*1b3f573fSAndroid Build Coastguard Worker- (void)addValue:(int32_t)value { 2388*1b3f573fSAndroid Build Coastguard Worker [self addValues:&value count:1]; 2389*1b3f573fSAndroid Build Coastguard Worker} 2390*1b3f573fSAndroid Build Coastguard Worker 2391*1b3f573fSAndroid Build Coastguard Worker- (void)addValues:(const int32_t [])values count:(NSUInteger)count { 2392*1b3f573fSAndroid Build Coastguard Worker if (values == NULL || count == 0) return; 2393*1b3f573fSAndroid Build Coastguard Worker GPBEnumValidationFunc func = _validationFunc; 2394*1b3f573fSAndroid Build Coastguard Worker for (NSUInteger i = 0; i < count; ++i) { 2395*1b3f573fSAndroid Build Coastguard Worker if (!func(values[i])) { 2396*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 2397*1b3f573fSAndroid Build Coastguard Worker format:@"%@: Attempt to set an unknown enum value (%d)", 2398*1b3f573fSAndroid Build Coastguard Worker [self class], values[i]]; 2399*1b3f573fSAndroid Build Coastguard Worker } 2400*1b3f573fSAndroid Build Coastguard Worker } 2401*1b3f573fSAndroid Build Coastguard Worker NSUInteger initialCount = _count; 2402*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = initialCount + count; 2403*1b3f573fSAndroid Build Coastguard Worker if (newCount > _capacity) { 2404*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 2405*1b3f573fSAndroid Build Coastguard Worker } 2406*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 2407*1b3f573fSAndroid Build Coastguard Worker memcpy(&_values[initialCount], values, count * sizeof(int32_t)); 2408*1b3f573fSAndroid Build Coastguard Worker if (_autocreator) { 2409*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedArrayModified(_autocreator, self); 2410*1b3f573fSAndroid Build Coastguard Worker } 2411*1b3f573fSAndroid Build Coastguard Worker} 2412*1b3f573fSAndroid Build Coastguard Worker 2413*1b3f573fSAndroid Build Coastguard Worker- (void)insertValue:(int32_t)value atIndex:(NSUInteger)index { 2414*1b3f573fSAndroid Build Coastguard Worker if (index >= _count + 1) { 2415*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 2416*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 2417*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count + 1]; 2418*1b3f573fSAndroid Build Coastguard Worker } 2419*1b3f573fSAndroid Build Coastguard Worker if (!_validationFunc(value)) { 2420*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 2421*1b3f573fSAndroid Build Coastguard Worker format:@"%@: Attempt to set an unknown enum value (%d)", 2422*1b3f573fSAndroid Build Coastguard Worker [self class], value]; 2423*1b3f573fSAndroid Build Coastguard Worker } 2424*1b3f573fSAndroid Build Coastguard Worker NSUInteger initialCount = _count; 2425*1b3f573fSAndroid Build Coastguard Worker NSUInteger newCount = initialCount + 1; 2426*1b3f573fSAndroid Build Coastguard Worker if (newCount > _capacity) { 2427*1b3f573fSAndroid Build Coastguard Worker [self internalResizeToCapacity:CapacityFromCount(newCount)]; 2428*1b3f573fSAndroid Build Coastguard Worker } 2429*1b3f573fSAndroid Build Coastguard Worker _count = newCount; 2430*1b3f573fSAndroid Build Coastguard Worker if (index != initialCount) { 2431*1b3f573fSAndroid Build Coastguard Worker memmove(&_values[index + 1], &_values[index], (initialCount - index) * sizeof(int32_t)); 2432*1b3f573fSAndroid Build Coastguard Worker } 2433*1b3f573fSAndroid Build Coastguard Worker _values[index] = value; 2434*1b3f573fSAndroid Build Coastguard Worker if (_autocreator) { 2435*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedArrayModified(_autocreator, self); 2436*1b3f573fSAndroid Build Coastguard Worker } 2437*1b3f573fSAndroid Build Coastguard Worker} 2438*1b3f573fSAndroid Build Coastguard Worker 2439*1b3f573fSAndroid Build Coastguard Worker- (void)replaceValueAtIndex:(NSUInteger)index withValue:(int32_t)value { 2440*1b3f573fSAndroid Build Coastguard Worker if (index >= _count) { 2441*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSRangeException 2442*1b3f573fSAndroid Build Coastguard Worker format:@"Index (%lu) beyond bounds (%lu)", 2443*1b3f573fSAndroid Build Coastguard Worker (unsigned long)index, (unsigned long)_count]; 2444*1b3f573fSAndroid Build Coastguard Worker } 2445*1b3f573fSAndroid Build Coastguard Worker if (!_validationFunc(value)) { 2446*1b3f573fSAndroid Build Coastguard Worker [NSException raise:NSInvalidArgumentException 2447*1b3f573fSAndroid Build Coastguard Worker format:@"%@: Attempt to set an unknown enum value (%d)", 2448*1b3f573fSAndroid Build Coastguard Worker [self class], value]; 2449*1b3f573fSAndroid Build Coastguard Worker } 2450*1b3f573fSAndroid Build Coastguard Worker _values[index] = value; 2451*1b3f573fSAndroid Build Coastguard Worker} 2452*1b3f573fSAndroid Build Coastguard Worker// clang-format on 2453*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND-END (2 expansions) 2454*1b3f573fSAndroid Build Coastguard Worker 2455*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE MUTATION_HOOK_EnumValidationList() 2456*1b3f573fSAndroid Build Coastguard Worker//% GPBEnumValidationFunc func = _validationFunc; 2457*1b3f573fSAndroid Build Coastguard Worker//% for (NSUInteger i = 0; i < count; ++i) { 2458*1b3f573fSAndroid Build Coastguard Worker//% if (!func(values[i])) { 2459*1b3f573fSAndroid Build Coastguard Worker//% [NSException raise:NSInvalidArgumentException 2460*1b3f573fSAndroid Build Coastguard Worker//% format:@"%@: Attempt to set an unknown enum value (%d)", 2461*1b3f573fSAndroid Build Coastguard Worker//% [self class], values[i]]; 2462*1b3f573fSAndroid Build Coastguard Worker//% } 2463*1b3f573fSAndroid Build Coastguard Worker//% } 2464*1b3f573fSAndroid Build Coastguard Worker//% 2465*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE MUTATION_HOOK_EnumValidationOne() 2466*1b3f573fSAndroid Build Coastguard Worker//% if (!_validationFunc(value)) { 2467*1b3f573fSAndroid Build Coastguard Worker//% [NSException raise:NSInvalidArgumentException 2468*1b3f573fSAndroid Build Coastguard Worker//% format:@"%@: Attempt to set an unknown enum value (%d)", 2469*1b3f573fSAndroid Build Coastguard Worker//% [self class], value]; 2470*1b3f573fSAndroid Build Coastguard Worker//% } 2471*1b3f573fSAndroid Build Coastguard Worker//% 2472*1b3f573fSAndroid Build Coastguard Worker 2473*1b3f573fSAndroid Build Coastguard Worker@end 2474*1b3f573fSAndroid Build Coastguard Worker 2475*1b3f573fSAndroid Build Coastguard Worker#pragma mark - NSArray Subclass 2476*1b3f573fSAndroid Build Coastguard Worker 2477*1b3f573fSAndroid Build Coastguard Worker@implementation GPBAutocreatedArray { 2478*1b3f573fSAndroid Build Coastguard Worker NSMutableArray *_array; 2479*1b3f573fSAndroid Build Coastguard Worker} 2480*1b3f573fSAndroid Build Coastguard Worker 2481*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc { 2482*1b3f573fSAndroid Build Coastguard Worker NSAssert(!_autocreator, 2483*1b3f573fSAndroid Build Coastguard Worker @"%@: Autocreator must be cleared before release, autocreator: %@", 2484*1b3f573fSAndroid Build Coastguard Worker [self class], _autocreator); 2485*1b3f573fSAndroid Build Coastguard Worker [_array release]; 2486*1b3f573fSAndroid Build Coastguard Worker [super dealloc]; 2487*1b3f573fSAndroid Build Coastguard Worker} 2488*1b3f573fSAndroid Build Coastguard Worker 2489*1b3f573fSAndroid Build Coastguard Worker#pragma mark Required NSArray overrides 2490*1b3f573fSAndroid Build Coastguard Worker 2491*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)count { 2492*1b3f573fSAndroid Build Coastguard Worker return [_array count]; 2493*1b3f573fSAndroid Build Coastguard Worker} 2494*1b3f573fSAndroid Build Coastguard Worker 2495*1b3f573fSAndroid Build Coastguard Worker- (id)objectAtIndex:(NSUInteger)idx { 2496*1b3f573fSAndroid Build Coastguard Worker return [_array objectAtIndex:idx]; 2497*1b3f573fSAndroid Build Coastguard Worker} 2498*1b3f573fSAndroid Build Coastguard Worker 2499*1b3f573fSAndroid Build Coastguard Worker#pragma mark Required NSMutableArray overrides 2500*1b3f573fSAndroid Build Coastguard Worker 2501*1b3f573fSAndroid Build Coastguard Worker// Only need to call GPBAutocreatedArrayModified() when adding things since 2502*1b3f573fSAndroid Build Coastguard Worker// we only autocreate empty arrays. 2503*1b3f573fSAndroid Build Coastguard Worker 2504*1b3f573fSAndroid Build Coastguard Worker- (void)insertObject:(id)anObject atIndex:(NSUInteger)idx { 2505*1b3f573fSAndroid Build Coastguard Worker if (_array == nil) { 2506*1b3f573fSAndroid Build Coastguard Worker _array = [[NSMutableArray alloc] init]; 2507*1b3f573fSAndroid Build Coastguard Worker } 2508*1b3f573fSAndroid Build Coastguard Worker [_array insertObject:anObject atIndex:idx]; 2509*1b3f573fSAndroid Build Coastguard Worker 2510*1b3f573fSAndroid Build Coastguard Worker if (_autocreator) { 2511*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedArrayModified(_autocreator, self); 2512*1b3f573fSAndroid Build Coastguard Worker } 2513*1b3f573fSAndroid Build Coastguard Worker} 2514*1b3f573fSAndroid Build Coastguard Worker 2515*1b3f573fSAndroid Build Coastguard Worker- (void)removeObject:(id)anObject { 2516*1b3f573fSAndroid Build Coastguard Worker [_array removeObject:anObject]; 2517*1b3f573fSAndroid Build Coastguard Worker} 2518*1b3f573fSAndroid Build Coastguard Worker 2519*1b3f573fSAndroid Build Coastguard Worker- (void)removeObjectAtIndex:(NSUInteger)idx { 2520*1b3f573fSAndroid Build Coastguard Worker [_array removeObjectAtIndex:idx]; 2521*1b3f573fSAndroid Build Coastguard Worker} 2522*1b3f573fSAndroid Build Coastguard Worker 2523*1b3f573fSAndroid Build Coastguard Worker- (void)addObject:(id)anObject { 2524*1b3f573fSAndroid Build Coastguard Worker if (_array == nil) { 2525*1b3f573fSAndroid Build Coastguard Worker _array = [[NSMutableArray alloc] init]; 2526*1b3f573fSAndroid Build Coastguard Worker } 2527*1b3f573fSAndroid Build Coastguard Worker [_array addObject:anObject]; 2528*1b3f573fSAndroid Build Coastguard Worker 2529*1b3f573fSAndroid Build Coastguard Worker if (_autocreator) { 2530*1b3f573fSAndroid Build Coastguard Worker GPBAutocreatedArrayModified(_autocreator, self); 2531*1b3f573fSAndroid Build Coastguard Worker } 2532*1b3f573fSAndroid Build Coastguard Worker} 2533*1b3f573fSAndroid Build Coastguard Worker 2534*1b3f573fSAndroid Build Coastguard Worker- (void)removeLastObject { 2535*1b3f573fSAndroid Build Coastguard Worker [_array removeLastObject]; 2536*1b3f573fSAndroid Build Coastguard Worker} 2537*1b3f573fSAndroid Build Coastguard Worker 2538*1b3f573fSAndroid Build Coastguard Worker- (void)replaceObjectAtIndex:(NSUInteger)idx withObject:(id)anObject { 2539*1b3f573fSAndroid Build Coastguard Worker [_array replaceObjectAtIndex:idx withObject:anObject]; 2540*1b3f573fSAndroid Build Coastguard Worker} 2541*1b3f573fSAndroid Build Coastguard Worker 2542*1b3f573fSAndroid Build Coastguard Worker#pragma mark Extra things hooked 2543*1b3f573fSAndroid Build Coastguard Worker 2544*1b3f573fSAndroid Build Coastguard Worker- (id)copyWithZone:(NSZone *)zone { 2545*1b3f573fSAndroid Build Coastguard Worker if (_array == nil) { 2546*1b3f573fSAndroid Build Coastguard Worker return [[NSMutableArray allocWithZone:zone] init]; 2547*1b3f573fSAndroid Build Coastguard Worker } 2548*1b3f573fSAndroid Build Coastguard Worker return [_array copyWithZone:zone]; 2549*1b3f573fSAndroid Build Coastguard Worker} 2550*1b3f573fSAndroid Build Coastguard Worker 2551*1b3f573fSAndroid Build Coastguard Worker- (id)mutableCopyWithZone:(NSZone *)zone { 2552*1b3f573fSAndroid Build Coastguard Worker if (_array == nil) { 2553*1b3f573fSAndroid Build Coastguard Worker return [[NSMutableArray allocWithZone:zone] init]; 2554*1b3f573fSAndroid Build Coastguard Worker } 2555*1b3f573fSAndroid Build Coastguard Worker return [_array mutableCopyWithZone:zone]; 2556*1b3f573fSAndroid Build Coastguard Worker} 2557*1b3f573fSAndroid Build Coastguard Worker 2558*1b3f573fSAndroid Build Coastguard Worker- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state 2559*1b3f573fSAndroid Build Coastguard Worker objects:(id __unsafe_unretained [])buffer 2560*1b3f573fSAndroid Build Coastguard Worker count:(NSUInteger)len { 2561*1b3f573fSAndroid Build Coastguard Worker return [_array countByEnumeratingWithState:state objects:buffer count:len]; 2562*1b3f573fSAndroid Build Coastguard Worker} 2563*1b3f573fSAndroid Build Coastguard Worker 2564*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateObjectsUsingBlock:(void (NS_NOESCAPE ^)(id obj, NSUInteger idx, BOOL *stop))block { 2565*1b3f573fSAndroid Build Coastguard Worker [_array enumerateObjectsUsingBlock:block]; 2566*1b3f573fSAndroid Build Coastguard Worker} 2567*1b3f573fSAndroid Build Coastguard Worker 2568*1b3f573fSAndroid Build Coastguard Worker- (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts 2569*1b3f573fSAndroid Build Coastguard Worker usingBlock:(void (NS_NOESCAPE ^)(id obj, NSUInteger idx, BOOL *stop))block { 2570*1b3f573fSAndroid Build Coastguard Worker [_array enumerateObjectsWithOptions:opts usingBlock:block]; 2571*1b3f573fSAndroid Build Coastguard Worker} 2572*1b3f573fSAndroid Build Coastguard Worker 2573*1b3f573fSAndroid Build Coastguard Worker@end 2574*1b3f573fSAndroid Build Coastguard Worker 2575*1b3f573fSAndroid Build Coastguard Worker#pragma clang diagnostic pop 2576