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