xref: /aosp_15_r20/external/protobuf/objectivec/GPBCodedOutputStream.m (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
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 "GPBCodedOutputStream_PackagePrivate.h"
32*1b3f573fSAndroid Build Coastguard Worker
33*1b3f573fSAndroid Build Coastguard Worker#import <mach/vm_param.h>
34*1b3f573fSAndroid Build Coastguard Worker
35*1b3f573fSAndroid Build Coastguard Worker#import "GPBArray.h"
36*1b3f573fSAndroid Build Coastguard Worker#import "GPBUnknownFieldSet_PackagePrivate.h"
37*1b3f573fSAndroid Build Coastguard Worker#import "GPBUtilities_PackagePrivate.h"
38*1b3f573fSAndroid Build Coastguard Worker
39*1b3f573fSAndroid Build Coastguard Worker// These values are the existing values so as not to break any code that might
40*1b3f573fSAndroid Build Coastguard Worker// have already been inspecting them when they weren't documented/exposed.
41*1b3f573fSAndroid Build Coastguard WorkerNSString *const GPBCodedOutputStreamException_OutOfSpace = @"OutOfSpace";
42*1b3f573fSAndroid Build Coastguard WorkerNSString *const GPBCodedOutputStreamException_WriteFailed = @"WriteFailed";
43*1b3f573fSAndroid Build Coastguard Worker
44*1b3f573fSAndroid Build Coastguard Worker// Structure for containing state of a GPBCodedInputStream. Brought out into
45*1b3f573fSAndroid Build Coastguard Worker// a struct so that we can inline several common functions instead of dealing
46*1b3f573fSAndroid Build Coastguard Worker// with overhead of ObjC dispatch.
47*1b3f573fSAndroid Build Coastguard Workertypedef struct GPBOutputBufferState {
48*1b3f573fSAndroid Build Coastguard Worker  uint8_t *bytes;
49*1b3f573fSAndroid Build Coastguard Worker  size_t size;
50*1b3f573fSAndroid Build Coastguard Worker  size_t position;
51*1b3f573fSAndroid Build Coastguard Worker  NSOutputStream *output;
52*1b3f573fSAndroid Build Coastguard Worker} GPBOutputBufferState;
53*1b3f573fSAndroid Build Coastguard Worker
54*1b3f573fSAndroid Build Coastguard Worker@implementation GPBCodedOutputStream {
55*1b3f573fSAndroid Build Coastguard Worker  GPBOutputBufferState state_;
56*1b3f573fSAndroid Build Coastguard Worker  NSMutableData *buffer_;
57*1b3f573fSAndroid Build Coastguard Worker}
58*1b3f573fSAndroid Build Coastguard Worker
59*1b3f573fSAndroid Build Coastguard Workerstatic const int32_t LITTLE_ENDIAN_32_SIZE = sizeof(uint32_t);
60*1b3f573fSAndroid Build Coastguard Workerstatic const int32_t LITTLE_ENDIAN_64_SIZE = sizeof(uint64_t);
61*1b3f573fSAndroid Build Coastguard Worker
62*1b3f573fSAndroid Build Coastguard Worker// Internal helper that writes the current buffer to the output. The
63*1b3f573fSAndroid Build Coastguard Worker// buffer position is reset to its initial value when this returns.
64*1b3f573fSAndroid Build Coastguard Workerstatic void GPBRefreshBuffer(GPBOutputBufferState *state) {
65*1b3f573fSAndroid Build Coastguard Worker  if (state->output == nil) {
66*1b3f573fSAndroid Build Coastguard Worker    // We're writing to a single buffer.
67*1b3f573fSAndroid Build Coastguard Worker    [NSException raise:GPBCodedOutputStreamException_OutOfSpace format:@""];
68*1b3f573fSAndroid Build Coastguard Worker  }
69*1b3f573fSAndroid Build Coastguard Worker  if (state->position != 0) {
70*1b3f573fSAndroid Build Coastguard Worker    NSInteger written =
71*1b3f573fSAndroid Build Coastguard Worker        [state->output write:state->bytes maxLength:state->position];
72*1b3f573fSAndroid Build Coastguard Worker    if (written != (NSInteger)state->position) {
73*1b3f573fSAndroid Build Coastguard Worker      [NSException raise:GPBCodedOutputStreamException_WriteFailed format:@""];
74*1b3f573fSAndroid Build Coastguard Worker    }
75*1b3f573fSAndroid Build Coastguard Worker    state->position = 0;
76*1b3f573fSAndroid Build Coastguard Worker  }
77*1b3f573fSAndroid Build Coastguard Worker}
78*1b3f573fSAndroid Build Coastguard Worker
79*1b3f573fSAndroid Build Coastguard Workerstatic void GPBWriteRawByte(GPBOutputBufferState *state, uint8_t value) {
80*1b3f573fSAndroid Build Coastguard Worker  if (state->position == state->size) {
81*1b3f573fSAndroid Build Coastguard Worker    GPBRefreshBuffer(state);
82*1b3f573fSAndroid Build Coastguard Worker  }
83*1b3f573fSAndroid Build Coastguard Worker  state->bytes[state->position++] = value;
84*1b3f573fSAndroid Build Coastguard Worker}
85*1b3f573fSAndroid Build Coastguard Worker
86*1b3f573fSAndroid Build Coastguard Workerstatic void GPBWriteRawVarint32(GPBOutputBufferState *state, int32_t value) {
87*1b3f573fSAndroid Build Coastguard Worker  while (YES) {
88*1b3f573fSAndroid Build Coastguard Worker    if ((value & ~0x7F) == 0) {
89*1b3f573fSAndroid Build Coastguard Worker      uint8_t val = (uint8_t)value;
90*1b3f573fSAndroid Build Coastguard Worker      GPBWriteRawByte(state, val);
91*1b3f573fSAndroid Build Coastguard Worker      return;
92*1b3f573fSAndroid Build Coastguard Worker    } else {
93*1b3f573fSAndroid Build Coastguard Worker      GPBWriteRawByte(state, (value & 0x7F) | 0x80);
94*1b3f573fSAndroid Build Coastguard Worker      value = GPBLogicalRightShift32(value, 7);
95*1b3f573fSAndroid Build Coastguard Worker    }
96*1b3f573fSAndroid Build Coastguard Worker  }
97*1b3f573fSAndroid Build Coastguard Worker}
98*1b3f573fSAndroid Build Coastguard Worker
99*1b3f573fSAndroid Build Coastguard Workerstatic void GPBWriteRawVarint64(GPBOutputBufferState *state, int64_t value) {
100*1b3f573fSAndroid Build Coastguard Worker  while (YES) {
101*1b3f573fSAndroid Build Coastguard Worker    if ((value & ~0x7FL) == 0) {
102*1b3f573fSAndroid Build Coastguard Worker      uint8_t val = (uint8_t)value;
103*1b3f573fSAndroid Build Coastguard Worker      GPBWriteRawByte(state, val);
104*1b3f573fSAndroid Build Coastguard Worker      return;
105*1b3f573fSAndroid Build Coastguard Worker    } else {
106*1b3f573fSAndroid Build Coastguard Worker      GPBWriteRawByte(state, ((int32_t)value & 0x7F) | 0x80);
107*1b3f573fSAndroid Build Coastguard Worker      value = GPBLogicalRightShift64(value, 7);
108*1b3f573fSAndroid Build Coastguard Worker    }
109*1b3f573fSAndroid Build Coastguard Worker  }
110*1b3f573fSAndroid Build Coastguard Worker}
111*1b3f573fSAndroid Build Coastguard Worker
112*1b3f573fSAndroid Build Coastguard Workerstatic void GPBWriteInt32NoTag(GPBOutputBufferState *state, int32_t value) {
113*1b3f573fSAndroid Build Coastguard Worker  if (value >= 0) {
114*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(state, value);
115*1b3f573fSAndroid Build Coastguard Worker  } else {
116*1b3f573fSAndroid Build Coastguard Worker    // Must sign-extend
117*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint64(state, value);
118*1b3f573fSAndroid Build Coastguard Worker  }
119*1b3f573fSAndroid Build Coastguard Worker}
120*1b3f573fSAndroid Build Coastguard Worker
121*1b3f573fSAndroid Build Coastguard Workerstatic void GPBWriteUInt32(GPBOutputBufferState *state, int32_t fieldNumber,
122*1b3f573fSAndroid Build Coastguard Worker                           uint32_t value) {
123*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(state, fieldNumber, GPBWireFormatVarint);
124*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawVarint32(state, value);
125*1b3f573fSAndroid Build Coastguard Worker}
126*1b3f573fSAndroid Build Coastguard Worker
127*1b3f573fSAndroid Build Coastguard Workerstatic void GPBWriteTagWithFormat(GPBOutputBufferState *state,
128*1b3f573fSAndroid Build Coastguard Worker                                  uint32_t fieldNumber, GPBWireFormat format) {
129*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawVarint32(state, GPBWireFormatMakeTag(fieldNumber, format));
130*1b3f573fSAndroid Build Coastguard Worker}
131*1b3f573fSAndroid Build Coastguard Worker
132*1b3f573fSAndroid Build Coastguard Workerstatic void GPBWriteRawLittleEndian32(GPBOutputBufferState *state,
133*1b3f573fSAndroid Build Coastguard Worker                                      int32_t value) {
134*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawByte(state, (value)&0xFF);
135*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawByte(state, (value >> 8) & 0xFF);
136*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawByte(state, (value >> 16) & 0xFF);
137*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawByte(state, (value >> 24) & 0xFF);
138*1b3f573fSAndroid Build Coastguard Worker}
139*1b3f573fSAndroid Build Coastguard Worker
140*1b3f573fSAndroid Build Coastguard Workerstatic void GPBWriteRawLittleEndian64(GPBOutputBufferState *state,
141*1b3f573fSAndroid Build Coastguard Worker                                      int64_t value) {
142*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawByte(state, (int32_t)(value)&0xFF);
143*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawByte(state, (int32_t)(value >> 8) & 0xFF);
144*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawByte(state, (int32_t)(value >> 16) & 0xFF);
145*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawByte(state, (int32_t)(value >> 24) & 0xFF);
146*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawByte(state, (int32_t)(value >> 32) & 0xFF);
147*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawByte(state, (int32_t)(value >> 40) & 0xFF);
148*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawByte(state, (int32_t)(value >> 48) & 0xFF);
149*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawByte(state, (int32_t)(value >> 56) & 0xFF);
150*1b3f573fSAndroid Build Coastguard Worker}
151*1b3f573fSAndroid Build Coastguard Worker
152*1b3f573fSAndroid Build Coastguard Worker- (void)dealloc {
153*1b3f573fSAndroid Build Coastguard Worker  [self flush];
154*1b3f573fSAndroid Build Coastguard Worker  [state_.output close];
155*1b3f573fSAndroid Build Coastguard Worker  [state_.output release];
156*1b3f573fSAndroid Build Coastguard Worker  [buffer_ release];
157*1b3f573fSAndroid Build Coastguard Worker
158*1b3f573fSAndroid Build Coastguard Worker  [super dealloc];
159*1b3f573fSAndroid Build Coastguard Worker}
160*1b3f573fSAndroid Build Coastguard Worker
161*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithOutputStream:(NSOutputStream *)output {
162*1b3f573fSAndroid Build Coastguard Worker  NSMutableData *data = [NSMutableData dataWithLength:PAGE_SIZE];
163*1b3f573fSAndroid Build Coastguard Worker  return [self initWithOutputStream:output data:data];
164*1b3f573fSAndroid Build Coastguard Worker}
165*1b3f573fSAndroid Build Coastguard Worker
166*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithData:(NSMutableData *)data {
167*1b3f573fSAndroid Build Coastguard Worker  return [self initWithOutputStream:nil data:data];
168*1b3f573fSAndroid Build Coastguard Worker}
169*1b3f573fSAndroid Build Coastguard Worker
170*1b3f573fSAndroid Build Coastguard Worker// This initializer isn't exposed, but it is the designated initializer.
171*1b3f573fSAndroid Build Coastguard Worker// Setting OutputStream and NSData is to control the buffering behavior/size
172*1b3f573fSAndroid Build Coastguard Worker// of the work, but that is more obvious via the bufferSize: version.
173*1b3f573fSAndroid Build Coastguard Worker- (instancetype)initWithOutputStream:(NSOutputStream *)output
174*1b3f573fSAndroid Build Coastguard Worker                                data:(NSMutableData *)data {
175*1b3f573fSAndroid Build Coastguard Worker  if ((self = [super init])) {
176*1b3f573fSAndroid Build Coastguard Worker    buffer_ = [data retain];
177*1b3f573fSAndroid Build Coastguard Worker    state_.bytes = [data mutableBytes];
178*1b3f573fSAndroid Build Coastguard Worker    state_.size = [data length];
179*1b3f573fSAndroid Build Coastguard Worker    state_.output = [output retain];
180*1b3f573fSAndroid Build Coastguard Worker    [state_.output open];
181*1b3f573fSAndroid Build Coastguard Worker  }
182*1b3f573fSAndroid Build Coastguard Worker  return self;
183*1b3f573fSAndroid Build Coastguard Worker}
184*1b3f573fSAndroid Build Coastguard Worker
185*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)streamWithOutputStream:(NSOutputStream *)output {
186*1b3f573fSAndroid Build Coastguard Worker  NSMutableData *data = [NSMutableData dataWithLength:PAGE_SIZE];
187*1b3f573fSAndroid Build Coastguard Worker  return [[[self alloc] initWithOutputStream:output
188*1b3f573fSAndroid Build Coastguard Worker                                        data:data] autorelease];
189*1b3f573fSAndroid Build Coastguard Worker}
190*1b3f573fSAndroid Build Coastguard Worker
191*1b3f573fSAndroid Build Coastguard Worker+ (instancetype)streamWithData:(NSMutableData *)data {
192*1b3f573fSAndroid Build Coastguard Worker  return [[[self alloc] initWithData:data] autorelease];
193*1b3f573fSAndroid Build Coastguard Worker}
194*1b3f573fSAndroid Build Coastguard Worker
195*1b3f573fSAndroid Build Coastguard Worker// Direct access is use for speed, to avoid even internally declaring things
196*1b3f573fSAndroid Build Coastguard Worker// read/write, etc. The warning is enabled in the project to ensure code calling
197*1b3f573fSAndroid Build Coastguard Worker// protos can turn on -Wdirect-ivar-access without issues.
198*1b3f573fSAndroid Build Coastguard Worker#pragma clang diagnostic push
199*1b3f573fSAndroid Build Coastguard Worker#pragma clang diagnostic ignored "-Wdirect-ivar-access"
200*1b3f573fSAndroid Build Coastguard Worker
201*1b3f573fSAndroid Build Coastguard Worker- (void)writeDoubleNoTag:(double)value {
202*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawLittleEndian64(&state_, GPBConvertDoubleToInt64(value));
203*1b3f573fSAndroid Build Coastguard Worker}
204*1b3f573fSAndroid Build Coastguard Worker
205*1b3f573fSAndroid Build Coastguard Worker- (void)writeDouble:(int32_t)fieldNumber value:(double)value {
206*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, fieldNumber, GPBWireFormatFixed64);
207*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawLittleEndian64(&state_, GPBConvertDoubleToInt64(value));
208*1b3f573fSAndroid Build Coastguard Worker}
209*1b3f573fSAndroid Build Coastguard Worker
210*1b3f573fSAndroid Build Coastguard Worker- (void)writeFloatNoTag:(float)value {
211*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawLittleEndian32(&state_, GPBConvertFloatToInt32(value));
212*1b3f573fSAndroid Build Coastguard Worker}
213*1b3f573fSAndroid Build Coastguard Worker
214*1b3f573fSAndroid Build Coastguard Worker- (void)writeFloat:(int32_t)fieldNumber value:(float)value {
215*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, fieldNumber, GPBWireFormatFixed32);
216*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawLittleEndian32(&state_, GPBConvertFloatToInt32(value));
217*1b3f573fSAndroid Build Coastguard Worker}
218*1b3f573fSAndroid Build Coastguard Worker
219*1b3f573fSAndroid Build Coastguard Worker- (void)writeUInt64NoTag:(uint64_t)value {
220*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawVarint64(&state_, value);
221*1b3f573fSAndroid Build Coastguard Worker}
222*1b3f573fSAndroid Build Coastguard Worker
223*1b3f573fSAndroid Build Coastguard Worker- (void)writeUInt64:(int32_t)fieldNumber value:(uint64_t)value {
224*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, fieldNumber, GPBWireFormatVarint);
225*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawVarint64(&state_, value);
226*1b3f573fSAndroid Build Coastguard Worker}
227*1b3f573fSAndroid Build Coastguard Worker
228*1b3f573fSAndroid Build Coastguard Worker- (void)writeInt64NoTag:(int64_t)value {
229*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawVarint64(&state_, value);
230*1b3f573fSAndroid Build Coastguard Worker}
231*1b3f573fSAndroid Build Coastguard Worker
232*1b3f573fSAndroid Build Coastguard Worker- (void)writeInt64:(int32_t)fieldNumber value:(int64_t)value {
233*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, fieldNumber, GPBWireFormatVarint);
234*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawVarint64(&state_, value);
235*1b3f573fSAndroid Build Coastguard Worker}
236*1b3f573fSAndroid Build Coastguard Worker
237*1b3f573fSAndroid Build Coastguard Worker- (void)writeInt32NoTag:(int32_t)value {
238*1b3f573fSAndroid Build Coastguard Worker  GPBWriteInt32NoTag(&state_, value);
239*1b3f573fSAndroid Build Coastguard Worker}
240*1b3f573fSAndroid Build Coastguard Worker
241*1b3f573fSAndroid Build Coastguard Worker- (void)writeInt32:(int32_t)fieldNumber value:(int32_t)value {
242*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, fieldNumber, GPBWireFormatVarint);
243*1b3f573fSAndroid Build Coastguard Worker  GPBWriteInt32NoTag(&state_, value);
244*1b3f573fSAndroid Build Coastguard Worker}
245*1b3f573fSAndroid Build Coastguard Worker
246*1b3f573fSAndroid Build Coastguard Worker- (void)writeFixed64NoTag:(uint64_t)value {
247*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawLittleEndian64(&state_, value);
248*1b3f573fSAndroid Build Coastguard Worker}
249*1b3f573fSAndroid Build Coastguard Worker
250*1b3f573fSAndroid Build Coastguard Worker- (void)writeFixed64:(int32_t)fieldNumber value:(uint64_t)value {
251*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, fieldNumber, GPBWireFormatFixed64);
252*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawLittleEndian64(&state_, value);
253*1b3f573fSAndroid Build Coastguard Worker}
254*1b3f573fSAndroid Build Coastguard Worker
255*1b3f573fSAndroid Build Coastguard Worker- (void)writeFixed32NoTag:(uint32_t)value {
256*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawLittleEndian32(&state_, value);
257*1b3f573fSAndroid Build Coastguard Worker}
258*1b3f573fSAndroid Build Coastguard Worker
259*1b3f573fSAndroid Build Coastguard Worker- (void)writeFixed32:(int32_t)fieldNumber value:(uint32_t)value {
260*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, fieldNumber, GPBWireFormatFixed32);
261*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawLittleEndian32(&state_, value);
262*1b3f573fSAndroid Build Coastguard Worker}
263*1b3f573fSAndroid Build Coastguard Worker
264*1b3f573fSAndroid Build Coastguard Worker- (void)writeBoolNoTag:(BOOL)value {
265*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawByte(&state_, (value ? 1 : 0));
266*1b3f573fSAndroid Build Coastguard Worker}
267*1b3f573fSAndroid Build Coastguard Worker
268*1b3f573fSAndroid Build Coastguard Worker- (void)writeBool:(int32_t)fieldNumber value:(BOOL)value {
269*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, fieldNumber, GPBWireFormatVarint);
270*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawByte(&state_, (value ? 1 : 0));
271*1b3f573fSAndroid Build Coastguard Worker}
272*1b3f573fSAndroid Build Coastguard Worker
273*1b3f573fSAndroid Build Coastguard Worker- (void)writeStringNoTag:(const NSString *)value {
274*1b3f573fSAndroid Build Coastguard Worker  size_t length = [value lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
275*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawVarint32(&state_, (int32_t)length);
276*1b3f573fSAndroid Build Coastguard Worker  if (length == 0) {
277*1b3f573fSAndroid Build Coastguard Worker    return;
278*1b3f573fSAndroid Build Coastguard Worker  }
279*1b3f573fSAndroid Build Coastguard Worker
280*1b3f573fSAndroid Build Coastguard Worker  const char *quickString =
281*1b3f573fSAndroid Build Coastguard Worker      CFStringGetCStringPtr((CFStringRef)value, kCFStringEncodingUTF8);
282*1b3f573fSAndroid Build Coastguard Worker
283*1b3f573fSAndroid Build Coastguard Worker  // Fast path: Most strings are short, if the buffer already has space,
284*1b3f573fSAndroid Build Coastguard Worker  // add to it directly.
285*1b3f573fSAndroid Build Coastguard Worker  NSUInteger bufferBytesLeft = state_.size - state_.position;
286*1b3f573fSAndroid Build Coastguard Worker  if (bufferBytesLeft >= length) {
287*1b3f573fSAndroid Build Coastguard Worker    NSUInteger usedBufferLength = 0;
288*1b3f573fSAndroid Build Coastguard Worker    BOOL result;
289*1b3f573fSAndroid Build Coastguard Worker    if (quickString != NULL) {
290*1b3f573fSAndroid Build Coastguard Worker      memcpy(state_.bytes + state_.position, quickString, length);
291*1b3f573fSAndroid Build Coastguard Worker      usedBufferLength = length;
292*1b3f573fSAndroid Build Coastguard Worker      result = YES;
293*1b3f573fSAndroid Build Coastguard Worker    } else {
294*1b3f573fSAndroid Build Coastguard Worker      result = [value getBytes:state_.bytes + state_.position
295*1b3f573fSAndroid Build Coastguard Worker                     maxLength:bufferBytesLeft
296*1b3f573fSAndroid Build Coastguard Worker                    usedLength:&usedBufferLength
297*1b3f573fSAndroid Build Coastguard Worker                      encoding:NSUTF8StringEncoding
298*1b3f573fSAndroid Build Coastguard Worker                       options:(NSStringEncodingConversionOptions)0
299*1b3f573fSAndroid Build Coastguard Worker                         range:NSMakeRange(0, [value length])
300*1b3f573fSAndroid Build Coastguard Worker                remainingRange:NULL];
301*1b3f573fSAndroid Build Coastguard Worker    }
302*1b3f573fSAndroid Build Coastguard Worker    if (result) {
303*1b3f573fSAndroid Build Coastguard Worker      NSAssert2((usedBufferLength == length),
304*1b3f573fSAndroid Build Coastguard Worker                @"Our UTF8 calc was wrong? %tu vs %zd", usedBufferLength,
305*1b3f573fSAndroid Build Coastguard Worker                length);
306*1b3f573fSAndroid Build Coastguard Worker      state_.position += usedBufferLength;
307*1b3f573fSAndroid Build Coastguard Worker      return;
308*1b3f573fSAndroid Build Coastguard Worker    }
309*1b3f573fSAndroid Build Coastguard Worker  } else if (quickString != NULL) {
310*1b3f573fSAndroid Build Coastguard Worker    [self writeRawPtr:quickString offset:0 length:length];
311*1b3f573fSAndroid Build Coastguard Worker  } else {
312*1b3f573fSAndroid Build Coastguard Worker    // Slow path: just get it as data and write it out.
313*1b3f573fSAndroid Build Coastguard Worker    NSData *utf8Data = [value dataUsingEncoding:NSUTF8StringEncoding];
314*1b3f573fSAndroid Build Coastguard Worker    NSAssert2(([utf8Data length] == length),
315*1b3f573fSAndroid Build Coastguard Worker              @"Strings UTF8 length was wrong? %tu vs %zd", [utf8Data length],
316*1b3f573fSAndroid Build Coastguard Worker              length);
317*1b3f573fSAndroid Build Coastguard Worker    [self writeRawData:utf8Data];
318*1b3f573fSAndroid Build Coastguard Worker  }
319*1b3f573fSAndroid Build Coastguard Worker}
320*1b3f573fSAndroid Build Coastguard Worker
321*1b3f573fSAndroid Build Coastguard Worker- (void)writeString:(int32_t)fieldNumber value:(NSString *)value {
322*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, fieldNumber, GPBWireFormatLengthDelimited);
323*1b3f573fSAndroid Build Coastguard Worker  [self writeStringNoTag:value];
324*1b3f573fSAndroid Build Coastguard Worker}
325*1b3f573fSAndroid Build Coastguard Worker
326*1b3f573fSAndroid Build Coastguard Worker- (void)writeGroupNoTag:(int32_t)fieldNumber value:(GPBMessage *)value {
327*1b3f573fSAndroid Build Coastguard Worker  [value writeToCodedOutputStream:self];
328*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, fieldNumber, GPBWireFormatEndGroup);
329*1b3f573fSAndroid Build Coastguard Worker}
330*1b3f573fSAndroid Build Coastguard Worker
331*1b3f573fSAndroid Build Coastguard Worker- (void)writeGroup:(int32_t)fieldNumber value:(GPBMessage *)value {
332*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, fieldNumber, GPBWireFormatStartGroup);
333*1b3f573fSAndroid Build Coastguard Worker  [self writeGroupNoTag:fieldNumber value:value];
334*1b3f573fSAndroid Build Coastguard Worker}
335*1b3f573fSAndroid Build Coastguard Worker
336*1b3f573fSAndroid Build Coastguard Worker- (void)writeUnknownGroupNoTag:(int32_t)fieldNumber
337*1b3f573fSAndroid Build Coastguard Worker                         value:(const GPBUnknownFieldSet *)value {
338*1b3f573fSAndroid Build Coastguard Worker  [value writeToCodedOutputStream:self];
339*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, fieldNumber, GPBWireFormatEndGroup);
340*1b3f573fSAndroid Build Coastguard Worker}
341*1b3f573fSAndroid Build Coastguard Worker
342*1b3f573fSAndroid Build Coastguard Worker- (void)writeUnknownGroup:(int32_t)fieldNumber
343*1b3f573fSAndroid Build Coastguard Worker                    value:(GPBUnknownFieldSet *)value {
344*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, fieldNumber, GPBWireFormatStartGroup);
345*1b3f573fSAndroid Build Coastguard Worker  [self writeUnknownGroupNoTag:fieldNumber value:value];
346*1b3f573fSAndroid Build Coastguard Worker}
347*1b3f573fSAndroid Build Coastguard Worker
348*1b3f573fSAndroid Build Coastguard Worker- (void)writeMessageNoTag:(GPBMessage *)value {
349*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawVarint32(&state_, (int32_t)[value serializedSize]);
350*1b3f573fSAndroid Build Coastguard Worker  [value writeToCodedOutputStream:self];
351*1b3f573fSAndroid Build Coastguard Worker}
352*1b3f573fSAndroid Build Coastguard Worker
353*1b3f573fSAndroid Build Coastguard Worker- (void)writeMessage:(int32_t)fieldNumber value:(GPBMessage *)value {
354*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, fieldNumber, GPBWireFormatLengthDelimited);
355*1b3f573fSAndroid Build Coastguard Worker  [self writeMessageNoTag:value];
356*1b3f573fSAndroid Build Coastguard Worker}
357*1b3f573fSAndroid Build Coastguard Worker
358*1b3f573fSAndroid Build Coastguard Worker- (void)writeBytesNoTag:(NSData *)value {
359*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawVarint32(&state_, (int32_t)[value length]);
360*1b3f573fSAndroid Build Coastguard Worker  [self writeRawData:value];
361*1b3f573fSAndroid Build Coastguard Worker}
362*1b3f573fSAndroid Build Coastguard Worker
363*1b3f573fSAndroid Build Coastguard Worker- (void)writeBytes:(int32_t)fieldNumber value:(NSData *)value {
364*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, fieldNumber, GPBWireFormatLengthDelimited);
365*1b3f573fSAndroid Build Coastguard Worker  [self writeBytesNoTag:value];
366*1b3f573fSAndroid Build Coastguard Worker}
367*1b3f573fSAndroid Build Coastguard Worker
368*1b3f573fSAndroid Build Coastguard Worker- (void)writeUInt32NoTag:(uint32_t)value {
369*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawVarint32(&state_, value);
370*1b3f573fSAndroid Build Coastguard Worker}
371*1b3f573fSAndroid Build Coastguard Worker
372*1b3f573fSAndroid Build Coastguard Worker- (void)writeUInt32:(int32_t)fieldNumber value:(uint32_t)value {
373*1b3f573fSAndroid Build Coastguard Worker  GPBWriteUInt32(&state_, fieldNumber, value);
374*1b3f573fSAndroid Build Coastguard Worker}
375*1b3f573fSAndroid Build Coastguard Worker
376*1b3f573fSAndroid Build Coastguard Worker- (void)writeEnumNoTag:(int32_t)value {
377*1b3f573fSAndroid Build Coastguard Worker  GPBWriteInt32NoTag(&state_, value);
378*1b3f573fSAndroid Build Coastguard Worker}
379*1b3f573fSAndroid Build Coastguard Worker
380*1b3f573fSAndroid Build Coastguard Worker- (void)writeEnum:(int32_t)fieldNumber value:(int32_t)value {
381*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, fieldNumber, GPBWireFormatVarint);
382*1b3f573fSAndroid Build Coastguard Worker  GPBWriteInt32NoTag(&state_, value);
383*1b3f573fSAndroid Build Coastguard Worker}
384*1b3f573fSAndroid Build Coastguard Worker
385*1b3f573fSAndroid Build Coastguard Worker- (void)writeSFixed32NoTag:(int32_t)value {
386*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawLittleEndian32(&state_, value);
387*1b3f573fSAndroid Build Coastguard Worker}
388*1b3f573fSAndroid Build Coastguard Worker
389*1b3f573fSAndroid Build Coastguard Worker- (void)writeSFixed32:(int32_t)fieldNumber value:(int32_t)value {
390*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, fieldNumber, GPBWireFormatFixed32);
391*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawLittleEndian32(&state_, value);
392*1b3f573fSAndroid Build Coastguard Worker}
393*1b3f573fSAndroid Build Coastguard Worker
394*1b3f573fSAndroid Build Coastguard Worker- (void)writeSFixed64NoTag:(int64_t)value {
395*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawLittleEndian64(&state_, value);
396*1b3f573fSAndroid Build Coastguard Worker}
397*1b3f573fSAndroid Build Coastguard Worker
398*1b3f573fSAndroid Build Coastguard Worker- (void)writeSFixed64:(int32_t)fieldNumber value:(int64_t)value {
399*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, fieldNumber, GPBWireFormatFixed64);
400*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawLittleEndian64(&state_, value);
401*1b3f573fSAndroid Build Coastguard Worker}
402*1b3f573fSAndroid Build Coastguard Worker
403*1b3f573fSAndroid Build Coastguard Worker- (void)writeSInt32NoTag:(int32_t)value {
404*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawVarint32(&state_, GPBEncodeZigZag32(value));
405*1b3f573fSAndroid Build Coastguard Worker}
406*1b3f573fSAndroid Build Coastguard Worker
407*1b3f573fSAndroid Build Coastguard Worker- (void)writeSInt32:(int32_t)fieldNumber value:(int32_t)value {
408*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, fieldNumber, GPBWireFormatVarint);
409*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawVarint32(&state_, GPBEncodeZigZag32(value));
410*1b3f573fSAndroid Build Coastguard Worker}
411*1b3f573fSAndroid Build Coastguard Worker
412*1b3f573fSAndroid Build Coastguard Worker- (void)writeSInt64NoTag:(int64_t)value {
413*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawVarint64(&state_, GPBEncodeZigZag64(value));
414*1b3f573fSAndroid Build Coastguard Worker}
415*1b3f573fSAndroid Build Coastguard Worker
416*1b3f573fSAndroid Build Coastguard Worker- (void)writeSInt64:(int32_t)fieldNumber value:(int64_t)value {
417*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, fieldNumber, GPBWireFormatVarint);
418*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawVarint64(&state_, GPBEncodeZigZag64(value));
419*1b3f573fSAndroid Build Coastguard Worker}
420*1b3f573fSAndroid Build Coastguard Worker
421*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE WRITE_PACKABLE_DEFNS(NAME, ARRAY_TYPE, TYPE, ACCESSOR_NAME)
422*1b3f573fSAndroid Build Coastguard Worker//%- (void)write##NAME##Array:(int32_t)fieldNumber
423*1b3f573fSAndroid Build Coastguard Worker//%       NAME$S     values:(GPB##ARRAY_TYPE##Array *)values
424*1b3f573fSAndroid Build Coastguard Worker//%       NAME$S        tag:(uint32_t)tag {
425*1b3f573fSAndroid Build Coastguard Worker//%  if (tag != 0) {
426*1b3f573fSAndroid Build Coastguard Worker//%    if (values.count == 0) return;
427*1b3f573fSAndroid Build Coastguard Worker//%    __block size_t dataSize = 0;
428*1b3f573fSAndroid Build Coastguard Worker//%    [values enumerate##ACCESSOR_NAME##ValuesWithBlock:^(TYPE value, NSUInteger idx, BOOL *stop) {
429*1b3f573fSAndroid Build Coastguard Worker//%#pragma unused(idx, stop)
430*1b3f573fSAndroid Build Coastguard Worker//%      dataSize += GPBCompute##NAME##SizeNoTag(value);
431*1b3f573fSAndroid Build Coastguard Worker//%    }];
432*1b3f573fSAndroid Build Coastguard Worker//%    GPBWriteRawVarint32(&state_, tag);
433*1b3f573fSAndroid Build Coastguard Worker//%    GPBWriteRawVarint32(&state_, (int32_t)dataSize);
434*1b3f573fSAndroid Build Coastguard Worker//%    [values enumerate##ACCESSOR_NAME##ValuesWithBlock:^(TYPE value, NSUInteger idx, BOOL *stop) {
435*1b3f573fSAndroid Build Coastguard Worker//%#pragma unused(idx, stop)
436*1b3f573fSAndroid Build Coastguard Worker//%      [self write##NAME##NoTag:value];
437*1b3f573fSAndroid Build Coastguard Worker//%    }];
438*1b3f573fSAndroid Build Coastguard Worker//%  } else {
439*1b3f573fSAndroid Build Coastguard Worker//%    [values enumerate##ACCESSOR_NAME##ValuesWithBlock:^(TYPE value, NSUInteger idx, BOOL *stop) {
440*1b3f573fSAndroid Build Coastguard Worker//%#pragma unused(idx, stop)
441*1b3f573fSAndroid Build Coastguard Worker//%      [self write##NAME:fieldNumber value:value];
442*1b3f573fSAndroid Build Coastguard Worker//%    }];
443*1b3f573fSAndroid Build Coastguard Worker//%  }
444*1b3f573fSAndroid Build Coastguard Worker//%}
445*1b3f573fSAndroid Build Coastguard Worker//%
446*1b3f573fSAndroid Build Coastguard Worker//%PDDM-DEFINE WRITE_UNPACKABLE_DEFNS(NAME, TYPE)
447*1b3f573fSAndroid Build Coastguard Worker//%- (void)write##NAME##Array:(int32_t)fieldNumber values:(NSArray *)values {
448*1b3f573fSAndroid Build Coastguard Worker//%  for (TYPE *value in values) {
449*1b3f573fSAndroid Build Coastguard Worker//%    [self write##NAME:fieldNumber value:value];
450*1b3f573fSAndroid Build Coastguard Worker//%  }
451*1b3f573fSAndroid Build Coastguard Worker//%}
452*1b3f573fSAndroid Build Coastguard Worker//%
453*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(Double, Double, double, )
454*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
455*1b3f573fSAndroid Build Coastguard Worker// clang-format off
456*1b3f573fSAndroid Build Coastguard Worker
457*1b3f573fSAndroid Build Coastguard Worker- (void)writeDoubleArray:(int32_t)fieldNumber
458*1b3f573fSAndroid Build Coastguard Worker                  values:(GPBDoubleArray *)values
459*1b3f573fSAndroid Build Coastguard Worker                     tag:(uint32_t)tag {
460*1b3f573fSAndroid Build Coastguard Worker  if (tag != 0) {
461*1b3f573fSAndroid Build Coastguard Worker    if (values.count == 0) return;
462*1b3f573fSAndroid Build Coastguard Worker    __block size_t dataSize = 0;
463*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(double value, NSUInteger idx, BOOL *stop) {
464*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
465*1b3f573fSAndroid Build Coastguard Worker      dataSize += GPBComputeDoubleSizeNoTag(value);
466*1b3f573fSAndroid Build Coastguard Worker    }];
467*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, tag);
468*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, (int32_t)dataSize);
469*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(double value, NSUInteger idx, BOOL *stop) {
470*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
471*1b3f573fSAndroid Build Coastguard Worker      [self writeDoubleNoTag:value];
472*1b3f573fSAndroid Build Coastguard Worker    }];
473*1b3f573fSAndroid Build Coastguard Worker  } else {
474*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(double value, NSUInteger idx, BOOL *stop) {
475*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
476*1b3f573fSAndroid Build Coastguard Worker      [self writeDouble:fieldNumber value:value];
477*1b3f573fSAndroid Build Coastguard Worker    }];
478*1b3f573fSAndroid Build Coastguard Worker  }
479*1b3f573fSAndroid Build Coastguard Worker}
480*1b3f573fSAndroid Build Coastguard Worker
481*1b3f573fSAndroid Build Coastguard Worker// clang-format on
482*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(Float, Float, float, )
483*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
484*1b3f573fSAndroid Build Coastguard Worker// clang-format off
485*1b3f573fSAndroid Build Coastguard Worker
486*1b3f573fSAndroid Build Coastguard Worker- (void)writeFloatArray:(int32_t)fieldNumber
487*1b3f573fSAndroid Build Coastguard Worker                 values:(GPBFloatArray *)values
488*1b3f573fSAndroid Build Coastguard Worker                    tag:(uint32_t)tag {
489*1b3f573fSAndroid Build Coastguard Worker  if (tag != 0) {
490*1b3f573fSAndroid Build Coastguard Worker    if (values.count == 0) return;
491*1b3f573fSAndroid Build Coastguard Worker    __block size_t dataSize = 0;
492*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(float value, NSUInteger idx, BOOL *stop) {
493*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
494*1b3f573fSAndroid Build Coastguard Worker      dataSize += GPBComputeFloatSizeNoTag(value);
495*1b3f573fSAndroid Build Coastguard Worker    }];
496*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, tag);
497*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, (int32_t)dataSize);
498*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(float value, NSUInteger idx, BOOL *stop) {
499*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
500*1b3f573fSAndroid Build Coastguard Worker      [self writeFloatNoTag:value];
501*1b3f573fSAndroid Build Coastguard Worker    }];
502*1b3f573fSAndroid Build Coastguard Worker  } else {
503*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(float value, NSUInteger idx, BOOL *stop) {
504*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
505*1b3f573fSAndroid Build Coastguard Worker      [self writeFloat:fieldNumber value:value];
506*1b3f573fSAndroid Build Coastguard Worker    }];
507*1b3f573fSAndroid Build Coastguard Worker  }
508*1b3f573fSAndroid Build Coastguard Worker}
509*1b3f573fSAndroid Build Coastguard Worker
510*1b3f573fSAndroid Build Coastguard Worker// clang-format on
511*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(UInt64, UInt64, uint64_t, )
512*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
513*1b3f573fSAndroid Build Coastguard Worker// clang-format off
514*1b3f573fSAndroid Build Coastguard Worker
515*1b3f573fSAndroid Build Coastguard Worker- (void)writeUInt64Array:(int32_t)fieldNumber
516*1b3f573fSAndroid Build Coastguard Worker                  values:(GPBUInt64Array *)values
517*1b3f573fSAndroid Build Coastguard Worker                     tag:(uint32_t)tag {
518*1b3f573fSAndroid Build Coastguard Worker  if (tag != 0) {
519*1b3f573fSAndroid Build Coastguard Worker    if (values.count == 0) return;
520*1b3f573fSAndroid Build Coastguard Worker    __block size_t dataSize = 0;
521*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
522*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
523*1b3f573fSAndroid Build Coastguard Worker      dataSize += GPBComputeUInt64SizeNoTag(value);
524*1b3f573fSAndroid Build Coastguard Worker    }];
525*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, tag);
526*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, (int32_t)dataSize);
527*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
528*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
529*1b3f573fSAndroid Build Coastguard Worker      [self writeUInt64NoTag:value];
530*1b3f573fSAndroid Build Coastguard Worker    }];
531*1b3f573fSAndroid Build Coastguard Worker  } else {
532*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
533*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
534*1b3f573fSAndroid Build Coastguard Worker      [self writeUInt64:fieldNumber value:value];
535*1b3f573fSAndroid Build Coastguard Worker    }];
536*1b3f573fSAndroid Build Coastguard Worker  }
537*1b3f573fSAndroid Build Coastguard Worker}
538*1b3f573fSAndroid Build Coastguard Worker
539*1b3f573fSAndroid Build Coastguard Worker// clang-format on
540*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(Int64, Int64, int64_t, )
541*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
542*1b3f573fSAndroid Build Coastguard Worker// clang-format off
543*1b3f573fSAndroid Build Coastguard Worker
544*1b3f573fSAndroid Build Coastguard Worker- (void)writeInt64Array:(int32_t)fieldNumber
545*1b3f573fSAndroid Build Coastguard Worker                 values:(GPBInt64Array *)values
546*1b3f573fSAndroid Build Coastguard Worker                    tag:(uint32_t)tag {
547*1b3f573fSAndroid Build Coastguard Worker  if (tag != 0) {
548*1b3f573fSAndroid Build Coastguard Worker    if (values.count == 0) return;
549*1b3f573fSAndroid Build Coastguard Worker    __block size_t dataSize = 0;
550*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
551*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
552*1b3f573fSAndroid Build Coastguard Worker      dataSize += GPBComputeInt64SizeNoTag(value);
553*1b3f573fSAndroid Build Coastguard Worker    }];
554*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, tag);
555*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, (int32_t)dataSize);
556*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
557*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
558*1b3f573fSAndroid Build Coastguard Worker      [self writeInt64NoTag:value];
559*1b3f573fSAndroid Build Coastguard Worker    }];
560*1b3f573fSAndroid Build Coastguard Worker  } else {
561*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
562*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
563*1b3f573fSAndroid Build Coastguard Worker      [self writeInt64:fieldNumber value:value];
564*1b3f573fSAndroid Build Coastguard Worker    }];
565*1b3f573fSAndroid Build Coastguard Worker  }
566*1b3f573fSAndroid Build Coastguard Worker}
567*1b3f573fSAndroid Build Coastguard Worker
568*1b3f573fSAndroid Build Coastguard Worker// clang-format on
569*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(Int32, Int32, int32_t, )
570*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
571*1b3f573fSAndroid Build Coastguard Worker// clang-format off
572*1b3f573fSAndroid Build Coastguard Worker
573*1b3f573fSAndroid Build Coastguard Worker- (void)writeInt32Array:(int32_t)fieldNumber
574*1b3f573fSAndroid Build Coastguard Worker                 values:(GPBInt32Array *)values
575*1b3f573fSAndroid Build Coastguard Worker                    tag:(uint32_t)tag {
576*1b3f573fSAndroid Build Coastguard Worker  if (tag != 0) {
577*1b3f573fSAndroid Build Coastguard Worker    if (values.count == 0) return;
578*1b3f573fSAndroid Build Coastguard Worker    __block size_t dataSize = 0;
579*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
580*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
581*1b3f573fSAndroid Build Coastguard Worker      dataSize += GPBComputeInt32SizeNoTag(value);
582*1b3f573fSAndroid Build Coastguard Worker    }];
583*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, tag);
584*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, (int32_t)dataSize);
585*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
586*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
587*1b3f573fSAndroid Build Coastguard Worker      [self writeInt32NoTag:value];
588*1b3f573fSAndroid Build Coastguard Worker    }];
589*1b3f573fSAndroid Build Coastguard Worker  } else {
590*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
591*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
592*1b3f573fSAndroid Build Coastguard Worker      [self writeInt32:fieldNumber value:value];
593*1b3f573fSAndroid Build Coastguard Worker    }];
594*1b3f573fSAndroid Build Coastguard Worker  }
595*1b3f573fSAndroid Build Coastguard Worker}
596*1b3f573fSAndroid Build Coastguard Worker
597*1b3f573fSAndroid Build Coastguard Worker// clang-format on
598*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(UInt32, UInt32, uint32_t, )
599*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
600*1b3f573fSAndroid Build Coastguard Worker// clang-format off
601*1b3f573fSAndroid Build Coastguard Worker
602*1b3f573fSAndroid Build Coastguard Worker- (void)writeUInt32Array:(int32_t)fieldNumber
603*1b3f573fSAndroid Build Coastguard Worker                  values:(GPBUInt32Array *)values
604*1b3f573fSAndroid Build Coastguard Worker                     tag:(uint32_t)tag {
605*1b3f573fSAndroid Build Coastguard Worker  if (tag != 0) {
606*1b3f573fSAndroid Build Coastguard Worker    if (values.count == 0) return;
607*1b3f573fSAndroid Build Coastguard Worker    __block size_t dataSize = 0;
608*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
609*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
610*1b3f573fSAndroid Build Coastguard Worker      dataSize += GPBComputeUInt32SizeNoTag(value);
611*1b3f573fSAndroid Build Coastguard Worker    }];
612*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, tag);
613*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, (int32_t)dataSize);
614*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
615*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
616*1b3f573fSAndroid Build Coastguard Worker      [self writeUInt32NoTag:value];
617*1b3f573fSAndroid Build Coastguard Worker    }];
618*1b3f573fSAndroid Build Coastguard Worker  } else {
619*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
620*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
621*1b3f573fSAndroid Build Coastguard Worker      [self writeUInt32:fieldNumber value:value];
622*1b3f573fSAndroid Build Coastguard Worker    }];
623*1b3f573fSAndroid Build Coastguard Worker  }
624*1b3f573fSAndroid Build Coastguard Worker}
625*1b3f573fSAndroid Build Coastguard Worker
626*1b3f573fSAndroid Build Coastguard Worker// clang-format on
627*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(Fixed64, UInt64, uint64_t, )
628*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
629*1b3f573fSAndroid Build Coastguard Worker// clang-format off
630*1b3f573fSAndroid Build Coastguard Worker
631*1b3f573fSAndroid Build Coastguard Worker- (void)writeFixed64Array:(int32_t)fieldNumber
632*1b3f573fSAndroid Build Coastguard Worker                   values:(GPBUInt64Array *)values
633*1b3f573fSAndroid Build Coastguard Worker                      tag:(uint32_t)tag {
634*1b3f573fSAndroid Build Coastguard Worker  if (tag != 0) {
635*1b3f573fSAndroid Build Coastguard Worker    if (values.count == 0) return;
636*1b3f573fSAndroid Build Coastguard Worker    __block size_t dataSize = 0;
637*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
638*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
639*1b3f573fSAndroid Build Coastguard Worker      dataSize += GPBComputeFixed64SizeNoTag(value);
640*1b3f573fSAndroid Build Coastguard Worker    }];
641*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, tag);
642*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, (int32_t)dataSize);
643*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
644*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
645*1b3f573fSAndroid Build Coastguard Worker      [self writeFixed64NoTag:value];
646*1b3f573fSAndroid Build Coastguard Worker    }];
647*1b3f573fSAndroid Build Coastguard Worker  } else {
648*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(uint64_t value, NSUInteger idx, BOOL *stop) {
649*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
650*1b3f573fSAndroid Build Coastguard Worker      [self writeFixed64:fieldNumber value:value];
651*1b3f573fSAndroid Build Coastguard Worker    }];
652*1b3f573fSAndroid Build Coastguard Worker  }
653*1b3f573fSAndroid Build Coastguard Worker}
654*1b3f573fSAndroid Build Coastguard Worker
655*1b3f573fSAndroid Build Coastguard Worker// clang-format on
656*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(Fixed32, UInt32, uint32_t, )
657*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
658*1b3f573fSAndroid Build Coastguard Worker// clang-format off
659*1b3f573fSAndroid Build Coastguard Worker
660*1b3f573fSAndroid Build Coastguard Worker- (void)writeFixed32Array:(int32_t)fieldNumber
661*1b3f573fSAndroid Build Coastguard Worker                   values:(GPBUInt32Array *)values
662*1b3f573fSAndroid Build Coastguard Worker                      tag:(uint32_t)tag {
663*1b3f573fSAndroid Build Coastguard Worker  if (tag != 0) {
664*1b3f573fSAndroid Build Coastguard Worker    if (values.count == 0) return;
665*1b3f573fSAndroid Build Coastguard Worker    __block size_t dataSize = 0;
666*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
667*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
668*1b3f573fSAndroid Build Coastguard Worker      dataSize += GPBComputeFixed32SizeNoTag(value);
669*1b3f573fSAndroid Build Coastguard Worker    }];
670*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, tag);
671*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, (int32_t)dataSize);
672*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
673*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
674*1b3f573fSAndroid Build Coastguard Worker      [self writeFixed32NoTag:value];
675*1b3f573fSAndroid Build Coastguard Worker    }];
676*1b3f573fSAndroid Build Coastguard Worker  } else {
677*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(uint32_t value, NSUInteger idx, BOOL *stop) {
678*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
679*1b3f573fSAndroid Build Coastguard Worker      [self writeFixed32:fieldNumber value:value];
680*1b3f573fSAndroid Build Coastguard Worker    }];
681*1b3f573fSAndroid Build Coastguard Worker  }
682*1b3f573fSAndroid Build Coastguard Worker}
683*1b3f573fSAndroid Build Coastguard Worker
684*1b3f573fSAndroid Build Coastguard Worker// clang-format on
685*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(SInt32, Int32, int32_t, )
686*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
687*1b3f573fSAndroid Build Coastguard Worker// clang-format off
688*1b3f573fSAndroid Build Coastguard Worker
689*1b3f573fSAndroid Build Coastguard Worker- (void)writeSInt32Array:(int32_t)fieldNumber
690*1b3f573fSAndroid Build Coastguard Worker                  values:(GPBInt32Array *)values
691*1b3f573fSAndroid Build Coastguard Worker                     tag:(uint32_t)tag {
692*1b3f573fSAndroid Build Coastguard Worker  if (tag != 0) {
693*1b3f573fSAndroid Build Coastguard Worker    if (values.count == 0) return;
694*1b3f573fSAndroid Build Coastguard Worker    __block size_t dataSize = 0;
695*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
696*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
697*1b3f573fSAndroid Build Coastguard Worker      dataSize += GPBComputeSInt32SizeNoTag(value);
698*1b3f573fSAndroid Build Coastguard Worker    }];
699*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, tag);
700*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, (int32_t)dataSize);
701*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
702*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
703*1b3f573fSAndroid Build Coastguard Worker      [self writeSInt32NoTag:value];
704*1b3f573fSAndroid Build Coastguard Worker    }];
705*1b3f573fSAndroid Build Coastguard Worker  } else {
706*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
707*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
708*1b3f573fSAndroid Build Coastguard Worker      [self writeSInt32:fieldNumber value:value];
709*1b3f573fSAndroid Build Coastguard Worker    }];
710*1b3f573fSAndroid Build Coastguard Worker  }
711*1b3f573fSAndroid Build Coastguard Worker}
712*1b3f573fSAndroid Build Coastguard Worker
713*1b3f573fSAndroid Build Coastguard Worker// clang-format on
714*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(SInt64, Int64, int64_t, )
715*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
716*1b3f573fSAndroid Build Coastguard Worker// clang-format off
717*1b3f573fSAndroid Build Coastguard Worker
718*1b3f573fSAndroid Build Coastguard Worker- (void)writeSInt64Array:(int32_t)fieldNumber
719*1b3f573fSAndroid Build Coastguard Worker                  values:(GPBInt64Array *)values
720*1b3f573fSAndroid Build Coastguard Worker                     tag:(uint32_t)tag {
721*1b3f573fSAndroid Build Coastguard Worker  if (tag != 0) {
722*1b3f573fSAndroid Build Coastguard Worker    if (values.count == 0) return;
723*1b3f573fSAndroid Build Coastguard Worker    __block size_t dataSize = 0;
724*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
725*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
726*1b3f573fSAndroid Build Coastguard Worker      dataSize += GPBComputeSInt64SizeNoTag(value);
727*1b3f573fSAndroid Build Coastguard Worker    }];
728*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, tag);
729*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, (int32_t)dataSize);
730*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
731*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
732*1b3f573fSAndroid Build Coastguard Worker      [self writeSInt64NoTag:value];
733*1b3f573fSAndroid Build Coastguard Worker    }];
734*1b3f573fSAndroid Build Coastguard Worker  } else {
735*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
736*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
737*1b3f573fSAndroid Build Coastguard Worker      [self writeSInt64:fieldNumber value:value];
738*1b3f573fSAndroid Build Coastguard Worker    }];
739*1b3f573fSAndroid Build Coastguard Worker  }
740*1b3f573fSAndroid Build Coastguard Worker}
741*1b3f573fSAndroid Build Coastguard Worker
742*1b3f573fSAndroid Build Coastguard Worker// clang-format on
743*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(SFixed64, Int64, int64_t, )
744*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
745*1b3f573fSAndroid Build Coastguard Worker// clang-format off
746*1b3f573fSAndroid Build Coastguard Worker
747*1b3f573fSAndroid Build Coastguard Worker- (void)writeSFixed64Array:(int32_t)fieldNumber
748*1b3f573fSAndroid Build Coastguard Worker                    values:(GPBInt64Array *)values
749*1b3f573fSAndroid Build Coastguard Worker                       tag:(uint32_t)tag {
750*1b3f573fSAndroid Build Coastguard Worker  if (tag != 0) {
751*1b3f573fSAndroid Build Coastguard Worker    if (values.count == 0) return;
752*1b3f573fSAndroid Build Coastguard Worker    __block size_t dataSize = 0;
753*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
754*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
755*1b3f573fSAndroid Build Coastguard Worker      dataSize += GPBComputeSFixed64SizeNoTag(value);
756*1b3f573fSAndroid Build Coastguard Worker    }];
757*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, tag);
758*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, (int32_t)dataSize);
759*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
760*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
761*1b3f573fSAndroid Build Coastguard Worker      [self writeSFixed64NoTag:value];
762*1b3f573fSAndroid Build Coastguard Worker    }];
763*1b3f573fSAndroid Build Coastguard Worker  } else {
764*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(int64_t value, NSUInteger idx, BOOL *stop) {
765*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
766*1b3f573fSAndroid Build Coastguard Worker      [self writeSFixed64:fieldNumber value:value];
767*1b3f573fSAndroid Build Coastguard Worker    }];
768*1b3f573fSAndroid Build Coastguard Worker  }
769*1b3f573fSAndroid Build Coastguard Worker}
770*1b3f573fSAndroid Build Coastguard Worker
771*1b3f573fSAndroid Build Coastguard Worker// clang-format on
772*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(SFixed32, Int32, int32_t, )
773*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
774*1b3f573fSAndroid Build Coastguard Worker// clang-format off
775*1b3f573fSAndroid Build Coastguard Worker
776*1b3f573fSAndroid Build Coastguard Worker- (void)writeSFixed32Array:(int32_t)fieldNumber
777*1b3f573fSAndroid Build Coastguard Worker                    values:(GPBInt32Array *)values
778*1b3f573fSAndroid Build Coastguard Worker                       tag:(uint32_t)tag {
779*1b3f573fSAndroid Build Coastguard Worker  if (tag != 0) {
780*1b3f573fSAndroid Build Coastguard Worker    if (values.count == 0) return;
781*1b3f573fSAndroid Build Coastguard Worker    __block size_t dataSize = 0;
782*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
783*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
784*1b3f573fSAndroid Build Coastguard Worker      dataSize += GPBComputeSFixed32SizeNoTag(value);
785*1b3f573fSAndroid Build Coastguard Worker    }];
786*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, tag);
787*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, (int32_t)dataSize);
788*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
789*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
790*1b3f573fSAndroid Build Coastguard Worker      [self writeSFixed32NoTag:value];
791*1b3f573fSAndroid Build Coastguard Worker    }];
792*1b3f573fSAndroid Build Coastguard Worker  } else {
793*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
794*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
795*1b3f573fSAndroid Build Coastguard Worker      [self writeSFixed32:fieldNumber value:value];
796*1b3f573fSAndroid Build Coastguard Worker    }];
797*1b3f573fSAndroid Build Coastguard Worker  }
798*1b3f573fSAndroid Build Coastguard Worker}
799*1b3f573fSAndroid Build Coastguard Worker
800*1b3f573fSAndroid Build Coastguard Worker// clang-format on
801*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(Bool, Bool, BOOL, )
802*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
803*1b3f573fSAndroid Build Coastguard Worker// clang-format off
804*1b3f573fSAndroid Build Coastguard Worker
805*1b3f573fSAndroid Build Coastguard Worker- (void)writeBoolArray:(int32_t)fieldNumber
806*1b3f573fSAndroid Build Coastguard Worker                values:(GPBBoolArray *)values
807*1b3f573fSAndroid Build Coastguard Worker                   tag:(uint32_t)tag {
808*1b3f573fSAndroid Build Coastguard Worker  if (tag != 0) {
809*1b3f573fSAndroid Build Coastguard Worker    if (values.count == 0) return;
810*1b3f573fSAndroid Build Coastguard Worker    __block size_t dataSize = 0;
811*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(BOOL value, NSUInteger idx, BOOL *stop) {
812*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
813*1b3f573fSAndroid Build Coastguard Worker      dataSize += GPBComputeBoolSizeNoTag(value);
814*1b3f573fSAndroid Build Coastguard Worker    }];
815*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, tag);
816*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, (int32_t)dataSize);
817*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(BOOL value, NSUInteger idx, BOOL *stop) {
818*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
819*1b3f573fSAndroid Build Coastguard Worker      [self writeBoolNoTag:value];
820*1b3f573fSAndroid Build Coastguard Worker    }];
821*1b3f573fSAndroid Build Coastguard Worker  } else {
822*1b3f573fSAndroid Build Coastguard Worker    [values enumerateValuesWithBlock:^(BOOL value, NSUInteger idx, BOOL *stop) {
823*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
824*1b3f573fSAndroid Build Coastguard Worker      [self writeBool:fieldNumber value:value];
825*1b3f573fSAndroid Build Coastguard Worker    }];
826*1b3f573fSAndroid Build Coastguard Worker  }
827*1b3f573fSAndroid Build Coastguard Worker}
828*1b3f573fSAndroid Build Coastguard Worker
829*1b3f573fSAndroid Build Coastguard Worker// clang-format on
830*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND WRITE_PACKABLE_DEFNS(Enum, Enum, int32_t, Raw)
831*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
832*1b3f573fSAndroid Build Coastguard Worker// clang-format off
833*1b3f573fSAndroid Build Coastguard Worker
834*1b3f573fSAndroid Build Coastguard Worker- (void)writeEnumArray:(int32_t)fieldNumber
835*1b3f573fSAndroid Build Coastguard Worker                values:(GPBEnumArray *)values
836*1b3f573fSAndroid Build Coastguard Worker                   tag:(uint32_t)tag {
837*1b3f573fSAndroid Build Coastguard Worker  if (tag != 0) {
838*1b3f573fSAndroid Build Coastguard Worker    if (values.count == 0) return;
839*1b3f573fSAndroid Build Coastguard Worker    __block size_t dataSize = 0;
840*1b3f573fSAndroid Build Coastguard Worker    [values enumerateRawValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
841*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
842*1b3f573fSAndroid Build Coastguard Worker      dataSize += GPBComputeEnumSizeNoTag(value);
843*1b3f573fSAndroid Build Coastguard Worker    }];
844*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, tag);
845*1b3f573fSAndroid Build Coastguard Worker    GPBWriteRawVarint32(&state_, (int32_t)dataSize);
846*1b3f573fSAndroid Build Coastguard Worker    [values enumerateRawValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
847*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
848*1b3f573fSAndroid Build Coastguard Worker      [self writeEnumNoTag:value];
849*1b3f573fSAndroid Build Coastguard Worker    }];
850*1b3f573fSAndroid Build Coastguard Worker  } else {
851*1b3f573fSAndroid Build Coastguard Worker    [values enumerateRawValuesWithBlock:^(int32_t value, NSUInteger idx, BOOL *stop) {
852*1b3f573fSAndroid Build Coastguard Worker#pragma unused(idx, stop)
853*1b3f573fSAndroid Build Coastguard Worker      [self writeEnum:fieldNumber value:value];
854*1b3f573fSAndroid Build Coastguard Worker    }];
855*1b3f573fSAndroid Build Coastguard Worker  }
856*1b3f573fSAndroid Build Coastguard Worker}
857*1b3f573fSAndroid Build Coastguard Worker
858*1b3f573fSAndroid Build Coastguard Worker// clang-format on
859*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND WRITE_UNPACKABLE_DEFNS(String, NSString)
860*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
861*1b3f573fSAndroid Build Coastguard Worker// clang-format off
862*1b3f573fSAndroid Build Coastguard Worker
863*1b3f573fSAndroid Build Coastguard Worker- (void)writeStringArray:(int32_t)fieldNumber values:(NSArray *)values {
864*1b3f573fSAndroid Build Coastguard Worker  for (NSString *value in values) {
865*1b3f573fSAndroid Build Coastguard Worker    [self writeString:fieldNumber value:value];
866*1b3f573fSAndroid Build Coastguard Worker  }
867*1b3f573fSAndroid Build Coastguard Worker}
868*1b3f573fSAndroid Build Coastguard Worker
869*1b3f573fSAndroid Build Coastguard Worker// clang-format on
870*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND WRITE_UNPACKABLE_DEFNS(Message, GPBMessage)
871*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
872*1b3f573fSAndroid Build Coastguard Worker// clang-format off
873*1b3f573fSAndroid Build Coastguard Worker
874*1b3f573fSAndroid Build Coastguard Worker- (void)writeMessageArray:(int32_t)fieldNumber values:(NSArray *)values {
875*1b3f573fSAndroid Build Coastguard Worker  for (GPBMessage *value in values) {
876*1b3f573fSAndroid Build Coastguard Worker    [self writeMessage:fieldNumber value:value];
877*1b3f573fSAndroid Build Coastguard Worker  }
878*1b3f573fSAndroid Build Coastguard Worker}
879*1b3f573fSAndroid Build Coastguard Worker
880*1b3f573fSAndroid Build Coastguard Worker// clang-format on
881*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND WRITE_UNPACKABLE_DEFNS(Bytes, NSData)
882*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
883*1b3f573fSAndroid Build Coastguard Worker// clang-format off
884*1b3f573fSAndroid Build Coastguard Worker
885*1b3f573fSAndroid Build Coastguard Worker- (void)writeBytesArray:(int32_t)fieldNumber values:(NSArray *)values {
886*1b3f573fSAndroid Build Coastguard Worker  for (NSData *value in values) {
887*1b3f573fSAndroid Build Coastguard Worker    [self writeBytes:fieldNumber value:value];
888*1b3f573fSAndroid Build Coastguard Worker  }
889*1b3f573fSAndroid Build Coastguard Worker}
890*1b3f573fSAndroid Build Coastguard Worker
891*1b3f573fSAndroid Build Coastguard Worker// clang-format on
892*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND WRITE_UNPACKABLE_DEFNS(Group, GPBMessage)
893*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
894*1b3f573fSAndroid Build Coastguard Worker// clang-format off
895*1b3f573fSAndroid Build Coastguard Worker
896*1b3f573fSAndroid Build Coastguard Worker- (void)writeGroupArray:(int32_t)fieldNumber values:(NSArray *)values {
897*1b3f573fSAndroid Build Coastguard Worker  for (GPBMessage *value in values) {
898*1b3f573fSAndroid Build Coastguard Worker    [self writeGroup:fieldNumber value:value];
899*1b3f573fSAndroid Build Coastguard Worker  }
900*1b3f573fSAndroid Build Coastguard Worker}
901*1b3f573fSAndroid Build Coastguard Worker
902*1b3f573fSAndroid Build Coastguard Worker// clang-format on
903*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND WRITE_UNPACKABLE_DEFNS(UnknownGroup, GPBUnknownFieldSet)
904*1b3f573fSAndroid Build Coastguard Worker// This block of code is generated, do not edit it directly.
905*1b3f573fSAndroid Build Coastguard Worker// clang-format off
906*1b3f573fSAndroid Build Coastguard Worker
907*1b3f573fSAndroid Build Coastguard Worker- (void)writeUnknownGroupArray:(int32_t)fieldNumber values:(NSArray *)values {
908*1b3f573fSAndroid Build Coastguard Worker  for (GPBUnknownFieldSet *value in values) {
909*1b3f573fSAndroid Build Coastguard Worker    [self writeUnknownGroup:fieldNumber value:value];
910*1b3f573fSAndroid Build Coastguard Worker  }
911*1b3f573fSAndroid Build Coastguard Worker}
912*1b3f573fSAndroid Build Coastguard Worker
913*1b3f573fSAndroid Build Coastguard Worker// clang-format on
914*1b3f573fSAndroid Build Coastguard Worker//%PDDM-EXPAND-END (19 expansions)
915*1b3f573fSAndroid Build Coastguard Worker
916*1b3f573fSAndroid Build Coastguard Worker- (void)writeMessageSetExtension:(int32_t)fieldNumber
917*1b3f573fSAndroid Build Coastguard Worker                           value:(GPBMessage *)value {
918*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, GPBWireFormatMessageSetItem,
919*1b3f573fSAndroid Build Coastguard Worker                        GPBWireFormatStartGroup);
920*1b3f573fSAndroid Build Coastguard Worker  GPBWriteUInt32(&state_, GPBWireFormatMessageSetTypeId, fieldNumber);
921*1b3f573fSAndroid Build Coastguard Worker  [self writeMessage:GPBWireFormatMessageSetMessage value:value];
922*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, GPBWireFormatMessageSetItem,
923*1b3f573fSAndroid Build Coastguard Worker                        GPBWireFormatEndGroup);
924*1b3f573fSAndroid Build Coastguard Worker}
925*1b3f573fSAndroid Build Coastguard Worker
926*1b3f573fSAndroid Build Coastguard Worker- (void)writeRawMessageSetExtension:(int32_t)fieldNumber value:(NSData *)value {
927*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, GPBWireFormatMessageSetItem,
928*1b3f573fSAndroid Build Coastguard Worker                        GPBWireFormatStartGroup);
929*1b3f573fSAndroid Build Coastguard Worker  GPBWriteUInt32(&state_, GPBWireFormatMessageSetTypeId, fieldNumber);
930*1b3f573fSAndroid Build Coastguard Worker  [self writeBytes:GPBWireFormatMessageSetMessage value:value];
931*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, GPBWireFormatMessageSetItem,
932*1b3f573fSAndroid Build Coastguard Worker                        GPBWireFormatEndGroup);
933*1b3f573fSAndroid Build Coastguard Worker}
934*1b3f573fSAndroid Build Coastguard Worker
935*1b3f573fSAndroid Build Coastguard Worker- (void)flush {
936*1b3f573fSAndroid Build Coastguard Worker  if (state_.output != nil) {
937*1b3f573fSAndroid Build Coastguard Worker    GPBRefreshBuffer(&state_);
938*1b3f573fSAndroid Build Coastguard Worker  }
939*1b3f573fSAndroid Build Coastguard Worker}
940*1b3f573fSAndroid Build Coastguard Worker
941*1b3f573fSAndroid Build Coastguard Worker- (void)writeRawByte:(uint8_t)value {
942*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawByte(&state_, value);
943*1b3f573fSAndroid Build Coastguard Worker}
944*1b3f573fSAndroid Build Coastguard Worker
945*1b3f573fSAndroid Build Coastguard Worker- (void)writeRawData:(const NSData *)data {
946*1b3f573fSAndroid Build Coastguard Worker  [self writeRawPtr:[data bytes] offset:0 length:[data length]];
947*1b3f573fSAndroid Build Coastguard Worker}
948*1b3f573fSAndroid Build Coastguard Worker
949*1b3f573fSAndroid Build Coastguard Worker- (void)writeRawPtr:(const void *)value
950*1b3f573fSAndroid Build Coastguard Worker             offset:(size_t)offset
951*1b3f573fSAndroid Build Coastguard Worker             length:(size_t)length {
952*1b3f573fSAndroid Build Coastguard Worker  if (value == nil || length == 0) {
953*1b3f573fSAndroid Build Coastguard Worker    return;
954*1b3f573fSAndroid Build Coastguard Worker  }
955*1b3f573fSAndroid Build Coastguard Worker
956*1b3f573fSAndroid Build Coastguard Worker  NSUInteger bufferLength = state_.size;
957*1b3f573fSAndroid Build Coastguard Worker  NSUInteger bufferBytesLeft = bufferLength - state_.position;
958*1b3f573fSAndroid Build Coastguard Worker  if (bufferBytesLeft >= length) {
959*1b3f573fSAndroid Build Coastguard Worker    // We have room in the current buffer.
960*1b3f573fSAndroid Build Coastguard Worker    memcpy(state_.bytes + state_.position, ((uint8_t *)value) + offset, length);
961*1b3f573fSAndroid Build Coastguard Worker    state_.position += length;
962*1b3f573fSAndroid Build Coastguard Worker  } else {
963*1b3f573fSAndroid Build Coastguard Worker    // Write extends past current buffer.  Fill the rest of this buffer and
964*1b3f573fSAndroid Build Coastguard Worker    // flush.
965*1b3f573fSAndroid Build Coastguard Worker    size_t bytesWritten = bufferBytesLeft;
966*1b3f573fSAndroid Build Coastguard Worker    memcpy(state_.bytes + state_.position, ((uint8_t *)value) + offset,
967*1b3f573fSAndroid Build Coastguard Worker           bytesWritten);
968*1b3f573fSAndroid Build Coastguard Worker    offset += bytesWritten;
969*1b3f573fSAndroid Build Coastguard Worker    length -= bytesWritten;
970*1b3f573fSAndroid Build Coastguard Worker    state_.position = bufferLength;
971*1b3f573fSAndroid Build Coastguard Worker    GPBRefreshBuffer(&state_);
972*1b3f573fSAndroid Build Coastguard Worker    bufferLength = state_.size;
973*1b3f573fSAndroid Build Coastguard Worker
974*1b3f573fSAndroid Build Coastguard Worker    // Now deal with the rest.
975*1b3f573fSAndroid Build Coastguard Worker    // Since we have an output stream, this is our buffer
976*1b3f573fSAndroid Build Coastguard Worker    // and buffer offset == 0
977*1b3f573fSAndroid Build Coastguard Worker    if (length <= bufferLength) {
978*1b3f573fSAndroid Build Coastguard Worker      // Fits in new buffer.
979*1b3f573fSAndroid Build Coastguard Worker      memcpy(state_.bytes, ((uint8_t *)value) + offset, length);
980*1b3f573fSAndroid Build Coastguard Worker      state_.position = length;
981*1b3f573fSAndroid Build Coastguard Worker    } else {
982*1b3f573fSAndroid Build Coastguard Worker      // Write is very big.  Let's do it all at once.
983*1b3f573fSAndroid Build Coastguard Worker      NSInteger written = [state_.output write:((uint8_t *)value) + offset maxLength:length];
984*1b3f573fSAndroid Build Coastguard Worker      if (written != (NSInteger)length) {
985*1b3f573fSAndroid Build Coastguard Worker        [NSException raise:GPBCodedOutputStreamException_WriteFailed format:@""];
986*1b3f573fSAndroid Build Coastguard Worker      }
987*1b3f573fSAndroid Build Coastguard Worker    }
988*1b3f573fSAndroid Build Coastguard Worker  }
989*1b3f573fSAndroid Build Coastguard Worker}
990*1b3f573fSAndroid Build Coastguard Worker
991*1b3f573fSAndroid Build Coastguard Worker- (void)writeTag:(uint32_t)fieldNumber format:(GPBWireFormat)format {
992*1b3f573fSAndroid Build Coastguard Worker  GPBWriteTagWithFormat(&state_, fieldNumber, format);
993*1b3f573fSAndroid Build Coastguard Worker}
994*1b3f573fSAndroid Build Coastguard Worker
995*1b3f573fSAndroid Build Coastguard Worker- (void)writeRawVarint32:(int32_t)value {
996*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawVarint32(&state_, value);
997*1b3f573fSAndroid Build Coastguard Worker}
998*1b3f573fSAndroid Build Coastguard Worker
999*1b3f573fSAndroid Build Coastguard Worker- (void)writeRawVarintSizeTAs32:(size_t)value {
1000*1b3f573fSAndroid Build Coastguard Worker  // Note the truncation.
1001*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawVarint32(&state_, (int32_t)value);
1002*1b3f573fSAndroid Build Coastguard Worker}
1003*1b3f573fSAndroid Build Coastguard Worker
1004*1b3f573fSAndroid Build Coastguard Worker- (void)writeRawVarint64:(int64_t)value {
1005*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawVarint64(&state_, value);
1006*1b3f573fSAndroid Build Coastguard Worker}
1007*1b3f573fSAndroid Build Coastguard Worker
1008*1b3f573fSAndroid Build Coastguard Worker- (void)writeRawLittleEndian32:(int32_t)value {
1009*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawLittleEndian32(&state_, value);
1010*1b3f573fSAndroid Build Coastguard Worker}
1011*1b3f573fSAndroid Build Coastguard Worker
1012*1b3f573fSAndroid Build Coastguard Worker- (void)writeRawLittleEndian64:(int64_t)value {
1013*1b3f573fSAndroid Build Coastguard Worker  GPBWriteRawLittleEndian64(&state_, value);
1014*1b3f573fSAndroid Build Coastguard Worker}
1015*1b3f573fSAndroid Build Coastguard Worker
1016*1b3f573fSAndroid Build Coastguard Worker#pragma clang diagnostic pop
1017*1b3f573fSAndroid Build Coastguard Worker
1018*1b3f573fSAndroid Build Coastguard Worker@end
1019*1b3f573fSAndroid Build Coastguard Worker
1020*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeDoubleSizeNoTag(Float64 value) {
1021*1b3f573fSAndroid Build Coastguard Worker#pragma unused(value)
1022*1b3f573fSAndroid Build Coastguard Worker  return LITTLE_ENDIAN_64_SIZE;
1023*1b3f573fSAndroid Build Coastguard Worker}
1024*1b3f573fSAndroid Build Coastguard Worker
1025*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeFloatSizeNoTag(Float32 value) {
1026*1b3f573fSAndroid Build Coastguard Worker#pragma unused(value)
1027*1b3f573fSAndroid Build Coastguard Worker  return LITTLE_ENDIAN_32_SIZE;
1028*1b3f573fSAndroid Build Coastguard Worker}
1029*1b3f573fSAndroid Build Coastguard Worker
1030*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeUInt64SizeNoTag(uint64_t value) {
1031*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeRawVarint64Size(value);
1032*1b3f573fSAndroid Build Coastguard Worker}
1033*1b3f573fSAndroid Build Coastguard Worker
1034*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeInt64SizeNoTag(int64_t value) {
1035*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeRawVarint64Size(value);
1036*1b3f573fSAndroid Build Coastguard Worker}
1037*1b3f573fSAndroid Build Coastguard Worker
1038*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeInt32SizeNoTag(int32_t value) {
1039*1b3f573fSAndroid Build Coastguard Worker  if (value >= 0) {
1040*1b3f573fSAndroid Build Coastguard Worker    return GPBComputeRawVarint32Size(value);
1041*1b3f573fSAndroid Build Coastguard Worker  } else {
1042*1b3f573fSAndroid Build Coastguard Worker    // Must sign-extend.
1043*1b3f573fSAndroid Build Coastguard Worker    return 10;
1044*1b3f573fSAndroid Build Coastguard Worker  }
1045*1b3f573fSAndroid Build Coastguard Worker}
1046*1b3f573fSAndroid Build Coastguard Worker
1047*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeSizeTSizeAsInt32NoTag(size_t value) {
1048*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeInt32SizeNoTag((int32_t)value);
1049*1b3f573fSAndroid Build Coastguard Worker}
1050*1b3f573fSAndroid Build Coastguard Worker
1051*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeFixed64SizeNoTag(uint64_t value) {
1052*1b3f573fSAndroid Build Coastguard Worker#pragma unused(value)
1053*1b3f573fSAndroid Build Coastguard Worker  return LITTLE_ENDIAN_64_SIZE;
1054*1b3f573fSAndroid Build Coastguard Worker}
1055*1b3f573fSAndroid Build Coastguard Worker
1056*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeFixed32SizeNoTag(uint32_t value) {
1057*1b3f573fSAndroid Build Coastguard Worker#pragma unused(value)
1058*1b3f573fSAndroid Build Coastguard Worker  return LITTLE_ENDIAN_32_SIZE;
1059*1b3f573fSAndroid Build Coastguard Worker}
1060*1b3f573fSAndroid Build Coastguard Worker
1061*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeBoolSizeNoTag(BOOL value) {
1062*1b3f573fSAndroid Build Coastguard Worker#pragma unused(value)
1063*1b3f573fSAndroid Build Coastguard Worker  return 1;
1064*1b3f573fSAndroid Build Coastguard Worker}
1065*1b3f573fSAndroid Build Coastguard Worker
1066*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeStringSizeNoTag(NSString *value) {
1067*1b3f573fSAndroid Build Coastguard Worker  NSUInteger length = [value lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
1068*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeRawVarint32SizeForInteger(length) + length;
1069*1b3f573fSAndroid Build Coastguard Worker}
1070*1b3f573fSAndroid Build Coastguard Worker
1071*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeGroupSizeNoTag(GPBMessage *value) {
1072*1b3f573fSAndroid Build Coastguard Worker  return [value serializedSize];
1073*1b3f573fSAndroid Build Coastguard Worker}
1074*1b3f573fSAndroid Build Coastguard Worker
1075*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeUnknownGroupSizeNoTag(GPBUnknownFieldSet *value) {
1076*1b3f573fSAndroid Build Coastguard Worker  return value.serializedSize;
1077*1b3f573fSAndroid Build Coastguard Worker}
1078*1b3f573fSAndroid Build Coastguard Worker
1079*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeMessageSizeNoTag(GPBMessage *value) {
1080*1b3f573fSAndroid Build Coastguard Worker  size_t size = [value serializedSize];
1081*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeRawVarint32SizeForInteger(size) + size;
1082*1b3f573fSAndroid Build Coastguard Worker}
1083*1b3f573fSAndroid Build Coastguard Worker
1084*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeBytesSizeNoTag(NSData *value) {
1085*1b3f573fSAndroid Build Coastguard Worker  NSUInteger valueLength = [value length];
1086*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeRawVarint32SizeForInteger(valueLength) + valueLength;
1087*1b3f573fSAndroid Build Coastguard Worker}
1088*1b3f573fSAndroid Build Coastguard Worker
1089*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeUInt32SizeNoTag(int32_t value) {
1090*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeRawVarint32Size(value);
1091*1b3f573fSAndroid Build Coastguard Worker}
1092*1b3f573fSAndroid Build Coastguard Worker
1093*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeEnumSizeNoTag(int32_t value) {
1094*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeInt32SizeNoTag(value);
1095*1b3f573fSAndroid Build Coastguard Worker}
1096*1b3f573fSAndroid Build Coastguard Worker
1097*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeSFixed32SizeNoTag(int32_t value) {
1098*1b3f573fSAndroid Build Coastguard Worker#pragma unused(value)
1099*1b3f573fSAndroid Build Coastguard Worker  return LITTLE_ENDIAN_32_SIZE;
1100*1b3f573fSAndroid Build Coastguard Worker}
1101*1b3f573fSAndroid Build Coastguard Worker
1102*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeSFixed64SizeNoTag(int64_t value) {
1103*1b3f573fSAndroid Build Coastguard Worker#pragma unused(value)
1104*1b3f573fSAndroid Build Coastguard Worker  return LITTLE_ENDIAN_64_SIZE;
1105*1b3f573fSAndroid Build Coastguard Worker}
1106*1b3f573fSAndroid Build Coastguard Worker
1107*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeSInt32SizeNoTag(int32_t value) {
1108*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeRawVarint32Size(GPBEncodeZigZag32(value));
1109*1b3f573fSAndroid Build Coastguard Worker}
1110*1b3f573fSAndroid Build Coastguard Worker
1111*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeSInt64SizeNoTag(int64_t value) {
1112*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeRawVarint64Size(GPBEncodeZigZag64(value));
1113*1b3f573fSAndroid Build Coastguard Worker}
1114*1b3f573fSAndroid Build Coastguard Worker
1115*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeDoubleSize(int32_t fieldNumber, double value) {
1116*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeTagSize(fieldNumber) + GPBComputeDoubleSizeNoTag(value);
1117*1b3f573fSAndroid Build Coastguard Worker}
1118*1b3f573fSAndroid Build Coastguard Worker
1119*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeFloatSize(int32_t fieldNumber, float value) {
1120*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeTagSize(fieldNumber) + GPBComputeFloatSizeNoTag(value);
1121*1b3f573fSAndroid Build Coastguard Worker}
1122*1b3f573fSAndroid Build Coastguard Worker
1123*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeUInt64Size(int32_t fieldNumber, uint64_t value) {
1124*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeTagSize(fieldNumber) + GPBComputeUInt64SizeNoTag(value);
1125*1b3f573fSAndroid Build Coastguard Worker}
1126*1b3f573fSAndroid Build Coastguard Worker
1127*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeInt64Size(int32_t fieldNumber, int64_t value) {
1128*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeTagSize(fieldNumber) + GPBComputeInt64SizeNoTag(value);
1129*1b3f573fSAndroid Build Coastguard Worker}
1130*1b3f573fSAndroid Build Coastguard Worker
1131*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeInt32Size(int32_t fieldNumber, int32_t value) {
1132*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeTagSize(fieldNumber) + GPBComputeInt32SizeNoTag(value);
1133*1b3f573fSAndroid Build Coastguard Worker}
1134*1b3f573fSAndroid Build Coastguard Worker
1135*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeFixed64Size(int32_t fieldNumber, uint64_t value) {
1136*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeTagSize(fieldNumber) + GPBComputeFixed64SizeNoTag(value);
1137*1b3f573fSAndroid Build Coastguard Worker}
1138*1b3f573fSAndroid Build Coastguard Worker
1139*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeFixed32Size(int32_t fieldNumber, uint32_t value) {
1140*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeTagSize(fieldNumber) + GPBComputeFixed32SizeNoTag(value);
1141*1b3f573fSAndroid Build Coastguard Worker}
1142*1b3f573fSAndroid Build Coastguard Worker
1143*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeBoolSize(int32_t fieldNumber, BOOL value) {
1144*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeTagSize(fieldNumber) + GPBComputeBoolSizeNoTag(value);
1145*1b3f573fSAndroid Build Coastguard Worker}
1146*1b3f573fSAndroid Build Coastguard Worker
1147*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeStringSize(int32_t fieldNumber, NSString *value) {
1148*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeTagSize(fieldNumber) + GPBComputeStringSizeNoTag(value);
1149*1b3f573fSAndroid Build Coastguard Worker}
1150*1b3f573fSAndroid Build Coastguard Worker
1151*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeGroupSize(int32_t fieldNumber, GPBMessage *value) {
1152*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeTagSize(fieldNumber) * 2 + GPBComputeGroupSizeNoTag(value);
1153*1b3f573fSAndroid Build Coastguard Worker}
1154*1b3f573fSAndroid Build Coastguard Worker
1155*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeUnknownGroupSize(int32_t fieldNumber,
1156*1b3f573fSAndroid Build Coastguard Worker                                  GPBUnknownFieldSet *value) {
1157*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeTagSize(fieldNumber) * 2 +
1158*1b3f573fSAndroid Build Coastguard Worker         GPBComputeUnknownGroupSizeNoTag(value);
1159*1b3f573fSAndroid Build Coastguard Worker}
1160*1b3f573fSAndroid Build Coastguard Worker
1161*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeMessageSize(int32_t fieldNumber, GPBMessage *value) {
1162*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeTagSize(fieldNumber) + GPBComputeMessageSizeNoTag(value);
1163*1b3f573fSAndroid Build Coastguard Worker}
1164*1b3f573fSAndroid Build Coastguard Worker
1165*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeBytesSize(int32_t fieldNumber, NSData *value) {
1166*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeTagSize(fieldNumber) + GPBComputeBytesSizeNoTag(value);
1167*1b3f573fSAndroid Build Coastguard Worker}
1168*1b3f573fSAndroid Build Coastguard Worker
1169*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeUInt32Size(int32_t fieldNumber, uint32_t value) {
1170*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeTagSize(fieldNumber) + GPBComputeUInt32SizeNoTag(value);
1171*1b3f573fSAndroid Build Coastguard Worker}
1172*1b3f573fSAndroid Build Coastguard Worker
1173*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeEnumSize(int32_t fieldNumber, int32_t value) {
1174*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeTagSize(fieldNumber) + GPBComputeEnumSizeNoTag(value);
1175*1b3f573fSAndroid Build Coastguard Worker}
1176*1b3f573fSAndroid Build Coastguard Worker
1177*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeSFixed32Size(int32_t fieldNumber, int32_t value) {
1178*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeTagSize(fieldNumber) + GPBComputeSFixed32SizeNoTag(value);
1179*1b3f573fSAndroid Build Coastguard Worker}
1180*1b3f573fSAndroid Build Coastguard Worker
1181*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeSFixed64Size(int32_t fieldNumber, int64_t value) {
1182*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeTagSize(fieldNumber) + GPBComputeSFixed64SizeNoTag(value);
1183*1b3f573fSAndroid Build Coastguard Worker}
1184*1b3f573fSAndroid Build Coastguard Worker
1185*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeSInt32Size(int32_t fieldNumber, int32_t value) {
1186*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeTagSize(fieldNumber) + GPBComputeSInt32SizeNoTag(value);
1187*1b3f573fSAndroid Build Coastguard Worker}
1188*1b3f573fSAndroid Build Coastguard Worker
1189*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeSInt64Size(int32_t fieldNumber, int64_t value) {
1190*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeTagSize(fieldNumber) +
1191*1b3f573fSAndroid Build Coastguard Worker         GPBComputeRawVarint64Size(GPBEncodeZigZag64(value));
1192*1b3f573fSAndroid Build Coastguard Worker}
1193*1b3f573fSAndroid Build Coastguard Worker
1194*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeMessageSetExtensionSize(int32_t fieldNumber,
1195*1b3f573fSAndroid Build Coastguard Worker                                         GPBMessage *value) {
1196*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeTagSize(GPBWireFormatMessageSetItem) * 2 +
1197*1b3f573fSAndroid Build Coastguard Worker         GPBComputeUInt32Size(GPBWireFormatMessageSetTypeId, fieldNumber) +
1198*1b3f573fSAndroid Build Coastguard Worker         GPBComputeMessageSize(GPBWireFormatMessageSetMessage, value);
1199*1b3f573fSAndroid Build Coastguard Worker}
1200*1b3f573fSAndroid Build Coastguard Worker
1201*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeRawMessageSetExtensionSize(int32_t fieldNumber,
1202*1b3f573fSAndroid Build Coastguard Worker                                            NSData *value) {
1203*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeTagSize(GPBWireFormatMessageSetItem) * 2 +
1204*1b3f573fSAndroid Build Coastguard Worker         GPBComputeUInt32Size(GPBWireFormatMessageSetTypeId, fieldNumber) +
1205*1b3f573fSAndroid Build Coastguard Worker         GPBComputeBytesSize(GPBWireFormatMessageSetMessage, value);
1206*1b3f573fSAndroid Build Coastguard Worker}
1207*1b3f573fSAndroid Build Coastguard Worker
1208*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeTagSize(int32_t fieldNumber) {
1209*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeRawVarint32Size(
1210*1b3f573fSAndroid Build Coastguard Worker      GPBWireFormatMakeTag(fieldNumber, GPBWireFormatVarint));
1211*1b3f573fSAndroid Build Coastguard Worker}
1212*1b3f573fSAndroid Build Coastguard Worker
1213*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeWireFormatTagSize(int field_number, GPBDataType dataType) {
1214*1b3f573fSAndroid Build Coastguard Worker  size_t result = GPBComputeTagSize(field_number);
1215*1b3f573fSAndroid Build Coastguard Worker  if (dataType == GPBDataTypeGroup) {
1216*1b3f573fSAndroid Build Coastguard Worker    // Groups have both a start and an end tag.
1217*1b3f573fSAndroid Build Coastguard Worker    return result * 2;
1218*1b3f573fSAndroid Build Coastguard Worker  } else {
1219*1b3f573fSAndroid Build Coastguard Worker    return result;
1220*1b3f573fSAndroid Build Coastguard Worker  }
1221*1b3f573fSAndroid Build Coastguard Worker}
1222*1b3f573fSAndroid Build Coastguard Worker
1223*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeRawVarint32Size(int32_t value) {
1224*1b3f573fSAndroid Build Coastguard Worker  // value is treated as unsigned, so it won't be sign-extended if negative.
1225*1b3f573fSAndroid Build Coastguard Worker  if ((value & (0xffffffff << 7)) == 0) return 1;
1226*1b3f573fSAndroid Build Coastguard Worker  if ((value & (0xffffffff << 14)) == 0) return 2;
1227*1b3f573fSAndroid Build Coastguard Worker  if ((value & (0xffffffff << 21)) == 0) return 3;
1228*1b3f573fSAndroid Build Coastguard Worker  if ((value & (0xffffffff << 28)) == 0) return 4;
1229*1b3f573fSAndroid Build Coastguard Worker  return 5;
1230*1b3f573fSAndroid Build Coastguard Worker}
1231*1b3f573fSAndroid Build Coastguard Worker
1232*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeRawVarint32SizeForInteger(NSInteger value) {
1233*1b3f573fSAndroid Build Coastguard Worker  // Note the truncation.
1234*1b3f573fSAndroid Build Coastguard Worker  return GPBComputeRawVarint32Size((int32_t)value);
1235*1b3f573fSAndroid Build Coastguard Worker}
1236*1b3f573fSAndroid Build Coastguard Worker
1237*1b3f573fSAndroid Build Coastguard Workersize_t GPBComputeRawVarint64Size(int64_t value) {
1238*1b3f573fSAndroid Build Coastguard Worker  if ((value & (0xffffffffffffffffL << 7)) == 0) return 1;
1239*1b3f573fSAndroid Build Coastguard Worker  if ((value & (0xffffffffffffffffL << 14)) == 0) return 2;
1240*1b3f573fSAndroid Build Coastguard Worker  if ((value & (0xffffffffffffffffL << 21)) == 0) return 3;
1241*1b3f573fSAndroid Build Coastguard Worker  if ((value & (0xffffffffffffffffL << 28)) == 0) return 4;
1242*1b3f573fSAndroid Build Coastguard Worker  if ((value & (0xffffffffffffffffL << 35)) == 0) return 5;
1243*1b3f573fSAndroid Build Coastguard Worker  if ((value & (0xffffffffffffffffL << 42)) == 0) return 6;
1244*1b3f573fSAndroid Build Coastguard Worker  if ((value & (0xffffffffffffffffL << 49)) == 0) return 7;
1245*1b3f573fSAndroid Build Coastguard Worker  if ((value & (0xffffffffffffffffL << 56)) == 0) return 8;
1246*1b3f573fSAndroid Build Coastguard Worker  if ((value & (0xffffffffffffffffL << 63)) == 0) return 9;
1247*1b3f573fSAndroid Build Coastguard Worker  return 10;
1248*1b3f573fSAndroid Build Coastguard Worker}
1249