xref: /aosp_15_r20/external/cronet/third_party/protobuf/objectivec/GPBUnknownField.m (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker// Protocol Buffers - Google's data interchange format
2*6777b538SAndroid Build Coastguard Worker// Copyright 2008 Google Inc.  All rights reserved.
3*6777b538SAndroid Build Coastguard Worker// https://developers.google.com/protocol-buffers/
4*6777b538SAndroid Build Coastguard Worker//
5*6777b538SAndroid Build Coastguard Worker// Redistribution and use in source and binary forms, with or without
6*6777b538SAndroid Build Coastguard Worker// modification, are permitted provided that the following conditions are
7*6777b538SAndroid Build Coastguard Worker// met:
8*6777b538SAndroid Build Coastguard Worker//
9*6777b538SAndroid Build Coastguard Worker//     * Redistributions of source code must retain the above copyright
10*6777b538SAndroid Build Coastguard Worker// notice, this list of conditions and the following disclaimer.
11*6777b538SAndroid Build Coastguard Worker//     * Redistributions in binary form must reproduce the above
12*6777b538SAndroid Build Coastguard Worker// copyright notice, this list of conditions and the following disclaimer
13*6777b538SAndroid Build Coastguard Worker// in the documentation and/or other materials provided with the
14*6777b538SAndroid Build Coastguard Worker// distribution.
15*6777b538SAndroid Build Coastguard Worker//     * Neither the name of Google Inc. nor the names of its
16*6777b538SAndroid Build Coastguard Worker// contributors may be used to endorse or promote products derived from
17*6777b538SAndroid Build Coastguard Worker// this software without specific prior written permission.
18*6777b538SAndroid Build Coastguard Worker//
19*6777b538SAndroid Build Coastguard Worker// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20*6777b538SAndroid Build Coastguard Worker// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21*6777b538SAndroid Build Coastguard Worker// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22*6777b538SAndroid Build Coastguard Worker// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23*6777b538SAndroid Build Coastguard Worker// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24*6777b538SAndroid Build Coastguard Worker// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25*6777b538SAndroid Build Coastguard Worker// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26*6777b538SAndroid Build Coastguard Worker// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27*6777b538SAndroid Build Coastguard Worker// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28*6777b538SAndroid Build Coastguard Worker// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29*6777b538SAndroid Build Coastguard Worker// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30*6777b538SAndroid Build Coastguard Worker
31*6777b538SAndroid Build Coastguard Worker#import "GPBUnknownField_PackagePrivate.h"
32*6777b538SAndroid Build Coastguard Worker
33*6777b538SAndroid Build Coastguard Worker#import "GPBArray.h"
34*6777b538SAndroid Build Coastguard Worker#import "GPBCodedOutputStream_PackagePrivate.h"
35*6777b538SAndroid Build Coastguard Worker#import "GPBUnknownFieldSet.h"
36*6777b538SAndroid Build Coastguard Worker
37*6777b538SAndroid Build Coastguard Worker@implementation GPBUnknownField {
38*6777b538SAndroid Build Coastguard Worker @protected
39*6777b538SAndroid Build Coastguard Worker  int32_t number_;
40*6777b538SAndroid Build Coastguard Worker  GPBUInt64Array *mutableVarintList_;
41*6777b538SAndroid Build Coastguard Worker  GPBUInt32Array *mutableFixed32List_;
42*6777b538SAndroid Build Coastguard Worker  GPBUInt64Array *mutableFixed64List_;
43*6777b538SAndroid Build Coastguard Worker  NSMutableArray<NSData*> *mutableLengthDelimitedList_;
44*6777b538SAndroid Build Coastguard Worker  NSMutableArray<GPBUnknownFieldSet*> *mutableGroupList_;
45*6777b538SAndroid Build Coastguard Worker}
46*6777b538SAndroid Build Coastguard Worker
47*6777b538SAndroid Build Coastguard Worker@synthesize number = number_;
48*6777b538SAndroid Build Coastguard Worker@synthesize varintList = mutableVarintList_;
49*6777b538SAndroid Build Coastguard Worker@synthesize fixed32List = mutableFixed32List_;
50*6777b538SAndroid Build Coastguard Worker@synthesize fixed64List = mutableFixed64List_;
51*6777b538SAndroid Build Coastguard Worker@synthesize lengthDelimitedList = mutableLengthDelimitedList_;
52*6777b538SAndroid Build Coastguard Worker@synthesize groupList = mutableGroupList_;
53*6777b538SAndroid Build Coastguard Worker
54*6777b538SAndroid Build Coastguard Worker- (instancetype)initWithNumber:(int32_t)number {
55*6777b538SAndroid Build Coastguard Worker  if ((self = [super init])) {
56*6777b538SAndroid Build Coastguard Worker    number_ = number;
57*6777b538SAndroid Build Coastguard Worker  }
58*6777b538SAndroid Build Coastguard Worker  return self;
59*6777b538SAndroid Build Coastguard Worker}
60*6777b538SAndroid Build Coastguard Worker
61*6777b538SAndroid Build Coastguard Worker- (void)dealloc {
62*6777b538SAndroid Build Coastguard Worker  [mutableVarintList_ release];
63*6777b538SAndroid Build Coastguard Worker  [mutableFixed32List_ release];
64*6777b538SAndroid Build Coastguard Worker  [mutableFixed64List_ release];
65*6777b538SAndroid Build Coastguard Worker  [mutableLengthDelimitedList_ release];
66*6777b538SAndroid Build Coastguard Worker  [mutableGroupList_ release];
67*6777b538SAndroid Build Coastguard Worker
68*6777b538SAndroid Build Coastguard Worker  [super dealloc];
69*6777b538SAndroid Build Coastguard Worker}
70*6777b538SAndroid Build Coastguard Worker
71*6777b538SAndroid Build Coastguard Worker// Direct access is use for speed, to avoid even internally declaring things
72*6777b538SAndroid Build Coastguard Worker// read/write, etc. The warning is enabled in the project to ensure code calling
73*6777b538SAndroid Build Coastguard Worker// protos can turn on -Wdirect-ivar-access without issues.
74*6777b538SAndroid Build Coastguard Worker#pragma clang diagnostic push
75*6777b538SAndroid Build Coastguard Worker#pragma clang diagnostic ignored "-Wdirect-ivar-access"
76*6777b538SAndroid Build Coastguard Worker
77*6777b538SAndroid Build Coastguard Worker- (id)copyWithZone:(NSZone *)zone {
78*6777b538SAndroid Build Coastguard Worker  GPBUnknownField *result =
79*6777b538SAndroid Build Coastguard Worker      [[GPBUnknownField allocWithZone:zone] initWithNumber:number_];
80*6777b538SAndroid Build Coastguard Worker  result->mutableFixed32List_ = [mutableFixed32List_ copyWithZone:zone];
81*6777b538SAndroid Build Coastguard Worker  result->mutableFixed64List_ = [mutableFixed64List_ copyWithZone:zone];
82*6777b538SAndroid Build Coastguard Worker  result->mutableLengthDelimitedList_ =
83*6777b538SAndroid Build Coastguard Worker      [mutableLengthDelimitedList_ mutableCopyWithZone:zone];
84*6777b538SAndroid Build Coastguard Worker  result->mutableVarintList_ = [mutableVarintList_ copyWithZone:zone];
85*6777b538SAndroid Build Coastguard Worker  if (mutableGroupList_.count) {
86*6777b538SAndroid Build Coastguard Worker    result->mutableGroupList_ = [[NSMutableArray allocWithZone:zone]
87*6777b538SAndroid Build Coastguard Worker        initWithCapacity:mutableGroupList_.count];
88*6777b538SAndroid Build Coastguard Worker    for (GPBUnknownFieldSet *group in mutableGroupList_) {
89*6777b538SAndroid Build Coastguard Worker      GPBUnknownFieldSet *copied = [group copyWithZone:zone];
90*6777b538SAndroid Build Coastguard Worker      [result->mutableGroupList_ addObject:copied];
91*6777b538SAndroid Build Coastguard Worker      [copied release];
92*6777b538SAndroid Build Coastguard Worker    }
93*6777b538SAndroid Build Coastguard Worker  }
94*6777b538SAndroid Build Coastguard Worker  return result;
95*6777b538SAndroid Build Coastguard Worker}
96*6777b538SAndroid Build Coastguard Worker
97*6777b538SAndroid Build Coastguard Worker- (BOOL)isEqual:(id)object {
98*6777b538SAndroid Build Coastguard Worker  if (self == object) return YES;
99*6777b538SAndroid Build Coastguard Worker  if (![object isKindOfClass:[GPBUnknownField class]]) return NO;
100*6777b538SAndroid Build Coastguard Worker  GPBUnknownField *field = (GPBUnknownField *)object;
101*6777b538SAndroid Build Coastguard Worker  if (number_ != field->number_) return NO;
102*6777b538SAndroid Build Coastguard Worker  BOOL equalVarint =
103*6777b538SAndroid Build Coastguard Worker      (mutableVarintList_.count == 0 && field->mutableVarintList_.count == 0) ||
104*6777b538SAndroid Build Coastguard Worker      [mutableVarintList_ isEqual:field->mutableVarintList_];
105*6777b538SAndroid Build Coastguard Worker  if (!equalVarint) return NO;
106*6777b538SAndroid Build Coastguard Worker  BOOL equalFixed32 = (mutableFixed32List_.count == 0 &&
107*6777b538SAndroid Build Coastguard Worker                       field->mutableFixed32List_.count == 0) ||
108*6777b538SAndroid Build Coastguard Worker                      [mutableFixed32List_ isEqual:field->mutableFixed32List_];
109*6777b538SAndroid Build Coastguard Worker  if (!equalFixed32) return NO;
110*6777b538SAndroid Build Coastguard Worker  BOOL equalFixed64 = (mutableFixed64List_.count == 0 &&
111*6777b538SAndroid Build Coastguard Worker                       field->mutableFixed64List_.count == 0) ||
112*6777b538SAndroid Build Coastguard Worker                      [mutableFixed64List_ isEqual:field->mutableFixed64List_];
113*6777b538SAndroid Build Coastguard Worker  if (!equalFixed64) return NO;
114*6777b538SAndroid Build Coastguard Worker  BOOL equalLDList =
115*6777b538SAndroid Build Coastguard Worker      (mutableLengthDelimitedList_.count == 0 &&
116*6777b538SAndroid Build Coastguard Worker       field->mutableLengthDelimitedList_.count == 0) ||
117*6777b538SAndroid Build Coastguard Worker      [mutableLengthDelimitedList_ isEqual:field->mutableLengthDelimitedList_];
118*6777b538SAndroid Build Coastguard Worker  if (!equalLDList) return NO;
119*6777b538SAndroid Build Coastguard Worker  BOOL equalGroupList =
120*6777b538SAndroid Build Coastguard Worker      (mutableGroupList_.count == 0 && field->mutableGroupList_.count == 0) ||
121*6777b538SAndroid Build Coastguard Worker      [mutableGroupList_ isEqual:field->mutableGroupList_];
122*6777b538SAndroid Build Coastguard Worker  if (!equalGroupList) return NO;
123*6777b538SAndroid Build Coastguard Worker  return YES;
124*6777b538SAndroid Build Coastguard Worker}
125*6777b538SAndroid Build Coastguard Worker
126*6777b538SAndroid Build Coastguard Worker- (NSUInteger)hash {
127*6777b538SAndroid Build Coastguard Worker  // Just mix the hashes of the possible sub arrays.
128*6777b538SAndroid Build Coastguard Worker  const int prime = 31;
129*6777b538SAndroid Build Coastguard Worker  NSUInteger result = prime + [mutableVarintList_ hash];
130*6777b538SAndroid Build Coastguard Worker  result = prime * result + [mutableFixed32List_ hash];
131*6777b538SAndroid Build Coastguard Worker  result = prime * result + [mutableFixed64List_ hash];
132*6777b538SAndroid Build Coastguard Worker  result = prime * result + [mutableLengthDelimitedList_ hash];
133*6777b538SAndroid Build Coastguard Worker  result = prime * result + [mutableGroupList_ hash];
134*6777b538SAndroid Build Coastguard Worker  return result;
135*6777b538SAndroid Build Coastguard Worker}
136*6777b538SAndroid Build Coastguard Worker
137*6777b538SAndroid Build Coastguard Worker- (void)writeToOutput:(GPBCodedOutputStream *)output {
138*6777b538SAndroid Build Coastguard Worker  NSUInteger count = mutableVarintList_.count;
139*6777b538SAndroid Build Coastguard Worker  if (count > 0) {
140*6777b538SAndroid Build Coastguard Worker    [output writeUInt64Array:number_ values:mutableVarintList_ tag:0];
141*6777b538SAndroid Build Coastguard Worker  }
142*6777b538SAndroid Build Coastguard Worker  count = mutableFixed32List_.count;
143*6777b538SAndroid Build Coastguard Worker  if (count > 0) {
144*6777b538SAndroid Build Coastguard Worker    [output writeFixed32Array:number_ values:mutableFixed32List_ tag:0];
145*6777b538SAndroid Build Coastguard Worker  }
146*6777b538SAndroid Build Coastguard Worker  count = mutableFixed64List_.count;
147*6777b538SAndroid Build Coastguard Worker  if (count > 0) {
148*6777b538SAndroid Build Coastguard Worker    [output writeFixed64Array:number_ values:mutableFixed64List_ tag:0];
149*6777b538SAndroid Build Coastguard Worker  }
150*6777b538SAndroid Build Coastguard Worker  count = mutableLengthDelimitedList_.count;
151*6777b538SAndroid Build Coastguard Worker  if (count > 0) {
152*6777b538SAndroid Build Coastguard Worker    [output writeBytesArray:number_ values:mutableLengthDelimitedList_];
153*6777b538SAndroid Build Coastguard Worker  }
154*6777b538SAndroid Build Coastguard Worker  count = mutableGroupList_.count;
155*6777b538SAndroid Build Coastguard Worker  if (count > 0) {
156*6777b538SAndroid Build Coastguard Worker    [output writeUnknownGroupArray:number_ values:mutableGroupList_];
157*6777b538SAndroid Build Coastguard Worker  }
158*6777b538SAndroid Build Coastguard Worker}
159*6777b538SAndroid Build Coastguard Worker
160*6777b538SAndroid Build Coastguard Worker- (size_t)serializedSize {
161*6777b538SAndroid Build Coastguard Worker  __block size_t result = 0;
162*6777b538SAndroid Build Coastguard Worker  int32_t number = number_;
163*6777b538SAndroid Build Coastguard Worker  [mutableVarintList_
164*6777b538SAndroid Build Coastguard Worker      enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
165*6777b538SAndroid Build Coastguard Worker#pragma unused(idx, stop)
166*6777b538SAndroid Build Coastguard Worker        result += GPBComputeUInt64Size(number, value);
167*6777b538SAndroid Build Coastguard Worker      }];
168*6777b538SAndroid Build Coastguard Worker
169*6777b538SAndroid Build Coastguard Worker  [mutableFixed32List_
170*6777b538SAndroid Build Coastguard Worker      enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
171*6777b538SAndroid Build Coastguard Worker#pragma unused(idx, stop)
172*6777b538SAndroid Build Coastguard Worker        result += GPBComputeFixed32Size(number, value);
173*6777b538SAndroid Build Coastguard Worker      }];
174*6777b538SAndroid Build Coastguard Worker
175*6777b538SAndroid Build Coastguard Worker  [mutableFixed64List_
176*6777b538SAndroid Build Coastguard Worker      enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
177*6777b538SAndroid Build Coastguard Worker#pragma unused(idx, stop)
178*6777b538SAndroid Build Coastguard Worker        result += GPBComputeFixed64Size(number, value);
179*6777b538SAndroid Build Coastguard Worker      }];
180*6777b538SAndroid Build Coastguard Worker
181*6777b538SAndroid Build Coastguard Worker  for (NSData *data in mutableLengthDelimitedList_) {
182*6777b538SAndroid Build Coastguard Worker    result += GPBComputeBytesSize(number, data);
183*6777b538SAndroid Build Coastguard Worker  }
184*6777b538SAndroid Build Coastguard Worker
185*6777b538SAndroid Build Coastguard Worker  for (GPBUnknownFieldSet *set in mutableGroupList_) {
186*6777b538SAndroid Build Coastguard Worker    result += GPBComputeUnknownGroupSize(number, set);
187*6777b538SAndroid Build Coastguard Worker  }
188*6777b538SAndroid Build Coastguard Worker
189*6777b538SAndroid Build Coastguard Worker  return result;
190*6777b538SAndroid Build Coastguard Worker}
191*6777b538SAndroid Build Coastguard Worker
192*6777b538SAndroid Build Coastguard Worker- (void)writeAsMessageSetExtensionToOutput:(GPBCodedOutputStream *)output {
193*6777b538SAndroid Build Coastguard Worker  for (NSData *data in mutableLengthDelimitedList_) {
194*6777b538SAndroid Build Coastguard Worker    [output writeRawMessageSetExtension:number_ value:data];
195*6777b538SAndroid Build Coastguard Worker  }
196*6777b538SAndroid Build Coastguard Worker}
197*6777b538SAndroid Build Coastguard Worker
198*6777b538SAndroid Build Coastguard Worker- (size_t)serializedSizeAsMessageSetExtension {
199*6777b538SAndroid Build Coastguard Worker  size_t result = 0;
200*6777b538SAndroid Build Coastguard Worker  for (NSData *data in mutableLengthDelimitedList_) {
201*6777b538SAndroid Build Coastguard Worker    result += GPBComputeRawMessageSetExtensionSize(number_, data);
202*6777b538SAndroid Build Coastguard Worker  }
203*6777b538SAndroid Build Coastguard Worker  return result;
204*6777b538SAndroid Build Coastguard Worker}
205*6777b538SAndroid Build Coastguard Worker
206*6777b538SAndroid Build Coastguard Worker- (NSString *)description {
207*6777b538SAndroid Build Coastguard Worker  NSMutableString *description =
208*6777b538SAndroid Build Coastguard Worker      [NSMutableString stringWithFormat:@"<%@ %p>: Field: %d {\n",
209*6777b538SAndroid Build Coastguard Worker       [self class], self, number_];
210*6777b538SAndroid Build Coastguard Worker  [mutableVarintList_
211*6777b538SAndroid Build Coastguard Worker      enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
212*6777b538SAndroid Build Coastguard Worker#pragma unused(idx, stop)
213*6777b538SAndroid Build Coastguard Worker        [description appendFormat:@"\t%llu\n", value];
214*6777b538SAndroid Build Coastguard Worker      }];
215*6777b538SAndroid Build Coastguard Worker
216*6777b538SAndroid Build Coastguard Worker  [mutableFixed32List_
217*6777b538SAndroid Build Coastguard Worker      enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
218*6777b538SAndroid Build Coastguard Worker#pragma unused(idx, stop)
219*6777b538SAndroid Build Coastguard Worker        [description appendFormat:@"\t%u\n", value];
220*6777b538SAndroid Build Coastguard Worker      }];
221*6777b538SAndroid Build Coastguard Worker
222*6777b538SAndroid Build Coastguard Worker  [mutableFixed64List_
223*6777b538SAndroid Build Coastguard Worker      enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
224*6777b538SAndroid Build Coastguard Worker#pragma unused(idx, stop)
225*6777b538SAndroid Build Coastguard Worker        [description appendFormat:@"\t%llu\n", value];
226*6777b538SAndroid Build Coastguard Worker      }];
227*6777b538SAndroid Build Coastguard Worker
228*6777b538SAndroid Build Coastguard Worker  for (NSData *data in mutableLengthDelimitedList_) {
229*6777b538SAndroid Build Coastguard Worker    [description appendFormat:@"\t%@\n", data];
230*6777b538SAndroid Build Coastguard Worker  }
231*6777b538SAndroid Build Coastguard Worker
232*6777b538SAndroid Build Coastguard Worker  for (GPBUnknownFieldSet *set in mutableGroupList_) {
233*6777b538SAndroid Build Coastguard Worker    [description appendFormat:@"\t%@\n", set];
234*6777b538SAndroid Build Coastguard Worker  }
235*6777b538SAndroid Build Coastguard Worker  [description appendString:@"}"];
236*6777b538SAndroid Build Coastguard Worker  return description;
237*6777b538SAndroid Build Coastguard Worker}
238*6777b538SAndroid Build Coastguard Worker
239*6777b538SAndroid Build Coastguard Worker- (void)mergeFromField:(GPBUnknownField *)other {
240*6777b538SAndroid Build Coastguard Worker  GPBUInt64Array *otherVarintList = other.varintList;
241*6777b538SAndroid Build Coastguard Worker  if (otherVarintList.count > 0) {
242*6777b538SAndroid Build Coastguard Worker    if (mutableVarintList_ == nil) {
243*6777b538SAndroid Build Coastguard Worker      mutableVarintList_ = [otherVarintList copy];
244*6777b538SAndroid Build Coastguard Worker    } else {
245*6777b538SAndroid Build Coastguard Worker      [mutableVarintList_ addValuesFromArray:otherVarintList];
246*6777b538SAndroid Build Coastguard Worker    }
247*6777b538SAndroid Build Coastguard Worker  }
248*6777b538SAndroid Build Coastguard Worker
249*6777b538SAndroid Build Coastguard Worker  GPBUInt32Array *otherFixed32List = other.fixed32List;
250*6777b538SAndroid Build Coastguard Worker  if (otherFixed32List.count > 0) {
251*6777b538SAndroid Build Coastguard Worker    if (mutableFixed32List_ == nil) {
252*6777b538SAndroid Build Coastguard Worker      mutableFixed32List_ = [otherFixed32List copy];
253*6777b538SAndroid Build Coastguard Worker    } else {
254*6777b538SAndroid Build Coastguard Worker      [mutableFixed32List_ addValuesFromArray:otherFixed32List];
255*6777b538SAndroid Build Coastguard Worker    }
256*6777b538SAndroid Build Coastguard Worker  }
257*6777b538SAndroid Build Coastguard Worker
258*6777b538SAndroid Build Coastguard Worker  GPBUInt64Array *otherFixed64List = other.fixed64List;
259*6777b538SAndroid Build Coastguard Worker  if (otherFixed64List.count > 0) {
260*6777b538SAndroid Build Coastguard Worker    if (mutableFixed64List_ == nil) {
261*6777b538SAndroid Build Coastguard Worker      mutableFixed64List_ = [otherFixed64List copy];
262*6777b538SAndroid Build Coastguard Worker    } else {
263*6777b538SAndroid Build Coastguard Worker      [mutableFixed64List_ addValuesFromArray:otherFixed64List];
264*6777b538SAndroid Build Coastguard Worker    }
265*6777b538SAndroid Build Coastguard Worker  }
266*6777b538SAndroid Build Coastguard Worker
267*6777b538SAndroid Build Coastguard Worker  NSArray *otherLengthDelimitedList = other.lengthDelimitedList;
268*6777b538SAndroid Build Coastguard Worker  if (otherLengthDelimitedList.count > 0) {
269*6777b538SAndroid Build Coastguard Worker    if (mutableLengthDelimitedList_ == nil) {
270*6777b538SAndroid Build Coastguard Worker      mutableLengthDelimitedList_ = [otherLengthDelimitedList mutableCopy];
271*6777b538SAndroid Build Coastguard Worker    } else {
272*6777b538SAndroid Build Coastguard Worker      [mutableLengthDelimitedList_
273*6777b538SAndroid Build Coastguard Worker          addObjectsFromArray:otherLengthDelimitedList];
274*6777b538SAndroid Build Coastguard Worker    }
275*6777b538SAndroid Build Coastguard Worker  }
276*6777b538SAndroid Build Coastguard Worker
277*6777b538SAndroid Build Coastguard Worker  NSArray *otherGroupList = other.groupList;
278*6777b538SAndroid Build Coastguard Worker  if (otherGroupList.count > 0) {
279*6777b538SAndroid Build Coastguard Worker    if (mutableGroupList_ == nil) {
280*6777b538SAndroid Build Coastguard Worker      mutableGroupList_ =
281*6777b538SAndroid Build Coastguard Worker          [[NSMutableArray alloc] initWithCapacity:otherGroupList.count];
282*6777b538SAndroid Build Coastguard Worker    }
283*6777b538SAndroid Build Coastguard Worker    // Make our own mutable copies.
284*6777b538SAndroid Build Coastguard Worker    for (GPBUnknownFieldSet *group in otherGroupList) {
285*6777b538SAndroid Build Coastguard Worker      GPBUnknownFieldSet *copied = [group copy];
286*6777b538SAndroid Build Coastguard Worker      [mutableGroupList_ addObject:copied];
287*6777b538SAndroid Build Coastguard Worker      [copied release];
288*6777b538SAndroid Build Coastguard Worker    }
289*6777b538SAndroid Build Coastguard Worker  }
290*6777b538SAndroid Build Coastguard Worker}
291*6777b538SAndroid Build Coastguard Worker
292*6777b538SAndroid Build Coastguard Worker- (void)addVarint:(uint64_t)value {
293*6777b538SAndroid Build Coastguard Worker  if (mutableVarintList_ == nil) {
294*6777b538SAndroid Build Coastguard Worker    mutableVarintList_ = [[GPBUInt64Array alloc] initWithValues:&value count:1];
295*6777b538SAndroid Build Coastguard Worker  } else {
296*6777b538SAndroid Build Coastguard Worker    [mutableVarintList_ addValue:value];
297*6777b538SAndroid Build Coastguard Worker  }
298*6777b538SAndroid Build Coastguard Worker}
299*6777b538SAndroid Build Coastguard Worker
300*6777b538SAndroid Build Coastguard Worker- (void)addFixed32:(uint32_t)value {
301*6777b538SAndroid Build Coastguard Worker  if (mutableFixed32List_ == nil) {
302*6777b538SAndroid Build Coastguard Worker    mutableFixed32List_ =
303*6777b538SAndroid Build Coastguard Worker        [[GPBUInt32Array alloc] initWithValues:&value count:1];
304*6777b538SAndroid Build Coastguard Worker  } else {
305*6777b538SAndroid Build Coastguard Worker    [mutableFixed32List_ addValue:value];
306*6777b538SAndroid Build Coastguard Worker  }
307*6777b538SAndroid Build Coastguard Worker}
308*6777b538SAndroid Build Coastguard Worker
309*6777b538SAndroid Build Coastguard Worker- (void)addFixed64:(uint64_t)value {
310*6777b538SAndroid Build Coastguard Worker  if (mutableFixed64List_ == nil) {
311*6777b538SAndroid Build Coastguard Worker    mutableFixed64List_ =
312*6777b538SAndroid Build Coastguard Worker        [[GPBUInt64Array alloc] initWithValues:&value count:1];
313*6777b538SAndroid Build Coastguard Worker  } else {
314*6777b538SAndroid Build Coastguard Worker    [mutableFixed64List_ addValue:value];
315*6777b538SAndroid Build Coastguard Worker  }
316*6777b538SAndroid Build Coastguard Worker}
317*6777b538SAndroid Build Coastguard Worker
318*6777b538SAndroid Build Coastguard Worker- (void)addLengthDelimited:(NSData *)value {
319*6777b538SAndroid Build Coastguard Worker  if (mutableLengthDelimitedList_ == nil) {
320*6777b538SAndroid Build Coastguard Worker    mutableLengthDelimitedList_ =
321*6777b538SAndroid Build Coastguard Worker        [[NSMutableArray alloc] initWithObjects:&value count:1];
322*6777b538SAndroid Build Coastguard Worker  } else {
323*6777b538SAndroid Build Coastguard Worker    [mutableLengthDelimitedList_ addObject:value];
324*6777b538SAndroid Build Coastguard Worker  }
325*6777b538SAndroid Build Coastguard Worker}
326*6777b538SAndroid Build Coastguard Worker
327*6777b538SAndroid Build Coastguard Worker- (void)addGroup:(GPBUnknownFieldSet *)value {
328*6777b538SAndroid Build Coastguard Worker  if (mutableGroupList_ == nil) {
329*6777b538SAndroid Build Coastguard Worker    mutableGroupList_ = [[NSMutableArray alloc] initWithObjects:&value count:1];
330*6777b538SAndroid Build Coastguard Worker  } else {
331*6777b538SAndroid Build Coastguard Worker    [mutableGroupList_ addObject:value];
332*6777b538SAndroid Build Coastguard Worker  }
333*6777b538SAndroid Build Coastguard Worker}
334*6777b538SAndroid Build Coastguard Worker
335*6777b538SAndroid Build Coastguard Worker#pragma clang diagnostic pop
336*6777b538SAndroid Build Coastguard Worker
337*6777b538SAndroid Build Coastguard Worker@end
338