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