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