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