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