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