wire_format_lite.h revision fbaaef999ba563838ebd00874ed8a1c01fbf286d
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 { 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville namespace io { 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class CodedInputStream; // coded_stream.h 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class CodedOutputStream; // coded_stream.h 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace internal { 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This class is for internal use by the protocol buffer library and by 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// protocol-complier-generated message classes. It must not be called 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// directly by clients. 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This class contains helpers for implementing the binary protocol buffer 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// wire format without the need for reflection. Use WireFormat when using 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// reflection. 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This class is really a namespace that contains only static methods. 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT WireFormatLite { 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // ----------------------------------------------------------------- 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Helper constants and functions related to the format. These are 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // mostly meant for internal and generated code to use. 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The wire format is composed of a sequence of tag/value pairs, each 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // of which contains the value of one field (or one element of a repeated 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // field). Each tag is encoded as a varint. The lower bits of the tag 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // identify its wire type, which specifies the format of the data to follow. 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The rest of the bits contain the field number. Each type of field (as 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // declared by FieldDescriptor::Type, in descriptor.h) maps to one of 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // these wire types. Immediately following each tag is the field's value, 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // encoded in the format specified by the wire type. Because the tag 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // identifies the encoding of this data, it is possible to skip 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // unrecognized fields for forwards compatibility. 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum WireType { 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville WIRETYPE_VARINT = 0, 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville WIRETYPE_FIXED64 = 1, 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville WIRETYPE_LENGTH_DELIMITED = 2, 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville WIRETYPE_START_GROUP = 3, 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville WIRETYPE_END_GROUP = 4, 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville WIRETYPE_FIXED32 = 5, 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Lite alternative to FieldDescriptor::Type. Must be kept in sync. 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum FieldType { 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_DOUBLE = 1, 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_FLOAT = 2, 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_INT64 = 3, 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_UINT64 = 4, 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_INT32 = 5, 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_FIXED64 = 6, 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_FIXED32 = 7, 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_BOOL = 8, 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_STRING = 9, 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_GROUP = 10, 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_MESSAGE = 11, 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_BYTES = 12, 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_UINT32 = 13, 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_ENUM = 14, 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_SFIXED32 = 15, 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_SFIXED64 = 16, 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_SINT32 = 17, 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TYPE_SINT64 = 18, 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MAX_FIELD_TYPE = 18, 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Lite alternative to FieldDescriptor::CppType. Must be kept in sync. 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville enum CppType { 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_INT32 = 1, 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_INT64 = 2, 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_UINT32 = 3, 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_UINT64 = 4, 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_DOUBLE = 5, 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_FLOAT = 6, 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_BOOL = 7, 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_ENUM = 8, 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_STRING = 9, 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville CPPTYPE_MESSAGE = 10, 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MAX_CPPTYPE = 10, 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Helper method to get the CppType for a particular Type. 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static CppType FieldTypeToCppType(FieldType type); 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Given a FieldSescriptor::Type return its WireType 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline WireFormatLite::WireType WireTypeForFieldType( 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville WireFormatLite::FieldType type) { 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return kWireTypeForFieldType[type]; 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Number of bits in a tag which identify the wire type. 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kTagTypeBits = 3; 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Mask for those bits. 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const uint32 kTagTypeMask = (1 << kTagTypeBits) - 1; 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Helper functions for encoding and decoding tags. (Inlined below and in 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // _inl.h) 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // This is different from MakeTag(field->number(), field->type()) in the case 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // of packed repeated fields. 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static uint32 MakeTag(int field_number, WireType type); 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static WireType GetTagWireType(uint32 tag); 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static int GetTagFieldNumber(uint32 tag); 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Compute the byte size of a tag. For groups, this includes both the start 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // and end tags. 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int TagSize(int field_number, WireFormatLite::FieldType type); 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Skips a field value with the given tag. The input should start 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // positioned immediately after the tag. Skipped values are simply discarded, 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // not recorded anywhere. See WireFormat::SkipField() for a version that 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // records to an UnknownFieldSet. 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static bool SkipField(io::CodedInputStream* input, uint32 tag); 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Reads and ignores a message from the input. Skipped values are simply 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // discarded, not recorded anywhere. See WireFormat::SkipMessage() for a 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // version that records to an UnknownFieldSet. 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static bool SkipMessage(io::CodedInputStream* input); 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This macro does the same thing as WireFormatLite::MakeTag(), but the 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// result is usable as a compile-time constant, which makes it usable 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// as a switch case or a template input. WireFormatLite::MakeTag() is more 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// type-safe, though, so prefer it if possible. 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(FIELD_NUMBER, TYPE) \ 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static_cast<uint32>( \ 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ((FIELD_NUMBER) << ::google::protobuf::internal::WireFormatLite::kTagTypeBits) \ 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville | (TYPE)) 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These are the tags for the old MessageSet format, which was defined as: 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message MessageSet { 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // repeated group Item = 1 { 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // required int32 type_id = 2; 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // required string message = 3; 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // } 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kMessageSetItemStartTag = 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(1, WireFormatLite::WIRETYPE_START_GROUP); 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kMessageSetItemEndTag = 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(1, WireFormatLite::WIRETYPE_END_GROUP); 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kMessageSetTypeIdTag = 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(2, WireFormatLite::WIRETYPE_VARINT); 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kMessageSetMessageTag = 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(3, WireFormatLite::WIRETYPE_LENGTH_DELIMITED); 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Byte size of all tags of a MessageSet::Item combined. 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kMessageSetItemTagsSize; 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Helper functions for converting between floats/doubles and IEEE-754 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // uint32s/uint64s so that they can be written. (Assumes your platform 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // uses IEEE-754 floats.) 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static uint32 EncodeFloat(float value); 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static float DecodeFloat(uint32 value); 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static uint64 EncodeDouble(double value); 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static double DecodeDouble(uint64 value); 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Helper functions for mapping signed integers to unsigned integers in 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // such a way that numbers with small magnitudes will encode to smaller 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // varints. If you simply static_cast a negative number to an unsigned 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // number and varint-encode it, it will always take 10 bytes, defeating 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the purpose of varint. So, for the "sint32" and "sint64" field types, 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // we ZigZag-encode the values. 212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static uint32 ZigZagEncode32(int32 n); 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static int32 ZigZagDecode32(uint32 n); 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static uint64 ZigZagEncode64(int64 n); 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static int64 ZigZagDecode64(uint64 n); 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // ================================================================= 218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Methods for reading/writing individual field. The implementations 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // of these methods are defined in wire_format_lite_inl.h; you must #include 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // that file to use these. 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Avoid ugly line wrapping 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define input io::CodedInputStream* input 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define output io::CodedOutputStream* output 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define field_number int field_number 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define INL GOOGLE_ATTRIBUTE_ALWAYS_INLINE 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Read fields, not including tags. The assumption is that you already 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // read the tag to determine what field to read. 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadInt32 (input, int32* value); 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadInt64 (input, int64* value); 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadUInt32 (input, uint32* value); 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadUInt64 (input, uint64* value); 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadSInt32 (input, int32* value); 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadSInt64 (input, int64* value); 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadFixed32 (input, uint32* value); 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadFixed64 (input, uint64* value); 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadSFixed32(input, int32* value); 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadSFixed64(input, int64* value); 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadFloat (input, float* value); 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadDouble (input, double* value); 242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadBool (input, bool* value); 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadEnum (input, int* value); 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadString(input, string* value); 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadBytes (input, string* value); 247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadGroup (field_number, input, MessageLite* value); 249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadMessage(input, MessageLite* value); 250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like above, but de-virtualize the call to MergePartialFromCodedStream(). 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // The pointer must point at an instance of MessageType, *not* a subclass (or 253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the subclass must not override MergePartialFromCodedStream()). 254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template<typename MessageType> 255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadGroupNoVirtual(field_number, input, 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MessageType* value); 257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template<typename MessageType> 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline bool ReadMessageNoVirtual(input, MessageType* value); 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Write a tag. The Write*() functions typically include the tag, so 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // normally there's no need to call this unless using the Write*NoTag() 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // variants. 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteTag(field_number, WireType type, output) INL; 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Write fields, without tags. 266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteInt32NoTag (int32 value, output) INL; 267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteInt64NoTag (int64 value, output) INL; 268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteUInt32NoTag (uint32 value, output) INL; 269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteUInt64NoTag (uint64 value, output) INL; 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteSInt32NoTag (int32 value, output) INL; 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteSInt64NoTag (int64 value, output) INL; 272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteFixed32NoTag (uint32 value, output) INL; 273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteFixed64NoTag (uint64 value, output) INL; 274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteSFixed32NoTag(int32 value, output) INL; 275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteSFixed64NoTag(int64 value, output) INL; 276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteFloatNoTag (float value, output) INL; 277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteDoubleNoTag (double value, output) INL; 278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteBoolNoTag (bool value, output) INL; 279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteEnumNoTag (int value, output) INL; 280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Write fields, including tags. 282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteInt32 (field_number, int32 value, output) INL; 283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteInt64 (field_number, int64 value, output) INL; 284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteUInt32 (field_number, uint32 value, output) INL; 285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteUInt64 (field_number, uint64 value, output) INL; 286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteSInt32 (field_number, int32 value, output) INL; 287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteSInt64 (field_number, int64 value, output) INL; 288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteFixed32 (field_number, uint32 value, output) INL; 289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteFixed64 (field_number, uint64 value, output) INL; 290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteSFixed32(field_number, int32 value, output) INL; 291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteSFixed64(field_number, int64 value, output) INL; 292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteFloat (field_number, float value, output) INL; 293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteDouble (field_number, double value, output) INL; 294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteBool (field_number, bool value, output) INL; 295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteEnum (field_number, int value, output) INL; 296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteString(field_number, const string& value, output) INL; 298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteBytes (field_number, const string& value, output) INL; 299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteGroup( 301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, const MessageLite& value, output) INL; 302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteMessage( 303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, const MessageLite& value, output) INL; 304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like above, but de-virtualize the call to SerializeWithCachedSizes(). The 306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // pointer must point at an instance of MessageType, *not* a subclass (or 307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the subclass must not override SerializeWithCachedSizes()). 308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template<typename MessageType> 309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteGroupNoVirtual( 310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, const MessageType& value, output) INL; 311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template<typename MessageType> 312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline void WriteMessageNoVirtual( 313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, const MessageType& value, output) INL; 314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef output 316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define output uint8* target 317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like above, but use only *ToArray methods of CodedOutputStream. 319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteTagToArray(field_number, WireType type, output) INL; 320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Write fields, without tags. 322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteInt32NoTagToArray (int32 value, output) INL; 323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteInt64NoTagToArray (int64 value, output) INL; 324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteUInt32NoTagToArray (uint32 value, output) INL; 325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteUInt64NoTagToArray (uint64 value, output) INL; 326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteSInt32NoTagToArray (int32 value, output) INL; 327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteSInt64NoTagToArray (int64 value, output) INL; 328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteFixed32NoTagToArray (uint32 value, output) INL; 329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteFixed64NoTagToArray (uint64 value, output) INL; 330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteSFixed32NoTagToArray(int32 value, output) INL; 331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteSFixed64NoTagToArray(int64 value, output) INL; 332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteFloatNoTagToArray (float value, output) INL; 333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteDoubleNoTagToArray (double value, output) INL; 334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteBoolNoTagToArray (bool value, output) INL; 335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteEnumNoTagToArray (int value, output) INL; 336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Write fields, including tags. 338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteInt32ToArray( 339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, int32 value, output) INL; 340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteInt64ToArray( 341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, int64 value, output) INL; 342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteUInt32ToArray( 343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, uint32 value, output) INL; 344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteUInt64ToArray( 345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, uint64 value, output) INL; 346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteSInt32ToArray( 347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, int32 value, output) INL; 348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteSInt64ToArray( 349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, int64 value, output) INL; 350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteFixed32ToArray( 351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, uint32 value, output) INL; 352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteFixed64ToArray( 353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, uint64 value, output) INL; 354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteSFixed32ToArray( 355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, int32 value, output) INL; 356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteSFixed64ToArray( 357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, int64 value, output) INL; 358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteFloatToArray( 359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, float value, output) INL; 360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteDoubleToArray( 361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, double value, output) INL; 362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteBoolToArray( 363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, bool value, output) INL; 364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteEnumToArray( 365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, int value, output) INL; 366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteStringToArray( 368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, const string& value, output) INL; 369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteBytesToArray( 370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, const string& value, output) INL; 371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteGroupToArray( 373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, const MessageLite& value, output) INL; 374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteMessageToArray( 375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, const MessageLite& value, output) INL; 376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like above, but de-virtualize the call to SerializeWithCachedSizes(). The 378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // pointer must point at an instance of MessageType, *not* a subclass (or 379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the subclass must not override SerializeWithCachedSizes()). 380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template<typename MessageType> 381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteGroupNoVirtualToArray( 382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, const MessageType& value, output) INL; 383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template<typename MessageType> 384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline uint8* WriteMessageNoVirtualToArray( 385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number, const MessageType& value, output) INL; 386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef output 388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef input 389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef INL 390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef field_number 392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Compute the byte size of a field. The XxSize() functions do NOT include 394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the tag, so you must also call TagSize(). (This is because, for repeated 395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // fields, you should only call TagSize() once and multiply it by the element 396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // count, but you may have to call XxSize() for each individual element.) 397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int Int32Size ( int32 value); 398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int Int64Size ( int64 value); 399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int UInt32Size (uint32 value); 400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int UInt64Size (uint64 value); 401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int SInt32Size ( int32 value); 402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int SInt64Size ( int64 value); 403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int EnumSize ( int value); 404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // These types always have the same size. 406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kFixed32Size = 4; 407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kFixed64Size = 8; 408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kSFixed32Size = 4; 409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kSFixed64Size = 8; 410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kFloatSize = 4; 411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kDoubleSize = 8; 412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const int kBoolSize = 1; 413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int StringSize(const string& value); 415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int BytesSize (const string& value); 416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int GroupSize (const MessageLite& value); 418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int MessageSize(const MessageLite& value); 419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Like above, but de-virtualize the call to ByteSize(). The 421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // pointer must point at an instance of MessageType, *not* a subclass (or 422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the subclass must not override ByteSize()). 423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template<typename MessageType> 424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int GroupSizeNoVirtual (const MessageType& value); 425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville template<typename MessageType> 426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static inline int MessageSizeNoVirtual(const MessageType& value); 427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const CppType kFieldTypeToCppTypeMap[]; 430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const WireFormatLite::WireType kWireTypeForFieldType[]; 431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(WireFormatLite); 433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A class which deals with unknown values. The default implementation just 436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// discards them. WireFormat defines a subclass which writes to an 437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// UnknownFieldSet. This class is used by ExtensionSet::ParseField(), since 438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ExtensionSet is part of the lite library but UnknownFieldSet is not. 439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT FieldSkipper { 440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FieldSkipper() {} 442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual ~FieldSkipper() {} 443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Skip a field whose tag has already been consumed. 445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual bool SkipField(io::CodedInputStream* input, uint32 tag); 446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Skip an entire message or group, up to an end-group tag (which is consumed) 448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // or end-of-stream. 449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual bool SkipMessage(io::CodedInputStream* input); 450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Deal with an already-parsed unrecognized enum value. The default 452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // implementation does nothing, but the UnknownFieldSet-based implementation 453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // saves it as an unknown varint. 454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville virtual void SkipUnknownEnum(int field_number, int value); 455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// inline methods ==================================================== 458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline WireFormatLite::CppType 460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleWireFormatLite::FieldTypeToCppType(FieldType type) { 461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return kFieldTypeToCppTypeMap[type]; 462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint32 WireFormatLite::MakeTag(int field_number, WireType type) { 465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(field_number, type); 466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline WireFormatLite::WireType WireFormatLite::GetTagWireType(uint32 tag) { 469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return static_cast<WireType>(tag & kTagTypeMask); 470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int WireFormatLite::GetTagFieldNumber(uint32 tag) { 473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return static_cast<int>(tag >> kTagTypeBits); 474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int WireFormatLite::TagSize(int field_number, 477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville WireFormatLite::FieldType type) { 478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int result = io::CodedOutputStream::VarintSize32( 479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_number << kTagTypeBits); 480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (type == TYPE_GROUP) { 481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Groups have both a start and an end tag. 482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result * 2; 483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return result; 485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint32 WireFormatLite::EncodeFloat(float value) { 489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville union {float f; uint32 i;}; 490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville f = value; 491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return i; 492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline float WireFormatLite::DecodeFloat(uint32 value) { 495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville union {float f; uint32 i;}; 496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville i = value; 497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return f; 498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint64 WireFormatLite::EncodeDouble(double value) { 501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville union {double f; uint64 i;}; 502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville f = value; 503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return i; 504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline double WireFormatLite::DecodeDouble(uint64 value) { 507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville union {double f; uint64 i;}; 508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville i = value; 509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return f; 510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ZigZag Transform: Encodes signed integers so that they can be 513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// effectively used with varint encoding. 514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// varint operates on unsigned integers, encoding smaller numbers into 516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// fewer bytes. If you try to use it on a signed integer, it will treat 517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this number as a very large unsigned integer, which means that even 518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// small signed numbers like -1 will take the maximum number of bytes 519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (10) to encode. ZigZagEncode() maps signed integers to unsigned 520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in such a way that those with a small absolute value will have smaller 521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// encoded values, making them appropriate for encoding using varint. 522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// int32 -> uint32 524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ------------------------- 525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 0 -> 0 526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// -1 -> 1 527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 1 -> 2 528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// -2 -> 3 529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ... -> ... 530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 2147483647 -> 4294967294 531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// -2147483648 -> 4294967295 532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// >> encode >> 534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// << decode << 535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint32 WireFormatLite::ZigZagEncode32(int32 n) { 537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Note: the right-shift must be arithmetic 538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return (n << 1) ^ (n >> 31); 539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int32 WireFormatLite::ZigZagDecode32(uint32 n) { 542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return (n >> 1) ^ -static_cast<int32>(n & 1); 543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint64 WireFormatLite::ZigZagEncode64(int64 n) { 546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Note: the right-shift must be arithmetic 547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return (n << 1) ^ (n >> 63); 548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int64 WireFormatLite::ZigZagDecode64(uint64 n) { 551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return (n >> 1) ^ -static_cast<int64>(n & 1); 552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace internal 555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace protobuf 556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace google 558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif // GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_H__ 559