15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Protocol Buffers - Google's data interchange format
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2008 Google Inc.  All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://code.google.com/p/protobuf/
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Redistribution and use in source and binary forms, with or without
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modification, are permitted provided that the following conditions are
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// met:
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Redistributions of source code must retain the above copyright
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notice, this list of conditions and the following disclaimer.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Redistributions in binary form must reproduce the above
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// copyright notice, this list of conditions and the following disclaimer
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the documentation and/or other materials provided with the
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// distribution.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Neither the name of Google Inc. nor the names of its
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contributors may be used to endorse or promote products derived from
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this software without specific prior written permission.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: kenton@google.com (Kenton Varda)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//         wink@google.com (Wink Saville) (refactored from wire_format.h)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  Based on original Protocol Buffers design by
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  Sanjay Ghemawat, Jeff Dean, and others.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_INL_H__
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_INL_H__
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/stubs/common.h>
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/message_lite.h>
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/repeated_field.h>
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/wire_format_lite.h>
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/io/coded_stream.h>
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace google {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protobuf {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implementation details of ReadPrimitive.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool WireFormatLite::ReadPrimitive<int32, WireFormatLite::TYPE_INT32>(
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::CodedInputStream* input,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32* value) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 temp;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->ReadVarint32(&temp)) return false;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *value = static_cast<int32>(temp);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool WireFormatLite::ReadPrimitive<int64, WireFormatLite::TYPE_INT64>(
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::CodedInputStream* input,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64* value) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint64 temp;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->ReadVarint64(&temp)) return false;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *value = static_cast<int64>(temp);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool WireFormatLite::ReadPrimitive<uint32, WireFormatLite::TYPE_UINT32>(
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::CodedInputStream* input,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32* value) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return input->ReadVarint32(value);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool WireFormatLite::ReadPrimitive<uint64, WireFormatLite::TYPE_UINT64>(
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::CodedInputStream* input,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint64* value) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return input->ReadVarint64(value);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool WireFormatLite::ReadPrimitive<int32, WireFormatLite::TYPE_SINT32>(
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::CodedInputStream* input,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32* value) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 temp;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->ReadVarint32(&temp)) return false;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *value = ZigZagDecode32(temp);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool WireFormatLite::ReadPrimitive<int64, WireFormatLite::TYPE_SINT64>(
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::CodedInputStream* input,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64* value) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint64 temp;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->ReadVarint64(&temp)) return false;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *value = ZigZagDecode64(temp);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool WireFormatLite::ReadPrimitive<uint32, WireFormatLite::TYPE_FIXED32>(
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::CodedInputStream* input,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32* value) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return input->ReadLittleEndian32(value);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool WireFormatLite::ReadPrimitive<uint64, WireFormatLite::TYPE_FIXED64>(
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::CodedInputStream* input,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint64* value) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return input->ReadLittleEndian64(value);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool WireFormatLite::ReadPrimitive<int32, WireFormatLite::TYPE_SFIXED32>(
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::CodedInputStream* input,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32* value) {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 temp;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->ReadLittleEndian32(&temp)) return false;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *value = static_cast<int32>(temp);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool WireFormatLite::ReadPrimitive<int64, WireFormatLite::TYPE_SFIXED64>(
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::CodedInputStream* input,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64* value) {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint64 temp;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->ReadLittleEndian64(&temp)) return false;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *value = static_cast<int64>(temp);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool WireFormatLite::ReadPrimitive<float, WireFormatLite::TYPE_FLOAT>(
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::CodedInputStream* input,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    float* value) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 temp;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->ReadLittleEndian32(&temp)) return false;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *value = DecodeFloat(temp);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool WireFormatLite::ReadPrimitive<double, WireFormatLite::TYPE_DOUBLE>(
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::CodedInputStream* input,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double* value) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint64 temp;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->ReadLittleEndian64(&temp)) return false;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *value = DecodeDouble(temp);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool WireFormatLite::ReadPrimitive<bool, WireFormatLite::TYPE_BOOL>(
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::CodedInputStream* input,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool* value) {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 temp;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->ReadVarint32(&temp)) return false;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *value = temp != 0;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::CodedInputStream* input,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int* value) {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 temp;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->ReadVarint32(&temp)) return false;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *value = static_cast<int>(temp);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline const uint8* WireFormatLite::ReadPrimitiveFromArray<
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32, WireFormatLite::TYPE_FIXED32>(
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const uint8* buffer,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32* value) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedInputStream::ReadLittleEndian32FromArray(buffer, value);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline const uint8* WireFormatLite::ReadPrimitiveFromArray<
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint64, WireFormatLite::TYPE_FIXED64>(
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const uint8* buffer,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint64* value) {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedInputStream::ReadLittleEndian64FromArray(buffer, value);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline const uint8* WireFormatLite::ReadPrimitiveFromArray<
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32, WireFormatLite::TYPE_SFIXED32>(
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const uint8* buffer,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32* value) {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 temp;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer = io::CodedInputStream::ReadLittleEndian32FromArray(buffer, &temp);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *value = static_cast<int32>(temp);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return buffer;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline const uint8* WireFormatLite::ReadPrimitiveFromArray<
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64, WireFormatLite::TYPE_SFIXED64>(
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const uint8* buffer,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64* value) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint64 temp;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer = io::CodedInputStream::ReadLittleEndian64FromArray(buffer, &temp);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *value = static_cast<int64>(temp);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return buffer;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline const uint8* WireFormatLite::ReadPrimitiveFromArray<
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float, WireFormatLite::TYPE_FLOAT>(
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const uint8* buffer,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    float* value) {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 temp;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer = io::CodedInputStream::ReadLittleEndian32FromArray(buffer, &temp);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *value = DecodeFloat(temp);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return buffer;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline const uint8* WireFormatLite::ReadPrimitiveFromArray<
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double, WireFormatLite::TYPE_DOUBLE>(
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const uint8* buffer,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double* value) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint64 temp;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer = io::CodedInputStream::ReadLittleEndian64FromArray(buffer, &temp);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *value = DecodeDouble(temp);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return buffer;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename CType, enum WireFormatLite::FieldType DeclaredType>
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool WireFormatLite::ReadRepeatedPrimitive(int, // tag_size, unused.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               uint32 tag,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               io::CodedInputStream* input,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               RepeatedField<CType>* values) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CType value;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ReadPrimitive<CType, DeclaredType>(input, &value)) return false;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  values->Add(value);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int elements_already_reserved = values->Capacity() - values->size();
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (elements_already_reserved > 0 && input->ExpectTag(tag)) {
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ReadPrimitive<CType, DeclaredType>(input, &value)) return false;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    values->AddAlreadyReserved(value);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elements_already_reserved--;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename CType, enum WireFormatLite::FieldType DeclaredType>
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool WireFormatLite::ReadRepeatedFixedSizePrimitive(
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int tag_size,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 tag,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::CodedInputStream* input,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RepeatedField<CType>* values) {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GOOGLE_DCHECK_EQ(UInt32Size(tag), tag_size);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CType value;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ReadPrimitive<CType, DeclaredType>(input, &value))
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  values->Add(value);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For fixed size values, repeated values can be read more quickly by
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reading directly from a raw array.
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We can get a tight loop by only reading as many elements as can be
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // added to the RepeatedField without having to do any resizing. Additionally,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we only try to read as many elements as are available from the current
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // buffer space. Doing so avoids having to perform boundary checks when
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reading the value: the maximum number of elements that can be read is
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // known outside of the loop.
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const void* void_pointer;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int size;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input->GetDirectBufferPointerInline(&void_pointer, &size);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (size > 0) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const uint8* buffer = reinterpret_cast<const uint8*>(void_pointer);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The number of bytes each type occupies on the wire.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int per_value_size = tag_size + sizeof(value);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int elements_available = min(values->Capacity() - values->size(),
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 size / per_value_size);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int num_read = 0;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (num_read < elements_available &&
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           (buffer = io::CodedInputStream::ExpectTagFromArray(
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               buffer, tag)) != NULL) {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      buffer = ReadPrimitiveFromArray<CType, DeclaredType>(buffer, &value);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      values->AddAlreadyReserved(value);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++num_read;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int read_bytes = num_read * per_value_size;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (read_bytes > 0) {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      input->Skip(read_bytes);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Specializations of ReadRepeatedPrimitive for the fixed size types, which use
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the optimized code path.
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define READ_REPEATED_FIXED_SIZE_PRIMITIVE(CPPTYPE, DECLARED_TYPE)             \
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <>                                                                    \
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool WireFormatLite::ReadRepeatedPrimitive<                             \
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CPPTYPE, WireFormatLite::DECLARED_TYPE>(                                     \
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int tag_size,                                                              \
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 tag,                                                                \
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::CodedInputStream* input,                                               \
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RepeatedField<CPPTYPE>* values) {                                          \
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ReadRepeatedFixedSizePrimitive<                                       \
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CPPTYPE, WireFormatLite::DECLARED_TYPE>(                                   \
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tag_size, tag, input, values);                                           \
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)READ_REPEATED_FIXED_SIZE_PRIMITIVE(uint32, TYPE_FIXED32);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)READ_REPEATED_FIXED_SIZE_PRIMITIVE(uint64, TYPE_FIXED64);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)READ_REPEATED_FIXED_SIZE_PRIMITIVE(int32, TYPE_SFIXED32);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)READ_REPEATED_FIXED_SIZE_PRIMITIVE(int64, TYPE_SFIXED64);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)READ_REPEATED_FIXED_SIZE_PRIMITIVE(float, TYPE_FLOAT);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)READ_REPEATED_FIXED_SIZE_PRIMITIVE(double, TYPE_DOUBLE);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef READ_REPEATED_FIXED_SIZE_PRIMITIVE
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename CType, enum WireFormatLite::FieldType DeclaredType>
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WireFormatLite::ReadRepeatedPrimitiveNoInline(
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int tag_size,
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 tag,
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::CodedInputStream* input,
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RepeatedField<CType>* value) {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ReadRepeatedPrimitive<CType, DeclaredType>(
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tag_size, tag, input, value);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename CType, enum WireFormatLite::FieldType DeclaredType>
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool WireFormatLite::ReadPackedPrimitive(io::CodedInputStream* input,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                RepeatedField<CType>* values) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 length;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->ReadVarint32(&length)) return false;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io::CodedInputStream::Limit limit = input->PushLimit(length);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (input->BytesUntilLimit() > 0) {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CType value;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ReadPrimitive<CType, DeclaredType>(input, &value)) return false;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    values->Add(value);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input->PopLimit(limit);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename CType, enum WireFormatLite::FieldType DeclaredType>
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WireFormatLite::ReadPackedPrimitiveNoInline(io::CodedInputStream* input,
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 RepeatedField<CType>* values) {
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ReadPackedPrimitive<CType, DeclaredType>(input, values);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool WireFormatLite::ReadGroup(int field_number,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      io::CodedInputStream* input,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      MessageLite* value) {
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->IncrementRecursionDepth()) return false;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!value->MergePartialFromCodedStream(input)) return false;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input->DecrementRecursionDepth();
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the last thing read was an end tag for this group.
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->LastTagWas(MakeTag(field_number, WIRETYPE_END_GROUP))) {
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool WireFormatLite::ReadMessage(io::CodedInputStream* input,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        MessageLite* value) {
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 length;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->ReadVarint32(&length)) return false;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->IncrementRecursionDepth()) return false;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io::CodedInputStream::Limit limit = input->PushLimit(length);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!value->MergePartialFromCodedStream(input)) return false;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure that parsing stopped when the limit was hit, not at an endgroup
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // tag.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->ConsumedEntireMessage()) return false;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input->PopLimit(limit);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input->DecrementRecursionDepth();
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We name the template parameter something long and extremely unlikely to occur
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// elsewhere because a *qualified* member access expression designed to avoid
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// virtual dispatch, C++03 [basic.lookup.classref] 3.4.5/4 requires that the
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// name of the qualifying class to be looked up both in the context of the full
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expression (finding the template parameter) and in the context of the object
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// whose member we are accessing. This could potentially find a nested type
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// within that object. The standard goes on to require these names to refer to
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the same entity, which this collision would violate. The lack of a safe way
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to avoid this collision appears to be a defect in the standard, but until it
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is corrected, we choose the name to avoid accidental collisions.
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename MessageType_WorkAroundCppLookupDefect>
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool WireFormatLite::ReadGroupNoVirtual(
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int field_number, io::CodedInputStream* input,
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MessageType_WorkAroundCppLookupDefect* value) {
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->IncrementRecursionDepth()) return false;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!value->
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MessageType_WorkAroundCppLookupDefect::MergePartialFromCodedStream(input))
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input->DecrementRecursionDepth();
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the last thing read was an end tag for this group.
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->LastTagWas(MakeTag(field_number, WIRETYPE_END_GROUP))) {
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename MessageType_WorkAroundCppLookupDefect>
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool WireFormatLite::ReadMessageNoVirtual(
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::CodedInputStream* input, MessageType_WorkAroundCppLookupDefect* value) {
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 length;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->ReadVarint32(&length)) return false;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->IncrementRecursionDepth()) return false;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  io::CodedInputStream::Limit limit = input->PushLimit(length);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!value->
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MessageType_WorkAroundCppLookupDefect::MergePartialFromCodedStream(input))
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure that parsing stopped when the limit was hit, not at an endgroup
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // tag.
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input->ConsumedEntireMessage()) return false;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input->PopLimit(limit);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input->DecrementRecursionDepth();
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ===================================================================
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void WireFormatLite::WriteTag(int field_number, WireType type,
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     io::CodedOutputStream* output) {
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output->WriteTag(MakeTag(field_number, type));
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void WireFormatLite::WriteInt32NoTag(int32 value,
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            io::CodedOutputStream* output) {
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output->WriteVarint32SignExtended(value);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void WireFormatLite::WriteInt64NoTag(int64 value,
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            io::CodedOutputStream* output) {
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output->WriteVarint64(static_cast<uint64>(value));
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void WireFormatLite::WriteUInt32NoTag(uint32 value,
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             io::CodedOutputStream* output) {
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output->WriteVarint32(value);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void WireFormatLite::WriteUInt64NoTag(uint64 value,
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             io::CodedOutputStream* output) {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output->WriteVarint64(value);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void WireFormatLite::WriteSInt32NoTag(int32 value,
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             io::CodedOutputStream* output) {
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output->WriteVarint32(ZigZagEncode32(value));
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void WireFormatLite::WriteSInt64NoTag(int64 value,
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             io::CodedOutputStream* output) {
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output->WriteVarint64(ZigZagEncode64(value));
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void WireFormatLite::WriteFixed32NoTag(uint32 value,
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              io::CodedOutputStream* output) {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output->WriteLittleEndian32(value);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void WireFormatLite::WriteFixed64NoTag(uint64 value,
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              io::CodedOutputStream* output) {
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output->WriteLittleEndian64(value);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void WireFormatLite::WriteSFixed32NoTag(int32 value,
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               io::CodedOutputStream* output) {
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output->WriteLittleEndian32(static_cast<uint32>(value));
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void WireFormatLite::WriteSFixed64NoTag(int64 value,
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               io::CodedOutputStream* output) {
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output->WriteLittleEndian64(static_cast<uint64>(value));
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void WireFormatLite::WriteFloatNoTag(float value,
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            io::CodedOutputStream* output) {
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output->WriteLittleEndian32(EncodeFloat(value));
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void WireFormatLite::WriteDoubleNoTag(double value,
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             io::CodedOutputStream* output) {
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output->WriteLittleEndian64(EncodeDouble(value));
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void WireFormatLite::WriteBoolNoTag(bool value,
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           io::CodedOutputStream* output) {
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output->WriteVarint32(value ? 1 : 0);
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void WireFormatLite::WriteEnumNoTag(int value,
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           io::CodedOutputStream* output) {
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output->WriteVarint32SignExtended(value);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See comment on ReadGroupNoVirtual to understand the need for this template
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// parameter name.
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename MessageType_WorkAroundCppLookupDefect>
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void WireFormatLite::WriteGroupNoVirtual(
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int field_number, const MessageType_WorkAroundCppLookupDefect& value,
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::CodedOutputStream* output) {
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_START_GROUP, output);
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  value.MessageType_WorkAroundCppLookupDefect::SerializeWithCachedSizes(output);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_END_GROUP, output);
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename MessageType_WorkAroundCppLookupDefect>
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void WireFormatLite::WriteMessageNoVirtual(
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int field_number, const MessageType_WorkAroundCppLookupDefect& value,
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::CodedOutputStream* output) {
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTag(field_number, WIRETYPE_LENGTH_DELIMITED, output);
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  output->WriteVarint32(
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      value.MessageType_WorkAroundCppLookupDefect::GetCachedSize());
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  value.MessageType_WorkAroundCppLookupDefect::SerializeWithCachedSizes(output);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ===================================================================
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteTagToArray(int field_number,
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              WireType type,
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              uint8* target) {
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::WriteTagToArray(MakeTag(field_number, type),
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                target);
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteInt32NoTagToArray(int32 value,
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     uint8* target) {
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::WriteVarint32SignExtendedToArray(value, target);
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteInt64NoTagToArray(int64 value,
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     uint8* target) {
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::WriteVarint64ToArray(
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<uint64>(value), target);
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteUInt32NoTagToArray(uint32 value,
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      uint8* target) {
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::WriteVarint32ToArray(value, target);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteUInt64NoTagToArray(uint64 value,
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      uint8* target) {
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::WriteVarint64ToArray(value, target);
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteSInt32NoTagToArray(int32 value,
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      uint8* target) {
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::WriteVarint32ToArray(ZigZagEncode32(value),
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     target);
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteSInt64NoTagToArray(int64 value,
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      uint8* target) {
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::WriteVarint64ToArray(ZigZagEncode64(value),
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     target);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteFixed32NoTagToArray(uint32 value,
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       uint8* target) {
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::WriteLittleEndian32ToArray(value, target);
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteFixed64NoTagToArray(uint64 value,
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       uint8* target) {
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::WriteLittleEndian64ToArray(value, target);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteSFixed32NoTagToArray(int32 value,
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                        uint8* target) {
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::WriteLittleEndian32ToArray(
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<uint32>(value), target);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteSFixed64NoTagToArray(int64 value,
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                        uint8* target) {
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::WriteLittleEndian64ToArray(
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<uint64>(value), target);
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteFloatNoTagToArray(float value,
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     uint8* target) {
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::WriteLittleEndian32ToArray(EncodeFloat(value),
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                           target);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteDoubleNoTagToArray(double value,
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      uint8* target) {
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::WriteLittleEndian64ToArray(EncodeDouble(value),
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                           target);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteBoolNoTagToArray(bool value,
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    uint8* target) {
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::WriteVarint32ToArray(value ? 1 : 0, target);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteEnumNoTagToArray(int value,
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    uint8* target) {
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::WriteVarint32SignExtendedToArray(value, target);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteInt32ToArray(int field_number,
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                int32 value,
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                uint8* target) {
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WriteInt32NoTagToArray(value, target);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteInt64ToArray(int field_number,
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                int64 value,
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                uint8* target) {
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WriteInt64NoTagToArray(value, target);
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteUInt32ToArray(int field_number,
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 uint32 value,
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 uint8* target) {
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WriteUInt32NoTagToArray(value, target);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteUInt64ToArray(int field_number,
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 uint64 value,
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 uint8* target) {
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WriteUInt64NoTagToArray(value, target);
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteSInt32ToArray(int field_number,
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 int32 value,
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 uint8* target) {
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WriteSInt32NoTagToArray(value, target);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteSInt64ToArray(int field_number,
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 int64 value,
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 uint8* target) {
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WriteSInt64NoTagToArray(value, target);
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteFixed32ToArray(int field_number,
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  uint32 value,
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  uint8* target) {
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = WriteTagToArray(field_number, WIRETYPE_FIXED32, target);
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WriteFixed32NoTagToArray(value, target);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteFixed64ToArray(int field_number,
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  uint64 value,
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  uint8* target) {
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = WriteTagToArray(field_number, WIRETYPE_FIXED64, target);
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WriteFixed64NoTagToArray(value, target);
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteSFixed32ToArray(int field_number,
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   int32 value,
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   uint8* target) {
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = WriteTagToArray(field_number, WIRETYPE_FIXED32, target);
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WriteSFixed32NoTagToArray(value, target);
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteSFixed64ToArray(int field_number,
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   int64 value,
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   uint8* target) {
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = WriteTagToArray(field_number, WIRETYPE_FIXED64, target);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WriteSFixed64NoTagToArray(value, target);
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteFloatToArray(int field_number,
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                float value,
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                uint8* target) {
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = WriteTagToArray(field_number, WIRETYPE_FIXED32, target);
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WriteFloatNoTagToArray(value, target);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteDoubleToArray(int field_number,
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 double value,
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 uint8* target) {
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = WriteTagToArray(field_number, WIRETYPE_FIXED64, target);
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WriteDoubleNoTagToArray(value, target);
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteBoolToArray(int field_number,
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               bool value,
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               uint8* target) {
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WriteBoolNoTagToArray(value, target);
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteEnumToArray(int field_number,
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               int value,
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               uint8* target) {
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WriteEnumNoTagToArray(value, target);
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteStringToArray(int field_number,
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 const string& value,
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 uint8* target) {
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // String is for UTF-8 text only
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WARNING:  In wire_format.cc, both strings and bytes are handled by
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   WriteString() to avoid code duplication.  If the implementations become
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   different, you will need to update that usage.
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target);
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = io::CodedOutputStream::WriteVarint32ToArray(value.size(), target);
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::WriteStringToArray(value, target);
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteBytesToArray(int field_number,
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                const string& value,
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                uint8* target) {
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target);
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = io::CodedOutputStream::WriteVarint32ToArray(value.size(), target);
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::WriteStringToArray(value, target);
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteGroupToArray(int field_number,
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                const MessageLite& value,
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                uint8* target) {
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = WriteTagToArray(field_number, WIRETYPE_START_GROUP, target);
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = value.SerializeWithCachedSizesToArray(target);
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WriteTagToArray(field_number, WIRETYPE_END_GROUP, target);
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteMessageToArray(int field_number,
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  const MessageLite& value,
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  uint8* target) {
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target);
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = io::CodedOutputStream::WriteVarint32ToArray(
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    value.GetCachedSize(), target);
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return value.SerializeWithCachedSizesToArray(target);
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See comment on ReadGroupNoVirtual to understand the need for this template
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// parameter name.
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename MessageType_WorkAroundCppLookupDefect>
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteGroupNoVirtualToArray(
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int field_number, const MessageType_WorkAroundCppLookupDefect& value,
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint8* target) {
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = WriteTagToArray(field_number, WIRETYPE_START_GROUP, target);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = value.MessageType_WorkAroundCppLookupDefect
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ::SerializeWithCachedSizesToArray(target);
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WriteTagToArray(field_number, WIRETYPE_END_GROUP, target);
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename MessageType_WorkAroundCppLookupDefect>
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint8* WireFormatLite::WriteMessageNoVirtualToArray(
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int field_number, const MessageType_WorkAroundCppLookupDefect& value,
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint8* target) {
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target);
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target = io::CodedOutputStream::WriteVarint32ToArray(
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    value.MessageType_WorkAroundCppLookupDefect::GetCachedSize(), target);
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return value.MessageType_WorkAroundCppLookupDefect
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ::SerializeWithCachedSizesToArray(target);
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ===================================================================
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int WireFormatLite::Int32Size(int32 value) {
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::VarintSize32SignExtended(value);
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int WireFormatLite::Int64Size(int64 value) {
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::VarintSize64(static_cast<uint64>(value));
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int WireFormatLite::UInt32Size(uint32 value) {
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::VarintSize32(value);
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int WireFormatLite::UInt64Size(uint64 value) {
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::VarintSize64(value);
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int WireFormatLite::SInt32Size(int32 value) {
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::VarintSize32(ZigZagEncode32(value));
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int WireFormatLite::SInt64Size(int64 value) {
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::VarintSize64(ZigZagEncode64(value));
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int WireFormatLite::EnumSize(int value) {
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::VarintSize32SignExtended(value);
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int WireFormatLite::StringSize(const string& value) {
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::VarintSize32(value.size()) +
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         value.size();
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int WireFormatLite::BytesSize(const string& value) {
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return io::CodedOutputStream::VarintSize32(value.size()) +
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         value.size();
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int WireFormatLite::GroupSize(const MessageLite& value) {
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return value.ByteSize();
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int WireFormatLite::MessageSize(const MessageLite& value) {
7513d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  return LengthDelimitedSize(value.ByteSize());
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See comment on ReadGroupNoVirtual to understand the need for this template
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// parameter name.
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename MessageType_WorkAroundCppLookupDefect>
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int WireFormatLite::GroupSizeNoVirtual(
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MessageType_WorkAroundCppLookupDefect& value) {
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return value.MessageType_WorkAroundCppLookupDefect::ByteSize();
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename MessageType_WorkAroundCppLookupDefect>
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int WireFormatLite::MessageSizeNoVirtual(
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MessageType_WorkAroundCppLookupDefect& value) {
7643d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  return LengthDelimitedSize(
7653d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch      value.MessageType_WorkAroundCppLookupDefect::ByteSize());
7663d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch}
7673d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch
7683d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdochinline int WireFormatLite::LengthDelimitedSize(int length) {
7693d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  return io::CodedOutputStream::VarintSize32(length) + length;
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace protobuf
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace google
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_INL_H__
777