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