1
// Protocol Buffers - Google's data interchange format
2
// Copyright 2008 Google Inc. All rights reserved.
3
// http://code.google.com/p/protobuf/
5
// Redistribution and use in source and binary forms, with or without
6
// modification, are permitted provided that the following conditions are
9
// * Redistributions of source code must retain the above copyright
10
// notice, this list of conditions and the following disclaimer.
11
// * Redistributions in binary form must reproduce the above
12
// copyright notice, this list of conditions and the following disclaimer
13
// in the documentation and/or other materials provided with the
15
// * Neither the name of Google Inc. nor the names of its
16
// contributors may be used to endorse or promote products derived from
17
// this software without specific prior written permission.
19
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
// Author: kenton@google.com (Kenton Varda)
32
// wink@google.com (Wink Saville) (refactored from wire_format.h)
33
// Based on original Protocol Buffers design by
34
// Sanjay Ghemawat, Jeff Dean, and others.
36
#ifndef GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_INL_H__
37
#define GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_INL_H__
40
#include <google/protobuf/stubs/common.h>
41
#include <google/protobuf/message_lite.h>
42
#include <google/protobuf/repeated_field.h>
43
#include <google/protobuf/wire_format_lite.h>
44
#include <google/protobuf/generated_message_util.h>
45
#include <google/protobuf/io/coded_stream.h>
52
// Implementation details of ReadPrimitive.
55
inline bool WireFormatLite::ReadPrimitive<int32, WireFormatLite::TYPE_INT32>(
56
io::CodedInputStream* input,
59
if (!input->ReadVarint32(&temp)) return false;
60
*value = static_cast<int32>(temp);
64
inline bool WireFormatLite::ReadPrimitive<int64, WireFormatLite::TYPE_INT64>(
65
io::CodedInputStream* input,
68
if (!input->ReadVarint64(&temp)) return false;
69
*value = static_cast<int64>(temp);
73
inline bool WireFormatLite::ReadPrimitive<uint32, WireFormatLite::TYPE_UINT32>(
74
io::CodedInputStream* input,
76
return input->ReadVarint32(value);
79
inline bool WireFormatLite::ReadPrimitive<uint64, WireFormatLite::TYPE_UINT64>(
80
io::CodedInputStream* input,
82
return input->ReadVarint64(value);
85
inline bool WireFormatLite::ReadPrimitive<int32, WireFormatLite::TYPE_SINT32>(
86
io::CodedInputStream* input,
89
if (!input->ReadVarint32(&temp)) return false;
90
*value = ZigZagDecode32(temp);
94
inline bool WireFormatLite::ReadPrimitive<int64, WireFormatLite::TYPE_SINT64>(
95
io::CodedInputStream* input,
98
if (!input->ReadVarint64(&temp)) return false;
99
*value = ZigZagDecode64(temp);
103
inline bool WireFormatLite::ReadPrimitive<uint32, WireFormatLite::TYPE_FIXED32>(
104
io::CodedInputStream* input,
106
return input->ReadLittleEndian32(value);
109
inline bool WireFormatLite::ReadPrimitive<uint64, WireFormatLite::TYPE_FIXED64>(
110
io::CodedInputStream* input,
112
return input->ReadLittleEndian64(value);
115
inline bool WireFormatLite::ReadPrimitive<int32, WireFormatLite::TYPE_SFIXED32>(
116
io::CodedInputStream* input,
119
if (!input->ReadLittleEndian32(&temp)) return false;
120
*value = static_cast<int32>(temp);
124
inline bool WireFormatLite::ReadPrimitive<int64, WireFormatLite::TYPE_SFIXED64>(
125
io::CodedInputStream* input,
128
if (!input->ReadLittleEndian64(&temp)) return false;
129
*value = static_cast<int64>(temp);
133
inline bool WireFormatLite::ReadPrimitive<float, WireFormatLite::TYPE_FLOAT>(
134
io::CodedInputStream* input,
137
if (!input->ReadLittleEndian32(&temp)) return false;
138
*value = DecodeFloat(temp);
142
inline bool WireFormatLite::ReadPrimitive<double, WireFormatLite::TYPE_DOUBLE>(
143
io::CodedInputStream* input,
146
if (!input->ReadLittleEndian64(&temp)) return false;
147
*value = DecodeDouble(temp);
151
inline bool WireFormatLite::ReadPrimitive<bool, WireFormatLite::TYPE_BOOL>(
152
io::CodedInputStream* input,
155
if (!input->ReadVarint32(&temp)) return false;
160
inline bool WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
161
io::CodedInputStream* input,
164
if (!input->ReadVarint32(&temp)) return false;
165
*value = static_cast<int>(temp);
170
inline const uint8* WireFormatLite::ReadPrimitiveFromArray<
171
uint32, WireFormatLite::TYPE_FIXED32>(
174
return io::CodedInputStream::ReadLittleEndian32FromArray(buffer, value);
177
inline const uint8* WireFormatLite::ReadPrimitiveFromArray<
178
uint64, WireFormatLite::TYPE_FIXED64>(
181
return io::CodedInputStream::ReadLittleEndian64FromArray(buffer, value);
184
inline const uint8* WireFormatLite::ReadPrimitiveFromArray<
185
int32, WireFormatLite::TYPE_SFIXED32>(
189
buffer = io::CodedInputStream::ReadLittleEndian32FromArray(buffer, &temp);
190
*value = static_cast<int32>(temp);
194
inline const uint8* WireFormatLite::ReadPrimitiveFromArray<
195
int64, WireFormatLite::TYPE_SFIXED64>(
199
buffer = io::CodedInputStream::ReadLittleEndian64FromArray(buffer, &temp);
200
*value = static_cast<int64>(temp);
204
inline const uint8* WireFormatLite::ReadPrimitiveFromArray<
205
float, WireFormatLite::TYPE_FLOAT>(
209
buffer = io::CodedInputStream::ReadLittleEndian32FromArray(buffer, &temp);
210
*value = DecodeFloat(temp);
214
inline const uint8* WireFormatLite::ReadPrimitiveFromArray<
215
double, WireFormatLite::TYPE_DOUBLE>(
219
buffer = io::CodedInputStream::ReadLittleEndian64FromArray(buffer, &temp);
220
*value = DecodeDouble(temp);
224
template <typename CType, enum WireFormatLite::FieldType DeclaredType>
225
inline bool WireFormatLite::ReadRepeatedPrimitive(int tag_size,
227
io::CodedInputStream* input,
228
RepeatedField<CType>* values) {
230
if (!ReadPrimitive<CType, DeclaredType>(input, &value)) return false;
232
int elements_already_reserved = values->Capacity() - values->size();
233
while (elements_already_reserved > 0 && input->ExpectTag(tag)) {
234
if (!ReadPrimitive<CType, DeclaredType>(input, &value)) return false;
235
values->AddAlreadyReserved(value);
236
elements_already_reserved--;
241
template <typename CType, enum WireFormatLite::FieldType DeclaredType>
242
inline bool WireFormatLite::ReadRepeatedFixedSizePrimitive(
245
io::CodedInputStream* input,
246
RepeatedField<CType>* values) {
247
GOOGLE_DCHECK_EQ(UInt32Size(tag), tag_size);
249
if (!ReadPrimitive<CType, DeclaredType>(input, &value))
253
// For fixed size values, repeated values can be read more quickly by
254
// reading directly from a raw array.
256
// We can get a tight loop by only reading as many elements as can be
257
// added to the RepeatedField without having to do any resizing. Additionally,
258
// we only try to read as many elements as are available from the current
259
// buffer space. Doing so avoids having to perform boundary checks when
260
// reading the value: the maximum number of elements that can be read is
261
// known outside of the loop.
262
const void* void_pointer;
264
input->GetDirectBufferPointerInline(&void_pointer, &size);
266
const uint8* buffer = reinterpret_cast<const uint8*>(void_pointer);
267
// The number of bytes each type occupies on the wire.
268
const int per_value_size = tag_size + sizeof(value);
270
int elements_available = min(values->Capacity() - values->size(),
271
size / per_value_size);
273
while (num_read < elements_available &&
274
(buffer = io::CodedInputStream::ExpectTagFromArray(
275
buffer, tag)) != NULL) {
276
buffer = ReadPrimitiveFromArray<CType, DeclaredType>(buffer, &value);
277
values->AddAlreadyReserved(value);
280
const int read_bytes = num_read * per_value_size;
281
if (read_bytes > 0) {
282
input->Skip(read_bytes);
288
// Specializations of ReadRepeatedPrimitive for the fixed size types, which use
289
// the optimized code path.
290
#define READ_REPEATED_FIXED_SIZE_PRIMITIVE(CPPTYPE, DECLARED_TYPE) \
292
inline bool WireFormatLite::ReadRepeatedPrimitive< \
293
CPPTYPE, WireFormatLite::DECLARED_TYPE>( \
296
io::CodedInputStream* input, \
297
RepeatedField<CPPTYPE>* values) { \
298
return ReadRepeatedFixedSizePrimitive< \
299
CPPTYPE, WireFormatLite::DECLARED_TYPE>( \
300
tag_size, tag, input, values); \
303
READ_REPEATED_FIXED_SIZE_PRIMITIVE(uint32, TYPE_FIXED32);
304
READ_REPEATED_FIXED_SIZE_PRIMITIVE(uint64, TYPE_FIXED64);
305
READ_REPEATED_FIXED_SIZE_PRIMITIVE(int32, TYPE_SFIXED32);
306
READ_REPEATED_FIXED_SIZE_PRIMITIVE(int64, TYPE_SFIXED64);
307
READ_REPEATED_FIXED_SIZE_PRIMITIVE(float, TYPE_FLOAT);
308
READ_REPEATED_FIXED_SIZE_PRIMITIVE(double, TYPE_DOUBLE);
310
#undef READ_REPEATED_FIXED_SIZE_PRIMITIVE
312
template <typename CType, enum WireFormatLite::FieldType DeclaredType>
313
bool WireFormatLite::ReadRepeatedPrimitiveNoInline(
316
io::CodedInputStream* input,
317
RepeatedField<CType>* value) {
318
return ReadRepeatedPrimitive<CType, DeclaredType>(
319
tag_size, tag, input, value);
322
template <typename CType, enum WireFormatLite::FieldType DeclaredType>
323
inline bool WireFormatLite::ReadPackedPrimitive(io::CodedInputStream* input,
324
RepeatedField<CType>* values) {
326
if (!input->ReadVarint32(&length)) return false;
327
io::CodedInputStream::Limit limit = input->PushLimit(length);
328
while (input->BytesUntilLimit() > 0) {
330
if (!ReadPrimitive<CType, DeclaredType>(input, &value)) return false;
333
input->PopLimit(limit);
337
template <typename CType, enum WireFormatLite::FieldType DeclaredType>
338
bool WireFormatLite::ReadPackedPrimitiveNoInline(io::CodedInputStream* input,
339
RepeatedField<CType>* values) {
340
return ReadPackedPrimitive<CType, DeclaredType>(input, values);
344
inline bool WireFormatLite::ReadGroup(int field_number,
345
io::CodedInputStream* input,
346
MessageLite* value) {
347
if (!input->IncrementRecursionDepth()) return false;
348
if (!value->MergePartialFromCodedStream(input)) return false;
349
input->DecrementRecursionDepth();
350
// Make sure the last thing read was an end tag for this group.
351
if (!input->LastTagWas(MakeTag(field_number, WIRETYPE_END_GROUP))) {
356
inline bool WireFormatLite::ReadMessage(io::CodedInputStream* input,
357
MessageLite* value) {
359
if (!input->ReadVarint32(&length)) return false;
360
if (!input->IncrementRecursionDepth()) return false;
361
io::CodedInputStream::Limit limit = input->PushLimit(length);
362
if (!value->MergePartialFromCodedStream(input)) return false;
363
// Make sure that parsing stopped when the limit was hit, not at an endgroup
365
if (!input->ConsumedEntireMessage()) return false;
366
input->PopLimit(limit);
367
input->DecrementRecursionDepth();
371
template<typename MessageType>
372
inline bool WireFormatLite::ReadGroupNoVirtual(int field_number,
373
io::CodedInputStream* input,
374
MessageType* value) {
375
if (!input->IncrementRecursionDepth()) return false;
376
if (!value->MessageType::MergePartialFromCodedStream(input)) return false;
377
input->DecrementRecursionDepth();
378
// Make sure the last thing read was an end tag for this group.
379
if (!input->LastTagWas(MakeTag(field_number, WIRETYPE_END_GROUP))) {
384
template<typename MessageType>
385
inline bool WireFormatLite::ReadMessageNoVirtual(io::CodedInputStream* input,
386
MessageType* value) {
388
if (!input->ReadVarint32(&length)) return false;
389
if (!input->IncrementRecursionDepth()) return false;
390
io::CodedInputStream::Limit limit = input->PushLimit(length);
391
if (!value->MessageType::MergePartialFromCodedStream(input)) return false;
392
// Make sure that parsing stopped when the limit was hit, not at an endgroup
394
if (!input->ConsumedEntireMessage()) return false;
395
input->PopLimit(limit);
396
input->DecrementRecursionDepth();
400
// ===================================================================
402
inline void WireFormatLite::WriteTag(int field_number, WireType type,
403
io::CodedOutputStream* output) {
404
output->WriteTag(MakeTag(field_number, type));
407
inline void WireFormatLite::WriteInt32NoTag(int32 value,
408
io::CodedOutputStream* output) {
409
output->WriteVarint32SignExtended(value);
411
inline void WireFormatLite::WriteInt64NoTag(int64 value,
412
io::CodedOutputStream* output) {
413
output->WriteVarint64(static_cast<uint64>(value));
415
inline void WireFormatLite::WriteUInt32NoTag(uint32 value,
416
io::CodedOutputStream* output) {
417
output->WriteVarint32(value);
419
inline void WireFormatLite::WriteUInt64NoTag(uint64 value,
420
io::CodedOutputStream* output) {
421
output->WriteVarint64(value);
423
inline void WireFormatLite::WriteSInt32NoTag(int32 value,
424
io::CodedOutputStream* output) {
425
output->WriteVarint32(ZigZagEncode32(value));
427
inline void WireFormatLite::WriteSInt64NoTag(int64 value,
428
io::CodedOutputStream* output) {
429
output->WriteVarint64(ZigZagEncode64(value));
431
inline void WireFormatLite::WriteFixed32NoTag(uint32 value,
432
io::CodedOutputStream* output) {
433
output->WriteLittleEndian32(value);
435
inline void WireFormatLite::WriteFixed64NoTag(uint64 value,
436
io::CodedOutputStream* output) {
437
output->WriteLittleEndian64(value);
439
inline void WireFormatLite::WriteSFixed32NoTag(int32 value,
440
io::CodedOutputStream* output) {
441
output->WriteLittleEndian32(static_cast<uint32>(value));
443
inline void WireFormatLite::WriteSFixed64NoTag(int64 value,
444
io::CodedOutputStream* output) {
445
output->WriteLittleEndian64(static_cast<uint64>(value));
447
inline void WireFormatLite::WriteFloatNoTag(float value,
448
io::CodedOutputStream* output) {
449
output->WriteLittleEndian32(EncodeFloat(value));
451
inline void WireFormatLite::WriteDoubleNoTag(double value,
452
io::CodedOutputStream* output) {
453
output->WriteLittleEndian64(EncodeDouble(value));
455
inline void WireFormatLite::WriteBoolNoTag(bool value,
456
io::CodedOutputStream* output) {
457
output->WriteVarint32(value ? 1 : 0);
459
inline void WireFormatLite::WriteEnumNoTag(int value,
460
io::CodedOutputStream* output) {
461
output->WriteVarint32SignExtended(value);
464
template<typename MessageType>
465
inline void WireFormatLite::WriteGroupNoVirtual(int field_number,
466
const MessageType& value,
467
io::CodedOutputStream* output) {
468
WriteTag(field_number, WIRETYPE_START_GROUP, output);
469
value.MessageType::SerializeWithCachedSizes(output);
470
WriteTag(field_number, WIRETYPE_END_GROUP, output);
472
template<typename MessageType>
473
inline void WireFormatLite::WriteMessageNoVirtual(int field_number,
474
const MessageType& value,
475
io::CodedOutputStream* output) {
476
WriteTag(field_number, WIRETYPE_LENGTH_DELIMITED, output);
477
output->WriteVarint32(value.MessageType::GetCachedSize());
478
value.MessageType::SerializeWithCachedSizes(output);
481
// ===================================================================
483
inline uint8* WireFormatLite::WriteTagToArray(int field_number,
486
return io::CodedOutputStream::WriteTagToArray(MakeTag(field_number, type),
490
inline uint8* WireFormatLite::WriteInt32NoTagToArray(int32 value,
492
return io::CodedOutputStream::WriteVarint32SignExtendedToArray(value, target);
494
inline uint8* WireFormatLite::WriteInt64NoTagToArray(int64 value,
496
return io::CodedOutputStream::WriteVarint64ToArray(
497
static_cast<uint64>(value), target);
499
inline uint8* WireFormatLite::WriteUInt32NoTagToArray(uint32 value,
501
return io::CodedOutputStream::WriteVarint32ToArray(value, target);
503
inline uint8* WireFormatLite::WriteUInt64NoTagToArray(uint64 value,
505
return io::CodedOutputStream::WriteVarint64ToArray(value, target);
507
inline uint8* WireFormatLite::WriteSInt32NoTagToArray(int32 value,
509
return io::CodedOutputStream::WriteVarint32ToArray(ZigZagEncode32(value),
512
inline uint8* WireFormatLite::WriteSInt64NoTagToArray(int64 value,
514
return io::CodedOutputStream::WriteVarint64ToArray(ZigZagEncode64(value),
517
inline uint8* WireFormatLite::WriteFixed32NoTagToArray(uint32 value,
519
return io::CodedOutputStream::WriteLittleEndian32ToArray(value, target);
521
inline uint8* WireFormatLite::WriteFixed64NoTagToArray(uint64 value,
523
return io::CodedOutputStream::WriteLittleEndian64ToArray(value, target);
525
inline uint8* WireFormatLite::WriteSFixed32NoTagToArray(int32 value,
527
return io::CodedOutputStream::WriteLittleEndian32ToArray(
528
static_cast<uint32>(value), target);
530
inline uint8* WireFormatLite::WriteSFixed64NoTagToArray(int64 value,
532
return io::CodedOutputStream::WriteLittleEndian64ToArray(
533
static_cast<uint64>(value), target);
535
inline uint8* WireFormatLite::WriteFloatNoTagToArray(float value,
537
return io::CodedOutputStream::WriteLittleEndian32ToArray(EncodeFloat(value),
540
inline uint8* WireFormatLite::WriteDoubleNoTagToArray(double value,
542
return io::CodedOutputStream::WriteLittleEndian64ToArray(EncodeDouble(value),
545
inline uint8* WireFormatLite::WriteBoolNoTagToArray(bool value,
547
return io::CodedOutputStream::WriteVarint32ToArray(value ? 1 : 0, target);
549
inline uint8* WireFormatLite::WriteEnumNoTagToArray(int value,
551
return io::CodedOutputStream::WriteVarint32SignExtendedToArray(value, target);
554
inline uint8* WireFormatLite::WriteInt32ToArray(int field_number,
557
target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
558
return WriteInt32NoTagToArray(value, target);
560
inline uint8* WireFormatLite::WriteInt64ToArray(int field_number,
563
target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
564
return WriteInt64NoTagToArray(value, target);
566
inline uint8* WireFormatLite::WriteUInt32ToArray(int field_number,
569
target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
570
return WriteUInt32NoTagToArray(value, target);
572
inline uint8* WireFormatLite::WriteUInt64ToArray(int field_number,
575
target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
576
return WriteUInt64NoTagToArray(value, target);
578
inline uint8* WireFormatLite::WriteSInt32ToArray(int field_number,
581
target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
582
return WriteSInt32NoTagToArray(value, target);
584
inline uint8* WireFormatLite::WriteSInt64ToArray(int field_number,
587
target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
588
return WriteSInt64NoTagToArray(value, target);
590
inline uint8* WireFormatLite::WriteFixed32ToArray(int field_number,
593
target = WriteTagToArray(field_number, WIRETYPE_FIXED32, target);
594
return WriteFixed32NoTagToArray(value, target);
596
inline uint8* WireFormatLite::WriteFixed64ToArray(int field_number,
599
target = WriteTagToArray(field_number, WIRETYPE_FIXED64, target);
600
return WriteFixed64NoTagToArray(value, target);
602
inline uint8* WireFormatLite::WriteSFixed32ToArray(int field_number,
605
target = WriteTagToArray(field_number, WIRETYPE_FIXED32, target);
606
return WriteSFixed32NoTagToArray(value, target);
608
inline uint8* WireFormatLite::WriteSFixed64ToArray(int field_number,
611
target = WriteTagToArray(field_number, WIRETYPE_FIXED64, target);
612
return WriteSFixed64NoTagToArray(value, target);
614
inline uint8* WireFormatLite::WriteFloatToArray(int field_number,
617
target = WriteTagToArray(field_number, WIRETYPE_FIXED32, target);
618
return WriteFloatNoTagToArray(value, target);
620
inline uint8* WireFormatLite::WriteDoubleToArray(int field_number,
623
target = WriteTagToArray(field_number, WIRETYPE_FIXED64, target);
624
return WriteDoubleNoTagToArray(value, target);
626
inline uint8* WireFormatLite::WriteBoolToArray(int field_number,
629
target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
630
return WriteBoolNoTagToArray(value, target);
632
inline uint8* WireFormatLite::WriteEnumToArray(int field_number,
635
target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
636
return WriteEnumNoTagToArray(value, target);
639
inline uint8* WireFormatLite::WriteStringToArray(int field_number,
642
// String is for UTF-8 text only
643
// WARNING: In wire_format.cc, both strings and bytes are handled by
644
// WriteString() to avoid code duplication. If the implementations become
645
// different, you will need to update that usage.
646
target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target);
647
target = io::CodedOutputStream::WriteVarint32ToArray(value.size(), target);
648
return io::CodedOutputStream::WriteStringToArray(value, target);
650
inline uint8* WireFormatLite::WriteBytesToArray(int field_number,
653
target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target);
654
target = io::CodedOutputStream::WriteVarint32ToArray(value.size(), target);
655
return io::CodedOutputStream::WriteStringToArray(value, target);
659
inline uint8* WireFormatLite::WriteGroupToArray(int field_number,
660
const MessageLite& value,
662
target = WriteTagToArray(field_number, WIRETYPE_START_GROUP, target);
663
target = value.SerializeWithCachedSizesToArray(target);
664
return WriteTagToArray(field_number, WIRETYPE_END_GROUP, target);
666
inline uint8* WireFormatLite::WriteMessageToArray(int field_number,
667
const MessageLite& value,
669
target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target);
670
target = io::CodedOutputStream::WriteVarint32ToArray(
671
value.GetCachedSize(), target);
672
return value.SerializeWithCachedSizesToArray(target);
675
template<typename MessageType>
676
inline uint8* WireFormatLite::WriteGroupNoVirtualToArray(
677
int field_number, const MessageType& value, uint8* target) {
678
target = WriteTagToArray(field_number, WIRETYPE_START_GROUP, target);
679
target = value.MessageType::SerializeWithCachedSizesToArray(target);
680
return WriteTagToArray(field_number, WIRETYPE_END_GROUP, target);
682
template<typename MessageType>
683
inline uint8* WireFormatLite::WriteMessageNoVirtualToArray(
684
int field_number, const MessageType& value, uint8* target) {
685
target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target);
686
target = io::CodedOutputStream::WriteVarint32ToArray(
687
value.MessageType::GetCachedSize(), target);
688
return value.MessageType::SerializeWithCachedSizesToArray(target);
691
// ===================================================================
693
inline int WireFormatLite::Int32Size(int32 value) {
694
return io::CodedOutputStream::VarintSize32SignExtended(value);
696
inline int WireFormatLite::Int64Size(int64 value) {
697
return io::CodedOutputStream::VarintSize64(static_cast<uint64>(value));
699
inline int WireFormatLite::UInt32Size(uint32 value) {
700
return io::CodedOutputStream::VarintSize32(value);
702
inline int WireFormatLite::UInt64Size(uint64 value) {
703
return io::CodedOutputStream::VarintSize64(value);
705
inline int WireFormatLite::SInt32Size(int32 value) {
706
return io::CodedOutputStream::VarintSize32(ZigZagEncode32(value));
708
inline int WireFormatLite::SInt64Size(int64 value) {
709
return io::CodedOutputStream::VarintSize64(ZigZagEncode64(value));
711
inline int WireFormatLite::EnumSize(int value) {
712
return io::CodedOutputStream::VarintSize32SignExtended(value);
715
inline int WireFormatLite::StringSize(const string& value) {
716
return io::CodedOutputStream::VarintSize32(value.size()) +
719
inline int WireFormatLite::BytesSize(const string& value) {
720
return io::CodedOutputStream::VarintSize32(value.size()) +
725
inline int WireFormatLite::GroupSize(const MessageLite& value) {
726
return value.ByteSize();
728
inline int WireFormatLite::MessageSize(const MessageLite& value) {
729
int size = value.ByteSize();
730
return io::CodedOutputStream::VarintSize32(size) + size;
733
template<typename MessageType>
734
inline int WireFormatLite::GroupSizeNoVirtual(const MessageType& value) {
735
return value.MessageType::ByteSize();
737
template<typename MessageType>
738
inline int WireFormatLite::MessageSizeNoVirtual(const MessageType& value) {
739
int size = value.MessageType::ByteSize();
740
return io::CodedOutputStream::VarintSize32(size) + size;
743
} // namespace internal
744
} // namespace protobuf
746
} // namespace google
747
#endif // GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_INL_H__