xref: /aosp_15_r20/external/cronet/third_party/protobuf/objectivec/GPBArray.m (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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