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)// atenasio@google.com (Chris Atenasio) (ZigZag transform) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// wink@google.com (Wink Saville) (refactored from wire_format.h) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Based on original Protocol Buffers design by 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sanjay Ghemawat, Jeff Dean, and others. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This header is logically internal, but is made public because it is used 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from protocol-compiler-generated code, which may reside in other components. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_H__ 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_H__ 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <google/protobuf/stubs/common.h> 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/message_lite.h> 46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <google/protobuf/io/coded_stream.h> // for CodedOutputStream::Varint32Size 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace google { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protobuf { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename T> class RepeatedField; // repeated_field.h 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class UnknownFieldSet; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protobuf { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StringPieceField; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is for internal use by the protocol buffer library and by 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// protocol-complier-generated message classes. It must not be called 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// directly by clients. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class contains helpers for implementing the binary protocol buffer 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// wire format without the need for reflection. Use WireFormat when using 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reflection. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is really a namespace that contains only static methods. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LIBPROTOBUF_EXPORT WireFormatLite { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ----------------------------------------------------------------- 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper constants and functions related to the format. These are 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mostly meant for internal and generated code to use. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The wire format is composed of a sequence of tag/value pairs, each 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of which contains the value of one field (or one element of a repeated 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // field). Each tag is encoded as a varint. The lower bits of the tag 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // identify its wire type, which specifies the format of the data to follow. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The rest of the bits contain the field number. Each type of field (as 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // declared by FieldDescriptor::Type, in descriptor.h) maps to one of 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // these wire types. Immediately following each tag is the field's value, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // encoded in the format specified by the wire type. Because the tag 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // identifies the encoding of this data, it is possible to skip 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // unrecognized fields for forwards compatibility. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum WireType { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WIRETYPE_VARINT = 0, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WIRETYPE_FIXED64 = 1, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WIRETYPE_LENGTH_DELIMITED = 2, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WIRETYPE_START_GROUP = 3, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WIRETYPE_END_GROUP = 4, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WIRETYPE_FIXED32 = 5, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lite alternative to FieldDescriptor::Type. Must be kept in sync. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum FieldType { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_DOUBLE = 1, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_FLOAT = 2, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_INT64 = 3, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_UINT64 = 4, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_INT32 = 5, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_FIXED64 = 6, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_FIXED32 = 7, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_BOOL = 8, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_STRING = 9, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_GROUP = 10, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_MESSAGE = 11, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_BYTES = 12, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_UINT32 = 13, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_ENUM = 14, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_SFIXED32 = 15, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_SFIXED64 = 16, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_SINT32 = 17, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPE_SINT64 = 18, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MAX_FIELD_TYPE = 18, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lite alternative to FieldDescriptor::CppType. Must be kept in sync. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum CppType { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CPPTYPE_INT32 = 1, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CPPTYPE_INT64 = 2, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CPPTYPE_UINT32 = 3, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CPPTYPE_UINT64 = 4, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CPPTYPE_DOUBLE = 5, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CPPTYPE_FLOAT = 6, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CPPTYPE_BOOL = 7, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CPPTYPE_ENUM = 8, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CPPTYPE_STRING = 9, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CPPTYPE_MESSAGE = 10, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MAX_CPPTYPE = 10, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper method to get the CppType for a particular Type. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static CppType FieldTypeToCppType(FieldType type); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Given a FieldSescriptor::Type return its WireType 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline WireFormatLite::WireType WireTypeForFieldType( 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WireFormatLite::FieldType type) { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kWireTypeForFieldType[type]; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Number of bits in a tag which identify the wire type. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kTagTypeBits = 3; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mask for those bits. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint32 kTagTypeMask = (1 << kTagTypeBits) - 1; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper functions for encoding and decoding tags. (Inlined below and in 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // _inl.h) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is different from MakeTag(field->number(), field->type()) in the case 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of packed repeated fields. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static uint32 MakeTag(int field_number, WireType type); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static WireType GetTagWireType(uint32 tag); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int GetTagFieldNumber(uint32 tag); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compute the byte size of a tag. For groups, this includes both the start 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and end tags. 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline int TagSize(int field_number, WireFormatLite::FieldType type); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ----------------------------------------------------------------- 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helpers for dealing with unknown fields 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Skips a field value with the given tag. The input should start 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // positioned immediately after the tag. Skipped values are simply discarded, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not recorded anywhere. See WireFormat::SkipField() for a version that 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // records to an UnknownFieldSet. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool SkipField(io::CodedInputStream* input, uint32 tag, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UnknownFieldSet *unknown_fields); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reads and ignores a message from the input. If unknown_fields is non-NULL, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the contents will be added to it. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool SkipMessage(io::CodedInputStream* input, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UnknownFieldSet* unknown_fields); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reads and ignores a message from the input. Skipped values may be stored 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the UnknownFieldSet if it exists. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool SkipMessage(io::CodedInputStream* input); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This macro does the same thing as WireFormatLite::MakeTag(), but the 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// result is usable as a compile-time constant, which makes it usable 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as a switch case or a template input. WireFormatLite::MakeTag() is more 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// type-safe, though, so prefer it if possible. 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(FIELD_NUMBER, TYPE) \ 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<uint32>( \ 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((FIELD_NUMBER) << ::google::protobuf::internal::WireFormatLite::kTagTypeBits) \ 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) | (TYPE)) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These are the tags for the old MessageSet format, which was defined as: 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message MessageSet { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // repeated group Item = 1 { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // required int32 type_id = 2; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // required string message = 3; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // } 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // } 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kMessageSetItemNumber = 1; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kMessageSetTypeIdNumber = 2; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kMessageSetMessageNumber = 3; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kMessageSetItemStartTag = 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(kMessageSetItemNumber, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WireFormatLite::WIRETYPE_START_GROUP); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kMessageSetItemEndTag = 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(kMessageSetItemNumber, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WireFormatLite::WIRETYPE_END_GROUP); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kMessageSetTypeIdTag = 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(kMessageSetTypeIdNumber, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WireFormatLite::WIRETYPE_VARINT); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kMessageSetMessageTag = 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(kMessageSetMessageNumber, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WireFormatLite::WIRETYPE_LENGTH_DELIMITED); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Byte size of all tags of a MessageSet::Item combined. 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kMessageSetItemTagsSize; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper functions for converting between floats/doubles and IEEE-754 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // uint32s/uint64s so that they can be written. (Assumes your platform 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // uses IEEE-754 floats.) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static uint32 EncodeFloat(float value); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static float DecodeFloat(uint32 value); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static uint64 EncodeDouble(double value); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static double DecodeDouble(uint64 value); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper functions for mapping signed integers to unsigned integers in 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // such a way that numbers with small magnitudes will encode to smaller 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // varints. If you simply static_cast a negative number to an unsigned 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // number and varint-encode it, it will always take 10 bytes, defeating 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the purpose of varint. So, for the "sint32" and "sint64" field types, 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we ZigZag-encode the values. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static uint32 ZigZagEncode32(int32 n); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int32 ZigZagDecode32(uint32 n); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static uint64 ZigZagEncode64(int64 n); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int64 ZigZagDecode64(uint64 n); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Write the contents of an UnknownFieldSet to the output. 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SerializeUnknownFields(const UnknownFieldSet& unknown_fields, 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io::CodedOutputStream* output); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Same as above, except writing directly to the provided buffer. 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requires that the buffer have sufficient capacity for 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ComputeUnknownFieldsSize(unknown_fields). 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a pointer past the last written byte. 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static uint8* SerializeUnknownFieldsToArray( 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const UnknownFieldSet& unknown_fields, 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* target); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Same thing except for messages that have the message_set_wire_format 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // option. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SerializeUnknownMessageSetItems( 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const UnknownFieldSet& unknown_fields, 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io::CodedOutputStream* output); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Same as above, except writing directly to the provided buffer. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requires that the buffer have sufficient capacity for 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ComputeUnknownMessageSetItemsSize(unknown_fields). 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a pointer past the last written byte. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static uint8* SerializeUnknownMessageSetItemsToArray( 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const UnknownFieldSet& unknown_fields, 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* target); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compute the size of the UnknownFieldSet on the wire. 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int ComputeUnknownFieldsSize(const UnknownFieldSet& unknown_fields); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Same thing except for messages that have the message_set_wire_format 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // option. 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int ComputeUnknownMessageSetItemsSize( 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const UnknownFieldSet& unknown_fields); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ================================================================= 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Methods for reading/writing individual field. The implementations 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of these methods are defined in wire_format_lite_inl.h; you must #include 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that file to use these. 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Avoid ugly line wrapping 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define input io::CodedInputStream* input 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define output io::CodedOutputStream* output 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define field_number int field_number 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define INL GOOGLE_ATTRIBUTE_ALWAYS_INLINE 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read fields, not including tags. The assumption is that you already 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // read the tag to determine what field to read. 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For primitive fields, we just use a templatized routine parameterized by 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the represented type and the FieldType. These are specialized with the 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // appropriate definition for each declared type. 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename CType, enum FieldType DeclaredType> 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline bool ReadPrimitive(input, CType* value) INL; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reads repeated primitive values, with optimizations for repeats. 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tag_size and tag should both be compile-time constants provided by the 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // protocol compiler. 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename CType, enum FieldType DeclaredType> 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline bool ReadRepeatedPrimitive(int tag_size, 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 tag, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input, 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedField<CType>* value) INL; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Identical to ReadRepeatedPrimitive, except will not inline the 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // implementation. 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename CType, enum FieldType DeclaredType> 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool ReadRepeatedPrimitiveNoInline(int tag_size, 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 tag, 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input, 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedField<CType>* value); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reads a primitive value directly from the provided buffer. It returns a 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pointer past the segment of data that was read. 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is only implemented for the types with fixed wire size, e.g. 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // float, double, and the (s)fixed* types. 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename CType, enum FieldType DeclaredType> 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline const uint8* ReadPrimitiveFromArray(const uint8* buffer, 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CType* value) INL; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reads a primitive packed field. 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is only implemented for packable types. 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename CType, enum FieldType DeclaredType> 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline bool ReadPackedPrimitive(input, 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedField<CType>* value) INL; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Identical to ReadPackedPrimitive, except will not inline the 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // implementation. 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename CType, enum FieldType DeclaredType> 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool ReadPackedPrimitiveNoInline(input, RepeatedField<CType>* value); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Read a packed enum field. Values for which is_valid() returns false are 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dropped. 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool ReadPackedEnumNoInline(input, 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool (*is_valid)(int), 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedField<int>* value); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool ReadString(input, string* value); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool ReadBytes (input, string* value); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline bool ReadGroup (field_number, input, MessageLite* value); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline bool ReadMessage(input, MessageLite* value); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Like above, but de-virtualize the call to MergePartialFromCodedStream(). 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The pointer must point at an instance of MessageType, *not* a subclass (or 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the subclass must not override MergePartialFromCodedStream()). 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename MessageType> 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline bool ReadGroupNoVirtual(field_number, input, 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageType* value); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename MessageType> 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline bool ReadMessageNoVirtual(input, MessageType* value); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Write a tag. The Write*() functions typically include the tag, so 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // normally there's no need to call this unless using the Write*NoTag() 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // variants. 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline void WriteTag(field_number, WireType type, output) INL; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Write fields, without tags. 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline void WriteInt32NoTag (int32 value, output) INL; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline void WriteInt64NoTag (int64 value, output) INL; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline void WriteUInt32NoTag (uint32 value, output) INL; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline void WriteUInt64NoTag (uint64 value, output) INL; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline void WriteSInt32NoTag (int32 value, output) INL; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline void WriteSInt64NoTag (int64 value, output) INL; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline void WriteFixed32NoTag (uint32 value, output) INL; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline void WriteFixed64NoTag (uint64 value, output) INL; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline void WriteSFixed32NoTag(int32 value, output) INL; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline void WriteSFixed64NoTag(int64 value, output) INL; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline void WriteFloatNoTag (float value, output) INL; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline void WriteDoubleNoTag (double value, output) INL; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline void WriteBoolNoTag (bool value, output) INL; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline void WriteEnumNoTag (int value, output) INL; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Write fields, including tags. 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteInt32 (field_number, int32 value, output); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteInt64 (field_number, int64 value, output); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteUInt32 (field_number, uint32 value, output); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteUInt64 (field_number, uint64 value, output); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteSInt32 (field_number, int32 value, output); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteSInt64 (field_number, int64 value, output); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteFixed32 (field_number, uint32 value, output); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteFixed64 (field_number, uint64 value, output); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteSFixed32(field_number, int32 value, output); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteSFixed64(field_number, int64 value, output); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteFloat (field_number, float value, output); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteDouble (field_number, double value, output); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteBool (field_number, bool value, output); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteEnum (field_number, int value, output); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteString(field_number, const string& value, output); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteBytes (field_number, const string& value, output); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteGroup( 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, const MessageLite& value, output); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteMessage( 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, const MessageLite& value, output); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Like above, but these will check if the output stream has enough 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // space to write directly to a flat array. 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteGroupMaybeToArray( 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, const MessageLite& value, output); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void WriteMessageMaybeToArray( 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, const MessageLite& value, output); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Like above, but de-virtualize the call to SerializeWithCachedSizes(). The 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pointer must point at an instance of MessageType, *not* a subclass (or 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the subclass must not override SerializeWithCachedSizes()). 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename MessageType> 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline void WriteGroupNoVirtual( 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, const MessageType& value, output); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename MessageType> 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline void WriteMessageNoVirtual( 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, const MessageType& value, output); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef output 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define output uint8* target 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Like above, but use only *ToArray methods of CodedOutputStream. 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteTagToArray(field_number, WireType type, output) INL; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Write fields, without tags. 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteInt32NoTagToArray (int32 value, output) INL; 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteInt64NoTagToArray (int64 value, output) INL; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteUInt32NoTagToArray (uint32 value, output) INL; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteUInt64NoTagToArray (uint64 value, output) INL; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteSInt32NoTagToArray (int32 value, output) INL; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteSInt64NoTagToArray (int64 value, output) INL; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteFixed32NoTagToArray (uint32 value, output) INL; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteFixed64NoTagToArray (uint64 value, output) INL; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteSFixed32NoTagToArray(int32 value, output) INL; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteSFixed64NoTagToArray(int64 value, output) INL; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteFloatNoTagToArray (float value, output) INL; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteDoubleNoTagToArray (double value, output) INL; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteBoolNoTagToArray (bool value, output) INL; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteEnumNoTagToArray (int value, output) INL; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Write fields, including tags. 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteInt32ToArray( 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, int32 value, output) INL; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteInt64ToArray( 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, int64 value, output) INL; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteUInt32ToArray( 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, uint32 value, output) INL; 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteUInt64ToArray( 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, uint64 value, output) INL; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteSInt32ToArray( 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, int32 value, output) INL; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteSInt64ToArray( 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, int64 value, output) INL; 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteFixed32ToArray( 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, uint32 value, output) INL; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteFixed64ToArray( 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, uint64 value, output) INL; 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteSFixed32ToArray( 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, int32 value, output) INL; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteSFixed64ToArray( 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, int64 value, output) INL; 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteFloatToArray( 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, float value, output) INL; 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteDoubleToArray( 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, double value, output) INL; 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteBoolToArray( 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, bool value, output) INL; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteEnumToArray( 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, int value, output) INL; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteStringToArray( 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, const string& value, output) INL; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteBytesToArray( 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, const string& value, output) INL; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteGroupToArray( 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, const MessageLite& value, output) INL; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteMessageToArray( 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, const MessageLite& value, output) INL; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Like above, but de-virtualize the call to SerializeWithCachedSizes(). The 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pointer must point at an instance of MessageType, *not* a subclass (or 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the subclass must not override SerializeWithCachedSizes()). 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename MessageType> 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteGroupNoVirtualToArray( 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, const MessageType& value, output) INL; 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename MessageType> 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline uint8* WriteMessageNoVirtualToArray( 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number, const MessageType& value, output) INL; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef output 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef input 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef INL 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef field_number 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compute the byte size of a field. The XxSize() functions do NOT include 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the tag, so you must also call TagSize(). (This is because, for repeated 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // fields, you should only call TagSize() once and multiply it by the element 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // count, but you may have to call XxSize() for each individual element.) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline int Int32Size ( int32 value); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline int Int64Size ( int64 value); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline int UInt32Size (uint32 value); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline int UInt64Size (uint64 value); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline int SInt32Size ( int32 value); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline int SInt64Size ( int64 value); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline int EnumSize ( int value); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These types always have the same size. 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kFixed32Size = 4; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kFixed64Size = 8; 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kSFixed32Size = 4; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kSFixed64Size = 8; 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kFloatSize = 4; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kDoubleSize = 8; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kBoolSize = 1; 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline int StringSize(const string& value); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline int BytesSize (const string& value); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline int GroupSize (const MessageLite& value); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline int MessageSize(const MessageLite& value); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Like above, but de-virtualize the call to ByteSize(). The 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pointer must point at an instance of MessageType, *not* a subclass (or 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the subclass must not override ByteSize()). 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename MessageType> 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline int GroupSizeNoVirtual (const MessageType& value); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename MessageType> 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline int MessageSizeNoVirtual(const MessageType& value); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 522ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Given the length of data, calculate the byte size of the data on the 523ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // wire if we encode the data as a length delimited field. 524ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch static inline int LengthDelimitedSize(int length); 525ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A helper method for the repeated primitive reader. This method has 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // optimizations for primitive types that have fixed size on the wire, and 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can be read using potentially faster paths. 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename CType, enum FieldType DeclaredType> 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline bool ReadRepeatedFixedSizePrimitive( 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tag_size, 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 tag, 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) google::protobuf::io::CodedInputStream* input, 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedField<CType>* value) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const CppType kFieldTypeToCppTypeMap[]; 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const WireFormatLite::WireType kWireTypeForFieldType[]; 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(WireFormatLite); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A class which deals with unknown values by saving them to an UnknownFieldSet. 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LIBPROTOBUF_EXPORT FieldSkipper { 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FieldSkipper(UnknownFieldSet* unknown_fields) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : unknown_fields_(unknown_fields) {} 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Skip a field whose tag has already been consumed. 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool SkipField(io::CodedInputStream* input, uint32 tag); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Skip an entire message or group, up to an end-group tag (which is consumed) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or end-of-stream. 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool SkipMessage(io::CodedInputStream* input); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deal with an already-parsed unrecognized enum value. The default 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // implementation does nothing, but the UnknownFieldSet-based implementation 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // saves it as an unknown varint. 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SkipUnknownEnum(int field_number, int value); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 561ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch protected: 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UnknownFieldSet* unknown_fields_; 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// inline methods ==================================================== 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline WireFormatLite::CppType 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WireFormatLite::FieldTypeToCppType(FieldType type) { 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kFieldTypeToCppTypeMap[type]; 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint32 WireFormatLite::MakeTag(int field_number, WireType type) { 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(field_number, type); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline WireFormatLite::WireType WireFormatLite::GetTagWireType(uint32 tag) { 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<WireType>(tag & kTagTypeMask); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int WireFormatLite::GetTagFieldNumber(uint32 tag) { 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<int>(tag >> kTagTypeBits); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int WireFormatLite::TagSize(int field_number, 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WireFormatLite::FieldType type) { 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result = io::CodedOutputStream::VarintSize32( 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_number << kTagTypeBits); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == TYPE_GROUP) { 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Groups have both a start and an end tag. 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result * 2; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint32 WireFormatLite::EncodeFloat(float value) { 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) union {float f; uint32 i;}; 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f = value; 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return i; 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline float WireFormatLite::DecodeFloat(uint32 value) { 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) union {float f; uint32 i;}; 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i = value; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return f; 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint64 WireFormatLite::EncodeDouble(double value) { 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) union {double f; uint64 i;}; 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f = value; 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return i; 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline double WireFormatLite::DecodeDouble(uint64 value) { 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) union {double f; uint64 i;}; 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i = value; 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return f; 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ZigZag Transform: Encodes signed integers so that they can be 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// effectively used with varint encoding. 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// varint operates on unsigned integers, encoding smaller numbers into 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fewer bytes. If you try to use it on a signed integer, it will treat 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this number as a very large unsigned integer, which means that even 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// small signed numbers like -1 will take the maximum number of bytes 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (10) to encode. ZigZagEncode() maps signed integers to unsigned 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in such a way that those with a small absolute value will have smaller 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// encoded values, making them appropriate for encoding using varint. 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// int32 -> uint32 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ------------------------- 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 0 -> 0 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -1 -> 1 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1 -> 2 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -2 -> 3 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ... -> ... 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2147483647 -> 4294967294 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -2147483648 -> 4294967295 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// >> encode >> 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// << decode << 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint32 WireFormatLite::ZigZagEncode32(int32 n) { 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: the right-shift must be arithmetic 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (n << 1) ^ (n >> 31); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int32 WireFormatLite::ZigZagDecode32(uint32 n) { 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (n >> 1) ^ -static_cast<int32>(n & 1); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline uint64 WireFormatLite::ZigZagEncode64(int64 n) { 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: the right-shift must be arithmetic 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (n << 1) ^ (n >> 63); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int64 WireFormatLite::ZigZagDecode64(uint64 n) { 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (n >> 1) ^ -static_cast<int64>(n & 1); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace protobuf 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace google 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_H__ 667