1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc. All rights reserved. 3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/ 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met: 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions of source code must retain the above copyright 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer. 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions in binary form must reproduce the above 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution. 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Neither the name of Google Inc. nor the names of its 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission. 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda) 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// atenasio@google.com (Chris Atenasio) (ZigZag transform) 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// wink@google.com (Wink Saville) (refactored from wire_format.h) 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Based on original Protocol Buffers design by 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Sanjay Ghemawat, Jeff Dean, and others. 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This header is logically internal, but is made public because it is used 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// from protocol-compiler-generated code, which may reside in other components. 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifndef GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_H__ 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_H__ 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <string> 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/message_lite.h> 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google { 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 49d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville template <typename T> class RepeatedField; // repeated_field.h 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville namespace io { 51d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville class CodedInputStream; // coded_stream.h 52d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville class CodedOutputStream; // coded_stream.h 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace internal { 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 59d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass StringPieceField; 60d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This class is for internal use by the protocol buffer library and by 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// protocol-complier-generated message classes. It must not be called 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// directly by clients. 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This class contains helpers for implementing the binary protocol buffer 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// wire format without the need for reflection. Use WireFormat when using 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// reflection. 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This class is really a namespace that contains only static methods. 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT WireFormatLite { 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // ----------------------------------------------------------------- 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Helper constants and functions related to the format. These are 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // mostly meant for internal and generated code to use. 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The wire format is composed of a sequence of tag/value pairs, each 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // of which contains the value of one field (or one element of a repeated 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // field). Each tag is encoded as a varint. The lower bits of the tag 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // identify its wire type, which specifies the format of the data to follow. 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The rest of the bits contain the field number. Each type of field (as 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // declared by FieldDescriptor::Type, in descriptor.h) maps to one of 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // these wire types. Immediately following each tag is the field's value, 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // encoded in the format specified by the wire type. Because the tag 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // identifies the encoding of this data, it is possible to skip 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // unrecognized fields for forwards compatibility. 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum WireType { 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville WIRETYPE_VARINT = 0, 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville WIRETYPE_FIXED64 = 1, 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville WIRETYPE_LENGTH_DELIMITED = 2, 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville WIRETYPE_START_GROUP = 3, 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville WIRETYPE_END_GROUP = 4, 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville WIRETYPE_FIXED32 = 5, 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Lite alternative to FieldDescriptor::Type. Must be kept in sync. 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum FieldType { 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_DOUBLE = 1, 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_FLOAT = 2, 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_INT64 = 3, 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_UINT64 = 4, 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_INT32 = 5, 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_FIXED64 = 6, 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_FIXED32 = 7, 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_BOOL = 8, 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_STRING = 9, 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_GROUP = 10, 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_MESSAGE = 11, 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_BYTES = 12, 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_UINT32 = 13, 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_ENUM = 14, 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_SFIXED32 = 15, 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_SFIXED64 = 16, 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_SINT32 = 17, 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_SINT64 = 18, 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MAX_FIELD_TYPE = 18, 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Lite alternative to FieldDescriptor::CppType. Must be kept in sync. 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum CppType { 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_INT32 = 1, 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_INT64 = 2, 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_UINT32 = 3, 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_UINT64 = 4, 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_DOUBLE = 5, 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_FLOAT = 6, 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_BOOL = 7, 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_ENUM = 8, 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_STRING = 9, 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_MESSAGE = 10, 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MAX_CPPTYPE = 10, 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Helper method to get the CppType for a particular Type. 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static CppType FieldTypeToCppType(FieldType type); 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Given a FieldSescriptor::Type return its WireType 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline WireFormatLite::WireType WireTypeForFieldType( 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville WireFormatLite::FieldType type) { 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return kWireTypeForFieldType[type]; 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Number of bits in a tag which identify the wire type. 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kTagTypeBits = 3; 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Mask for those bits. 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const uint32 kTagTypeMask = (1 << kTagTypeBits) - 1; 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Helper functions for encoding and decoding tags. (Inlined below and in 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // _inl.h) 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This is different from MakeTag(field->number(), field->type()) in the case 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // of packed repeated fields. 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static uint32 MakeTag(int field_number, WireType type); 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static WireType GetTagWireType(uint32 tag); 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static int GetTagFieldNumber(uint32 tag); 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Compute the byte size of a tag. For groups, this includes both the start 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // and end tags. 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int TagSize(int field_number, WireFormatLite::FieldType type); 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Skips a field value with the given tag. The input should start 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // positioned immediately after the tag. Skipped values are simply discarded, 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // not recorded anywhere. See WireFormat::SkipField() for a version that 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // records to an UnknownFieldSet. 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static bool SkipField(io::CodedInputStream* input, uint32 tag); 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Reads and ignores a message from the input. Skipped values are simply 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // discarded, not recorded anywhere. See WireFormat::SkipMessage() for a 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // version that records to an UnknownFieldSet. 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static bool SkipMessage(io::CodedInputStream* input); 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This macro does the same thing as WireFormatLite::MakeTag(), but the 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// result is usable as a compile-time constant, which makes it usable 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// as a switch case or a template input. WireFormatLite::MakeTag() is more 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// type-safe, though, so prefer it if possible. 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(FIELD_NUMBER, TYPE) \ 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static_cast<uint32>( \ 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ((FIELD_NUMBER) << ::google::protobuf::internal::WireFormatLite::kTagTypeBits) \ 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville | (TYPE)) 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These are the tags for the old MessageSet format, which was defined as: 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message MessageSet { 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // repeated group Item = 1 { 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // required int32 type_id = 2; 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // required string message = 3; 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 189d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static const int kMessageSetItemNumber = 1; 190d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static const int kMessageSetTypeIdNumber = 2; 191d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static const int kMessageSetMessageNumber = 3; 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kMessageSetItemStartTag = 193d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(kMessageSetItemNumber, 194d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville WireFormatLite::WIRETYPE_START_GROUP); 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kMessageSetItemEndTag = 196d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(kMessageSetItemNumber, 197d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville WireFormatLite::WIRETYPE_END_GROUP); 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kMessageSetTypeIdTag = 199d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(kMessageSetTypeIdNumber, 200d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville WireFormatLite::WIRETYPE_VARINT); 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kMessageSetMessageTag = 202d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(kMessageSetMessageNumber, 203d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville WireFormatLite::WIRETYPE_LENGTH_DELIMITED); 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Byte size of all tags of a MessageSet::Item combined. 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kMessageSetItemTagsSize; 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Helper functions for converting between floats/doubles and IEEE-754 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // uint32s/uint64s so that they can be written. (Assumes your platform 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // uses IEEE-754 floats.) 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static uint32 EncodeFloat(float value); 212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static float DecodeFloat(uint32 value); 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static uint64 EncodeDouble(double value); 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static double DecodeDouble(uint64 value); 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Helper functions for mapping signed integers to unsigned integers in 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // such a way that numbers with small magnitudes will encode to smaller 218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // varints. If you simply static_cast a negative number to an unsigned 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // number and varint-encode it, it will always take 10 bytes, defeating 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the purpose of varint. So, for the "sint32" and "sint64" field types, 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // we ZigZag-encode the values. 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static uint32 ZigZagEncode32(int32 n); 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static int32 ZigZagDecode32(uint32 n); 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static uint64 ZigZagEncode64(int64 n); 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static int64 ZigZagDecode64(uint64 n); 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // ================================================================= 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Methods for reading/writing individual field. The implementations 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // of these methods are defined in wire_format_lite_inl.h; you must #include 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // that file to use these. 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Avoid ugly line wrapping 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define input io::CodedInputStream* input 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define output io::CodedOutputStream* output 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define field_number int field_number 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define INL GOOGLE_ATTRIBUTE_ALWAYS_INLINE 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Read fields, not including tags. The assumption is that you already 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // read the tag to determine what field to read. 240d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 241d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // For primitive fields, we just use a templatized routine parameterized by 242d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // the represented type and the FieldType. These are specialized with the 243d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // appropriate definition for each declared type. 244d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville template <typename CType, enum FieldType DeclaredType> 245d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static inline bool ReadPrimitive(input, CType* value) INL; 246d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 247d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Reads repeated primitive values, with optimizations for repeats. 248d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // tag_size and tag should both be compile-time constants provided by the 249d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // protocol compiler. 250d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville template <typename CType, enum FieldType DeclaredType> 251d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static inline bool ReadRepeatedPrimitive(int tag_size, 252d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville uint32 tag, 253d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville input, 254d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville RepeatedField<CType>* value) INL; 255d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 256d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Identical to ReadRepeatedPrimitive, except will not inline the 257d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // implementation. 258d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville template <typename CType, enum FieldType DeclaredType> 259d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static bool ReadRepeatedPrimitiveNoInline(int tag_size, 260d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville uint32 tag, 261d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville input, 262d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville RepeatedField<CType>* value); 263d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 264d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Reads a primitive value directly from the provided buffer. It returns a 265d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // pointer past the segment of data that was read. 266d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // 267d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // This is only implemented for the types with fixed wire size, e.g. 268d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // float, double, and the (s)fixed* types. 269d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville template <typename CType, enum FieldType DeclaredType> 270d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static inline const uint8* ReadPrimitiveFromArray(const uint8* buffer, 271d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville CType* value) INL; 272d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 273d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Reads a primitive packed field. 274d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // 275d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // This is only implemented for packable types. 276d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville template <typename CType, enum FieldType DeclaredType> 277d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static inline bool ReadPackedPrimitive(input, 278d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville RepeatedField<CType>* value) INL; 279d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 280d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Identical to ReadPackedPrimitive, except will not inline the 281d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // implementation. 282d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville template <typename CType, enum FieldType DeclaredType> 283d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static bool ReadPackedPrimitiveNoInline(input, RepeatedField<CType>* value); 284d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 285d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Read a packed enum field. Values for which is_valid() returns false are 286d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // dropped. 287d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static bool ReadPackedEnumNoInline(input, 288d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville bool (*is_valid)(int), 289d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville RepeatedField<int>* value); 290d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 291d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static bool ReadString(input, string* value); 292d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static bool ReadBytes (input, string* value); 293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadGroup (field_number, input, MessageLite* value); 295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadMessage(input, MessageLite* value); 296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like above, but de-virtualize the call to MergePartialFromCodedStream(). 298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The pointer must point at an instance of MessageType, *not* a subclass (or 299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the subclass must not override MergePartialFromCodedStream()). 300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template<typename MessageType> 301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadGroupNoVirtual(field_number, input, 302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MessageType* value); 303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template<typename MessageType> 304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadMessageNoVirtual(input, MessageType* value); 305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Write a tag. The Write*() functions typically include the tag, so 307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // normally there's no need to call this unless using the Write*NoTag() 308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // variants. 309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteTag(field_number, WireType type, output) INL; 310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Write fields, without tags. 312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteInt32NoTag (int32 value, output) INL; 313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteInt64NoTag (int64 value, output) INL; 314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteUInt32NoTag (uint32 value, output) INL; 315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteUInt64NoTag (uint64 value, output) INL; 316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteSInt32NoTag (int32 value, output) INL; 317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteSInt64NoTag (int64 value, output) INL; 318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteFixed32NoTag (uint32 value, output) INL; 319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteFixed64NoTag (uint64 value, output) INL; 320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteSFixed32NoTag(int32 value, output) INL; 321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteSFixed64NoTag(int64 value, output) INL; 322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteFloatNoTag (float value, output) INL; 323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteDoubleNoTag (double value, output) INL; 324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteBoolNoTag (bool value, output) INL; 325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteEnumNoTag (int value, output) INL; 326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Write fields, including tags. 328d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static void WriteInt32 (field_number, int32 value, output); 329d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static void WriteInt64 (field_number, int64 value, output); 330d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static void WriteUInt32 (field_number, uint32 value, output); 331d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static void WriteUInt64 (field_number, uint64 value, output); 332d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static void WriteSInt32 (field_number, int32 value, output); 333d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static void WriteSInt64 (field_number, int64 value, output); 334d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static void WriteFixed32 (field_number, uint32 value, output); 335d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static void WriteFixed64 (field_number, uint64 value, output); 336d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static void WriteSFixed32(field_number, int32 value, output); 337d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static void WriteSFixed64(field_number, int64 value, output); 338d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static void WriteFloat (field_number, float value, output); 339d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static void WriteDouble (field_number, double value, output); 340d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static void WriteBool (field_number, bool value, output); 341d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static void WriteEnum (field_number, int value, output); 342d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 343d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static void WriteString(field_number, const string& value, output); 344d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static void WriteBytes (field_number, const string& value, output); 345d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 346d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static void WriteGroup( 347d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field_number, const MessageLite& value, output); 348d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static void WriteMessage( 349d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field_number, const MessageLite& value, output); 350d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Like above, but these will check if the output stream has enough 351d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // space to write directly to a flat array. 352d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static void WriteGroupMaybeToArray( 353d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field_number, const MessageLite& value, output); 354d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static void WriteMessageMaybeToArray( 355d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field_number, const MessageLite& value, output); 356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like above, but de-virtualize the call to SerializeWithCachedSizes(). The 358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // pointer must point at an instance of MessageType, *not* a subclass (or 359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the subclass must not override SerializeWithCachedSizes()). 360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template<typename MessageType> 361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteGroupNoVirtual( 362d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field_number, const MessageType& value, output); 363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template<typename MessageType> 364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteMessageNoVirtual( 365d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville field_number, const MessageType& value, output); 366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef output 368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define output uint8* target 369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like above, but use only *ToArray methods of CodedOutputStream. 371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteTagToArray(field_number, WireType type, output) INL; 372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Write fields, without tags. 374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteInt32NoTagToArray (int32 value, output) INL; 375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteInt64NoTagToArray (int64 value, output) INL; 376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteUInt32NoTagToArray (uint32 value, output) INL; 377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteUInt64NoTagToArray (uint64 value, output) INL; 378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteSInt32NoTagToArray (int32 value, output) INL; 379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteSInt64NoTagToArray (int64 value, output) INL; 380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteFixed32NoTagToArray (uint32 value, output) INL; 381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteFixed64NoTagToArray (uint64 value, output) INL; 382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteSFixed32NoTagToArray(int32 value, output) INL; 383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteSFixed64NoTagToArray(int64 value, output) INL; 384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteFloatNoTagToArray (float value, output) INL; 385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteDoubleNoTagToArray (double value, output) INL; 386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteBoolNoTagToArray (bool value, output) INL; 387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteEnumNoTagToArray (int value, output) INL; 388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Write fields, including tags. 390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteInt32ToArray( 391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, int32 value, output) INL; 392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteInt64ToArray( 393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, int64 value, output) INL; 394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteUInt32ToArray( 395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, uint32 value, output) INL; 396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteUInt64ToArray( 397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, uint64 value, output) INL; 398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteSInt32ToArray( 399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, int32 value, output) INL; 400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteSInt64ToArray( 401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, int64 value, output) INL; 402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteFixed32ToArray( 403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, uint32 value, output) INL; 404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteFixed64ToArray( 405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, uint64 value, output) INL; 406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteSFixed32ToArray( 407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, int32 value, output) INL; 408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteSFixed64ToArray( 409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, int64 value, output) INL; 410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteFloatToArray( 411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, float value, output) INL; 412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteDoubleToArray( 413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, double value, output) INL; 414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteBoolToArray( 415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, bool value, output) INL; 416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteEnumToArray( 417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, int value, output) INL; 418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteStringToArray( 420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, const string& value, output) INL; 421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteBytesToArray( 422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, const string& value, output) INL; 423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteGroupToArray( 425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, const MessageLite& value, output) INL; 426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteMessageToArray( 427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, const MessageLite& value, output) INL; 428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like above, but de-virtualize the call to SerializeWithCachedSizes(). The 430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // pointer must point at an instance of MessageType, *not* a subclass (or 431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the subclass must not override SerializeWithCachedSizes()). 432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template<typename MessageType> 433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteGroupNoVirtualToArray( 434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, const MessageType& value, output) INL; 435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template<typename MessageType> 436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteMessageNoVirtualToArray( 437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, const MessageType& value, output) INL; 438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef output 440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef input 441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef INL 442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef field_number 444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Compute the byte size of a field. The XxSize() functions do NOT include 446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the tag, so you must also call TagSize(). (This is because, for repeated 447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // fields, you should only call TagSize() once and multiply it by the element 448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // count, but you may have to call XxSize() for each individual element.) 449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int Int32Size ( int32 value); 450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int Int64Size ( int64 value); 451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int UInt32Size (uint32 value); 452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int UInt64Size (uint64 value); 453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int SInt32Size ( int32 value); 454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int SInt64Size ( int64 value); 455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int EnumSize ( int value); 456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These types always have the same size. 458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kFixed32Size = 4; 459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kFixed64Size = 8; 460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kSFixed32Size = 4; 461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kSFixed64Size = 8; 462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kFloatSize = 4; 463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kDoubleSize = 8; 464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kBoolSize = 1; 465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int StringSize(const string& value); 467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int BytesSize (const string& value); 468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int GroupSize (const MessageLite& value); 470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int MessageSize(const MessageLite& value); 471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like above, but de-virtualize the call to ByteSize(). The 473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // pointer must point at an instance of MessageType, *not* a subclass (or 474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the subclass must not override ByteSize()). 475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template<typename MessageType> 476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int GroupSizeNoVirtual (const MessageType& value); 477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template<typename MessageType> 478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int MessageSizeNoVirtual(const MessageType& value); 479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 481d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // A helper method for the repeated primitive reader. This method has 482d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // optimizations for primitive types that have fixed size on the wire, and 483d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // can be read using potentially faster paths. 484d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville template <typename CType, enum FieldType DeclaredType> 485d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville static inline bool ReadRepeatedFixedSizePrimitive( 486d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville int tag_size, 487d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville uint32 tag, 488d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville google::protobuf::io::CodedInputStream* input, 489d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville RepeatedField<CType>* value) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; 490d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const CppType kFieldTypeToCppTypeMap[]; 492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const WireFormatLite::WireType kWireTypeForFieldType[]; 493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(WireFormatLite); 495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A class which deals with unknown values. The default implementation just 498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// discards them. WireFormat defines a subclass which writes to an 499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// UnknownFieldSet. This class is used by ExtensionSet::ParseField(), since 500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ExtensionSet is part of the lite library but UnknownFieldSet is not. 501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT FieldSkipper { 502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldSkipper() {} 504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual ~FieldSkipper() {} 505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Skip a field whose tag has already been consumed. 507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual bool SkipField(io::CodedInputStream* input, uint32 tag); 508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Skip an entire message or group, up to an end-group tag (which is consumed) 510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // or end-of-stream. 511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual bool SkipMessage(io::CodedInputStream* input); 512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Deal with an already-parsed unrecognized enum value. The default 514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // implementation does nothing, but the UnknownFieldSet-based implementation 515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // saves it as an unknown varint. 516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SkipUnknownEnum(int field_number, int value); 517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// inline methods ==================================================== 520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline WireFormatLite::CppType 522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleWireFormatLite::FieldTypeToCppType(FieldType type) { 523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return kFieldTypeToCppTypeMap[type]; 524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint32 WireFormatLite::MakeTag(int field_number, WireType type) { 527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(field_number, type); 528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline WireFormatLite::WireType WireFormatLite::GetTagWireType(uint32 tag) { 531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return static_cast<WireType>(tag & kTagTypeMask); 532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int WireFormatLite::GetTagFieldNumber(uint32 tag) { 535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return static_cast<int>(tag >> kTagTypeBits); 536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int WireFormatLite::TagSize(int field_number, 539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville WireFormatLite::FieldType type) { 540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int result = io::CodedOutputStream::VarintSize32( 541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number << kTagTypeBits); 542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (type == TYPE_GROUP) { 543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Groups have both a start and an end tag. 544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result * 2; 545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint32 WireFormatLite::EncodeFloat(float value) { 551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville union {float f; uint32 i;}; 552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville f = value; 553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return i; 554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline float WireFormatLite::DecodeFloat(uint32 value) { 557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville union {float f; uint32 i;}; 558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville i = value; 559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return f; 560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint64 WireFormatLite::EncodeDouble(double value) { 563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville union {double f; uint64 i;}; 564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville f = value; 565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return i; 566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline double WireFormatLite::DecodeDouble(uint64 value) { 569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville union {double f; uint64 i;}; 570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville i = value; 571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return f; 572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ZigZag Transform: Encodes signed integers so that they can be 575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// effectively used with varint encoding. 576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// varint operates on unsigned integers, encoding smaller numbers into 578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// fewer bytes. If you try to use it on a signed integer, it will treat 579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this number as a very large unsigned integer, which means that even 580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// small signed numbers like -1 will take the maximum number of bytes 581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (10) to encode. ZigZagEncode() maps signed integers to unsigned 582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in such a way that those with a small absolute value will have smaller 583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// encoded values, making them appropriate for encoding using varint. 584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// int32 -> uint32 586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ------------------------- 587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 0 -> 0 588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// -1 -> 1 589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 1 -> 2 590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// -2 -> 3 591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ... -> ... 592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 2147483647 -> 4294967294 593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// -2147483648 -> 4294967295 594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// >> encode >> 596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// << decode << 597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint32 WireFormatLite::ZigZagEncode32(int32 n) { 599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Note: the right-shift must be arithmetic 600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return (n << 1) ^ (n >> 31); 601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int32 WireFormatLite::ZigZagDecode32(uint32 n) { 604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return (n >> 1) ^ -static_cast<int32>(n & 1); 605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint64 WireFormatLite::ZigZagEncode64(int64 n) { 608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Note: the right-shift must be arithmetic 609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return (n << 1) ^ (n >> 63); 610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int64 WireFormatLite::ZigZagDecode64(uint64 n) { 613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return (n >> 1) ^ -static_cast<int64>(n & 1); 614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace internal 617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace protobuf 618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace google 620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif // GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_H__ 621