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