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