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//         wink@google.com (Wink Saville) (refactored from wire_format.h)
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Based on original Protocol Buffers design by
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Sanjay Ghemawat, Jeff Dean, and others.
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifndef GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_INL_H__
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_INL_H__
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <string>
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h>
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/message_lite.h>
42d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#include <google/protobuf/repeated_field.h>
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/wire_format_lite.h>
44d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#include <google/protobuf/generated_message_util.h>
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/io/coded_stream.h>
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace internal {
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
52d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// Implementation details of ReadPrimitive.
53d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
54d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <>
55d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline bool WireFormatLite::ReadPrimitive<int32, WireFormatLite::TYPE_INT32>(
56d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    io::CodedInputStream* input,
57d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    int32* value) {
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint32 temp;
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!input->ReadVarint32(&temp)) return false;
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  *value = static_cast<int32>(temp);
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return true;
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
63d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <>
64d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline bool WireFormatLite::ReadPrimitive<int64, WireFormatLite::TYPE_INT64>(
65d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    io::CodedInputStream* input,
66d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    int64* value) {
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint64 temp;
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!input->ReadVarint64(&temp)) return false;
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  *value = static_cast<int64>(temp);
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return true;
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
72d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <>
73d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline bool WireFormatLite::ReadPrimitive<uint32, WireFormatLite::TYPE_UINT32>(
74d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    io::CodedInputStream* input,
75d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    uint32* value) {
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return input->ReadVarint32(value);
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
78d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <>
79d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline bool WireFormatLite::ReadPrimitive<uint64, WireFormatLite::TYPE_UINT64>(
80d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    io::CodedInputStream* input,
81d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    uint64* value) {
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return input->ReadVarint64(value);
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
84d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <>
85d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline bool WireFormatLite::ReadPrimitive<int32, WireFormatLite::TYPE_SINT32>(
86d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    io::CodedInputStream* input,
87d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    int32* value) {
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint32 temp;
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!input->ReadVarint32(&temp)) return false;
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  *value = ZigZagDecode32(temp);
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return true;
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
93d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <>
94d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline bool WireFormatLite::ReadPrimitive<int64, WireFormatLite::TYPE_SINT64>(
95d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    io::CodedInputStream* input,
96d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    int64* value) {
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint64 temp;
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!input->ReadVarint64(&temp)) return false;
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  *value = ZigZagDecode64(temp);
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return true;
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
102d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <>
103d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline bool WireFormatLite::ReadPrimitive<uint32, WireFormatLite::TYPE_FIXED32>(
104d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    io::CodedInputStream* input,
105d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    uint32* value) {
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return input->ReadLittleEndian32(value);
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
108d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <>
109d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline bool WireFormatLite::ReadPrimitive<uint64, WireFormatLite::TYPE_FIXED64>(
110d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    io::CodedInputStream* input,
111d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    uint64* value) {
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return input->ReadLittleEndian64(value);
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
114d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <>
115d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline bool WireFormatLite::ReadPrimitive<int32, WireFormatLite::TYPE_SFIXED32>(
116d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    io::CodedInputStream* input,
117d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    int32* value) {
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint32 temp;
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!input->ReadLittleEndian32(&temp)) return false;
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  *value = static_cast<int32>(temp);
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return true;
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
123d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <>
124d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline bool WireFormatLite::ReadPrimitive<int64, WireFormatLite::TYPE_SFIXED64>(
125d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    io::CodedInputStream* input,
126d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    int64* value) {
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint64 temp;
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!input->ReadLittleEndian64(&temp)) return false;
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  *value = static_cast<int64>(temp);
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return true;
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
132d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <>
133d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline bool WireFormatLite::ReadPrimitive<float, WireFormatLite::TYPE_FLOAT>(
134d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    io::CodedInputStream* input,
135d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    float* value) {
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint32 temp;
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!input->ReadLittleEndian32(&temp)) return false;
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  *value = DecodeFloat(temp);
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return true;
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
141d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <>
142d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline bool WireFormatLite::ReadPrimitive<double, WireFormatLite::TYPE_DOUBLE>(
143d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    io::CodedInputStream* input,
144d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    double* value) {
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint64 temp;
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!input->ReadLittleEndian64(&temp)) return false;
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  *value = DecodeDouble(temp);
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return true;
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
150d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <>
151d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline bool WireFormatLite::ReadPrimitive<bool, WireFormatLite::TYPE_BOOL>(
152d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    io::CodedInputStream* input,
153d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    bool* value) {
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint32 temp;
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!input->ReadVarint32(&temp)) return false;
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  *value = temp != 0;
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return true;
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
159d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <>
160d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline bool WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
161d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    io::CodedInputStream* input,
162d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    int* value) {
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint32 temp;
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!input->ReadVarint32(&temp)) return false;
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  *value = static_cast<int>(temp);
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return true;
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
169d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <>
170d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline const uint8* WireFormatLite::ReadPrimitiveFromArray<
171d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  uint32, WireFormatLite::TYPE_FIXED32>(
172d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    const uint8* buffer,
173d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    uint32* value) {
174d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  return io::CodedInputStream::ReadLittleEndian32FromArray(buffer, value);
175d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}
176d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <>
177d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline const uint8* WireFormatLite::ReadPrimitiveFromArray<
178d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  uint64, WireFormatLite::TYPE_FIXED64>(
179d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    const uint8* buffer,
180d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    uint64* value) {
181d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  return io::CodedInputStream::ReadLittleEndian64FromArray(buffer, value);
182d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}
183d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <>
184d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline const uint8* WireFormatLite::ReadPrimitiveFromArray<
185d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  int32, WireFormatLite::TYPE_SFIXED32>(
186d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    const uint8* buffer,
187d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    int32* value) {
188d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  uint32 temp;
189d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  buffer = io::CodedInputStream::ReadLittleEndian32FromArray(buffer, &temp);
190d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  *value = static_cast<int32>(temp);
191d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  return buffer;
192d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}
193d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <>
194d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline const uint8* WireFormatLite::ReadPrimitiveFromArray<
195d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  int64, WireFormatLite::TYPE_SFIXED64>(
196d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    const uint8* buffer,
197d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    int64* value) {
198d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  uint64 temp;
199d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  buffer = io::CodedInputStream::ReadLittleEndian64FromArray(buffer, &temp);
200d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  *value = static_cast<int64>(temp);
201d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  return buffer;
202d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}
203d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <>
204d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline const uint8* WireFormatLite::ReadPrimitiveFromArray<
205d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  float, WireFormatLite::TYPE_FLOAT>(
206d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    const uint8* buffer,
207d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    float* value) {
208d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  uint32 temp;
209d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  buffer = io::CodedInputStream::ReadLittleEndian32FromArray(buffer, &temp);
210d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  *value = DecodeFloat(temp);
211d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  return buffer;
212d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}
213d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <>
214d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline const uint8* WireFormatLite::ReadPrimitiveFromArray<
215d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  double, WireFormatLite::TYPE_DOUBLE>(
216d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    const uint8* buffer,
217d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    double* value) {
218d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  uint64 temp;
219d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  buffer = io::CodedInputStream::ReadLittleEndian64FromArray(buffer, &temp);
220d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  *value = DecodeDouble(temp);
221d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  return buffer;
222d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}
223d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
224d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <typename CType, enum WireFormatLite::FieldType DeclaredType>
225cd0ff6eb0b178cc1c3ed4300cd4066ea3a5c180bKristian Monseninline bool WireFormatLite::ReadRepeatedPrimitive(int, // tag_size, unused
226d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                               uint32 tag,
227d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                               io::CodedInputStream* input,
228d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                               RepeatedField<CType>* values) {
229d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  CType value;
230d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (!ReadPrimitive<CType, DeclaredType>(input, &value)) return false;
231d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  values->Add(value);
232d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  int elements_already_reserved = values->Capacity() - values->size();
233d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  while (elements_already_reserved > 0 && input->ExpectTag(tag)) {
234d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    if (!ReadPrimitive<CType, DeclaredType>(input, &value)) return false;
235d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    values->AddAlreadyReserved(value);
236d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    elements_already_reserved--;
237d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  }
238d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  return true;
239d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}
240d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
241d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <typename CType, enum WireFormatLite::FieldType DeclaredType>
242d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline bool WireFormatLite::ReadRepeatedFixedSizePrimitive(
243d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    int tag_size,
244d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    uint32 tag,
245d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    io::CodedInputStream* input,
246d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    RepeatedField<CType>* values) {
247d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  GOOGLE_DCHECK_EQ(UInt32Size(tag), tag_size);
248d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  CType value;
249d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (!ReadPrimitive<CType, DeclaredType>(input, &value))
250d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    return false;
251d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  values->Add(value);
252d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
253d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // For fixed size values, repeated values can be read more quickly by
254d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // reading directly from a raw array.
255d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  //
256d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // We can get a tight loop by only reading as many elements as can be
257d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // added to the RepeatedField without having to do any resizing. Additionally,
258d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // we only try to read as many elements as are available from the current
259d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // buffer space. Doing so avoids having to perform boundary checks when
260d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // reading the value: the maximum number of elements that can be read is
261d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // known outside of the loop.
262d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  const void* void_pointer;
263d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  int size;
264d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  input->GetDirectBufferPointerInline(&void_pointer, &size);
265d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (size > 0) {
266d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    const uint8* buffer = reinterpret_cast<const uint8*>(void_pointer);
267d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    // The number of bytes each type occupies on the wire.
268d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    const int per_value_size = tag_size + sizeof(value);
269d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
270d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    int elements_available = min(values->Capacity() - values->size(),
271d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                 size / per_value_size);
272d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    int num_read = 0;
273d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    while (num_read < elements_available &&
274d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville           (buffer = io::CodedInputStream::ExpectTagFromArray(
275d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville               buffer, tag)) != NULL) {
276d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      buffer = ReadPrimitiveFromArray<CType, DeclaredType>(buffer, &value);
277d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      values->AddAlreadyReserved(value);
278d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      ++num_read;
279d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    }
280d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    const int read_bytes = num_read * per_value_size;
281d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    if (read_bytes > 0) {
282d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      input->Skip(read_bytes);
283d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    }
284d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  }
285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return true;
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
287d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
288d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// Specializations of ReadRepeatedPrimitive for the fixed size types, which use
289d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// the optimized code path.
290d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#define READ_REPEATED_FIXED_SIZE_PRIMITIVE(CPPTYPE, DECLARED_TYPE)             \
291d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <>                                                                    \
292d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline bool WireFormatLite::ReadRepeatedPrimitive<                             \
293d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  CPPTYPE, WireFormatLite::DECLARED_TYPE>(                                     \
294d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    int tag_size,                                                              \
295d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    uint32 tag,                                                                \
296d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    io::CodedInputStream* input,                                               \
297d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    RepeatedField<CPPTYPE>* values) {                                          \
298d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  return ReadRepeatedFixedSizePrimitive<                                       \
299d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    CPPTYPE, WireFormatLite::DECLARED_TYPE>(                                   \
300d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      tag_size, tag, input, values);                                           \
301d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}
302d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
303d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleREAD_REPEATED_FIXED_SIZE_PRIMITIVE(uint32, TYPE_FIXED32);
304d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleREAD_REPEATED_FIXED_SIZE_PRIMITIVE(uint64, TYPE_FIXED64);
305d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleREAD_REPEATED_FIXED_SIZE_PRIMITIVE(int32, TYPE_SFIXED32);
306d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleREAD_REPEATED_FIXED_SIZE_PRIMITIVE(int64, TYPE_SFIXED64);
307d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleREAD_REPEATED_FIXED_SIZE_PRIMITIVE(float, TYPE_FLOAT);
308d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleREAD_REPEATED_FIXED_SIZE_PRIMITIVE(double, TYPE_DOUBLE);
309d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
310d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#undef READ_REPEATED_FIXED_SIZE_PRIMITIVE
311d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
312d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <typename CType, enum WireFormatLite::FieldType DeclaredType>
313d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savillebool WireFormatLite::ReadRepeatedPrimitiveNoInline(
314d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    int tag_size,
315d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    uint32 tag,
316d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    io::CodedInputStream* input,
317d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    RepeatedField<CType>* value) {
318d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  return ReadRepeatedPrimitive<CType, DeclaredType>(
319d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      tag_size, tag, input, value);
320d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}
321d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
322d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <typename CType, enum WireFormatLite::FieldType DeclaredType>
323d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline bool WireFormatLite::ReadPackedPrimitive(io::CodedInputStream* input,
324d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                                RepeatedField<CType>* values) {
325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint32 length;
326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!input->ReadVarint32(&length)) return false;
327d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  io::CodedInputStream::Limit limit = input->PushLimit(length);
328d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  while (input->BytesUntilLimit() > 0) {
329d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    CType value;
330d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    if (!ReadPrimitive<CType, DeclaredType>(input, &value)) return false;
331d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    values->Add(value);
332d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  }
333d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  input->PopLimit(limit);
334d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  return true;
335d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}
336d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
337d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate <typename CType, enum WireFormatLite::FieldType DeclaredType>
338d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savillebool WireFormatLite::ReadPackedPrimitiveNoInline(io::CodedInputStream* input,
339d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                                 RepeatedField<CType>* values) {
340d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  return ReadPackedPrimitive<CType, DeclaredType>(input, values);
341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline bool WireFormatLite::ReadGroup(int field_number,
345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                      io::CodedInputStream* input,
346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                      MessageLite* value) {
347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!input->IncrementRecursionDepth()) return false;
348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!value->MergePartialFromCodedStream(input)) return false;
349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  input->DecrementRecursionDepth();
350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Make sure the last thing read was an end tag for this group.
351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!input->LastTagWas(MakeTag(field_number, WIRETYPE_END_GROUP))) {
352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return false;
353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return true;
355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline bool WireFormatLite::ReadMessage(io::CodedInputStream* input,
357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                        MessageLite* value) {
358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint32 length;
359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!input->ReadVarint32(&length)) return false;
360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!input->IncrementRecursionDepth()) return false;
361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  io::CodedInputStream::Limit limit = input->PushLimit(length);
362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!value->MergePartialFromCodedStream(input)) return false;
363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Make sure that parsing stopped when the limit was hit, not at an endgroup
364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // tag.
365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!input->ConsumedEntireMessage()) return false;
366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  input->PopLimit(limit);
367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  input->DecrementRecursionDepth();
368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return true;
369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate<typename MessageType>
372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline bool WireFormatLite::ReadGroupNoVirtual(int field_number,
373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                               io::CodedInputStream* input,
374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                               MessageType* value) {
375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!input->IncrementRecursionDepth()) return false;
376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!value->MessageType::MergePartialFromCodedStream(input)) return false;
377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  input->DecrementRecursionDepth();
378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Make sure the last thing read was an end tag for this group.
379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!input->LastTagWas(MakeTag(field_number, WIRETYPE_END_GROUP))) {
380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return false;
381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return true;
383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate<typename MessageType>
385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline bool WireFormatLite::ReadMessageNoVirtual(io::CodedInputStream* input,
386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                 MessageType* value) {
387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint32 length;
388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!input->ReadVarint32(&length)) return false;
389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!input->IncrementRecursionDepth()) return false;
390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  io::CodedInputStream::Limit limit = input->PushLimit(length);
391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!value->MessageType::MergePartialFromCodedStream(input)) return false;
392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Make sure that parsing stopped when the limit was hit, not at an endgroup
393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // tag.
394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!input->ConsumedEntireMessage()) return false;
395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  input->PopLimit(limit);
396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  input->DecrementRecursionDepth();
397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return true;
398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void WireFormatLite::WriteTag(int field_number, WireType type,
403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                     io::CodedOutputStream* output) {
404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  output->WriteTag(MakeTag(field_number, type));
405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void WireFormatLite::WriteInt32NoTag(int32 value,
408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                            io::CodedOutputStream* output) {
409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  output->WriteVarint32SignExtended(value);
410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void WireFormatLite::WriteInt64NoTag(int64 value,
412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                            io::CodedOutputStream* output) {
413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  output->WriteVarint64(static_cast<uint64>(value));
414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void WireFormatLite::WriteUInt32NoTag(uint32 value,
416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                             io::CodedOutputStream* output) {
417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  output->WriteVarint32(value);
418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void WireFormatLite::WriteUInt64NoTag(uint64 value,
420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                             io::CodedOutputStream* output) {
421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  output->WriteVarint64(value);
422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void WireFormatLite::WriteSInt32NoTag(int32 value,
424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                             io::CodedOutputStream* output) {
425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  output->WriteVarint32(ZigZagEncode32(value));
426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void WireFormatLite::WriteSInt64NoTag(int64 value,
428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                             io::CodedOutputStream* output) {
429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  output->WriteVarint64(ZigZagEncode64(value));
430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void WireFormatLite::WriteFixed32NoTag(uint32 value,
432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                              io::CodedOutputStream* output) {
433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  output->WriteLittleEndian32(value);
434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void WireFormatLite::WriteFixed64NoTag(uint64 value,
436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                              io::CodedOutputStream* output) {
437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  output->WriteLittleEndian64(value);
438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void WireFormatLite::WriteSFixed32NoTag(int32 value,
440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                               io::CodedOutputStream* output) {
441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  output->WriteLittleEndian32(static_cast<uint32>(value));
442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void WireFormatLite::WriteSFixed64NoTag(int64 value,
444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                               io::CodedOutputStream* output) {
445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  output->WriteLittleEndian64(static_cast<uint64>(value));
446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void WireFormatLite::WriteFloatNoTag(float value,
448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                            io::CodedOutputStream* output) {
449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  output->WriteLittleEndian32(EncodeFloat(value));
450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void WireFormatLite::WriteDoubleNoTag(double value,
452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                             io::CodedOutputStream* output) {
453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  output->WriteLittleEndian64(EncodeDouble(value));
454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void WireFormatLite::WriteBoolNoTag(bool value,
456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                           io::CodedOutputStream* output) {
457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  output->WriteVarint32(value ? 1 : 0);
458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void WireFormatLite::WriteEnumNoTag(int value,
460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                           io::CodedOutputStream* output) {
461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  output->WriteVarint32SignExtended(value);
462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate<typename MessageType>
465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void WireFormatLite::WriteGroupNoVirtual(int field_number,
466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                const MessageType& value,
467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                io::CodedOutputStream* output) {
468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  WriteTag(field_number, WIRETYPE_START_GROUP, output);
469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  value.MessageType::SerializeWithCachedSizes(output);
470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  WriteTag(field_number, WIRETYPE_END_GROUP, output);
471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate<typename MessageType>
473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline void WireFormatLite::WriteMessageNoVirtual(int field_number,
474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                const MessageType& value,
475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                io::CodedOutputStream* output) {
476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  WriteTag(field_number, WIRETYPE_LENGTH_DELIMITED, output);
477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  output->WriteVarint32(value.MessageType::GetCachedSize());
478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  value.MessageType::SerializeWithCachedSizes(output);
479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteTagToArray(int field_number,
484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                              WireType type,
485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                              uint8* target) {
486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::WriteTagToArray(MakeTag(field_number, type),
487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                target);
488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteInt32NoTagToArray(int32 value,
491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                     uint8* target) {
492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::WriteVarint32SignExtendedToArray(value, target);
493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteInt64NoTagToArray(int64 value,
495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                     uint8* target) {
496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::WriteVarint64ToArray(
497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      static_cast<uint64>(value), target);
498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteUInt32NoTagToArray(uint32 value,
500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                      uint8* target) {
501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::WriteVarint32ToArray(value, target);
502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteUInt64NoTagToArray(uint64 value,
504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                      uint8* target) {
505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::WriteVarint64ToArray(value, target);
506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteSInt32NoTagToArray(int32 value,
508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                      uint8* target) {
509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::WriteVarint32ToArray(ZigZagEncode32(value),
510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                     target);
511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteSInt64NoTagToArray(int64 value,
513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                      uint8* target) {
514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::WriteVarint64ToArray(ZigZagEncode64(value),
515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                     target);
516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteFixed32NoTagToArray(uint32 value,
518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                       uint8* target) {
519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::WriteLittleEndian32ToArray(value, target);
520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteFixed64NoTagToArray(uint64 value,
522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                       uint8* target) {
523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::WriteLittleEndian64ToArray(value, target);
524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteSFixed32NoTagToArray(int32 value,
526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                        uint8* target) {
527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::WriteLittleEndian32ToArray(
528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      static_cast<uint32>(value), target);
529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteSFixed64NoTagToArray(int64 value,
531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                        uint8* target) {
532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::WriteLittleEndian64ToArray(
533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      static_cast<uint64>(value), target);
534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteFloatNoTagToArray(float value,
536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                     uint8* target) {
537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::WriteLittleEndian32ToArray(EncodeFloat(value),
538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                           target);
539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteDoubleNoTagToArray(double value,
541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                      uint8* target) {
542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::WriteLittleEndian64ToArray(EncodeDouble(value),
543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                           target);
544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteBoolNoTagToArray(bool value,
546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                    uint8* target) {
547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::WriteVarint32ToArray(value ? 1 : 0, target);
548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteEnumNoTagToArray(int value,
550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                    uint8* target) {
551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::WriteVarint32SignExtendedToArray(value, target);
552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteInt32ToArray(int field_number,
555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                int32 value,
556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                uint8* target) {
557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return WriteInt32NoTagToArray(value, target);
559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteInt64ToArray(int field_number,
561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                int64 value,
562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                uint8* target) {
563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return WriteInt64NoTagToArray(value, target);
565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteUInt32ToArray(int field_number,
567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                 uint32 value,
568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                 uint8* target) {
569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return WriteUInt32NoTagToArray(value, target);
571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteUInt64ToArray(int field_number,
573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                 uint64 value,
574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                 uint8* target) {
575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return WriteUInt64NoTagToArray(value, target);
577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteSInt32ToArray(int field_number,
579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                 int32 value,
580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                 uint8* target) {
581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return WriteSInt32NoTagToArray(value, target);
583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteSInt64ToArray(int field_number,
585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                 int64 value,
586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                 uint8* target) {
587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return WriteSInt64NoTagToArray(value, target);
589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteFixed32ToArray(int field_number,
591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                  uint32 value,
592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                  uint8* target) {
593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = WriteTagToArray(field_number, WIRETYPE_FIXED32, target);
594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return WriteFixed32NoTagToArray(value, target);
595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteFixed64ToArray(int field_number,
597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                  uint64 value,
598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                  uint8* target) {
599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = WriteTagToArray(field_number, WIRETYPE_FIXED64, target);
600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return WriteFixed64NoTagToArray(value, target);
601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteSFixed32ToArray(int field_number,
603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                   int32 value,
604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                   uint8* target) {
605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = WriteTagToArray(field_number, WIRETYPE_FIXED32, target);
606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return WriteSFixed32NoTagToArray(value, target);
607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteSFixed64ToArray(int field_number,
609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                   int64 value,
610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                   uint8* target) {
611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = WriteTagToArray(field_number, WIRETYPE_FIXED64, target);
612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return WriteSFixed64NoTagToArray(value, target);
613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteFloatToArray(int field_number,
615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                float value,
616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                uint8* target) {
617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = WriteTagToArray(field_number, WIRETYPE_FIXED32, target);
618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return WriteFloatNoTagToArray(value, target);
619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteDoubleToArray(int field_number,
621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                 double value,
622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                 uint8* target) {
623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = WriteTagToArray(field_number, WIRETYPE_FIXED64, target);
624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return WriteDoubleNoTagToArray(value, target);
625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteBoolToArray(int field_number,
627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                               bool value,
628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                               uint8* target) {
629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return WriteBoolNoTagToArray(value, target);
631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteEnumToArray(int field_number,
633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                               int value,
634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                               uint8* target) {
635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return WriteEnumNoTagToArray(value, target);
637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteStringToArray(int field_number,
640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                 const string& value,
641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                 uint8* target) {
642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // String is for UTF-8 text only
643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // WARNING:  In wire_format.cc, both strings and bytes are handled by
644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   WriteString() to avoid code duplication.  If the implementations become
645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   different, you will need to update that usage.
646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target);
647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = io::CodedOutputStream::WriteVarint32ToArray(value.size(), target);
648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::WriteStringToArray(value, target);
649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteBytesToArray(int field_number,
651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                const string& value,
652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                uint8* target) {
653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target);
654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = io::CodedOutputStream::WriteVarint32ToArray(value.size(), target);
655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::WriteStringToArray(value, target);
656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteGroupToArray(int field_number,
660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                const MessageLite& value,
661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                uint8* target) {
662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = WriteTagToArray(field_number, WIRETYPE_START_GROUP, target);
663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = value.SerializeWithCachedSizesToArray(target);
664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return WriteTagToArray(field_number, WIRETYPE_END_GROUP, target);
665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteMessageToArray(int field_number,
667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                  const MessageLite& value,
668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                                  uint8* target) {
669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target);
670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = io::CodedOutputStream::WriteVarint32ToArray(
671fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    value.GetCachedSize(), target);
672fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return value.SerializeWithCachedSizesToArray(target);
673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
674fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
675fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate<typename MessageType>
676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteGroupNoVirtualToArray(
677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int field_number, const MessageType& value, uint8* target) {
678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = WriteTagToArray(field_number, WIRETYPE_START_GROUP, target);
679fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = value.MessageType::SerializeWithCachedSizesToArray(target);
680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return WriteTagToArray(field_number, WIRETYPE_END_GROUP, target);
681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate<typename MessageType>
683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline uint8* WireFormatLite::WriteMessageNoVirtualToArray(
684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    int field_number, const MessageType& value, uint8* target) {
685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target);
686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  target = io::CodedOutputStream::WriteVarint32ToArray(
687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    value.MessageType::GetCachedSize(), target);
688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return value.MessageType::SerializeWithCachedSizesToArray(target);
689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int WireFormatLite::Int32Size(int32 value) {
694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::VarintSize32SignExtended(value);
695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int WireFormatLite::Int64Size(int64 value) {
697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::VarintSize64(static_cast<uint64>(value));
698fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
699fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int WireFormatLite::UInt32Size(uint32 value) {
700fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::VarintSize32(value);
701fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int WireFormatLite::UInt64Size(uint64 value) {
703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::VarintSize64(value);
704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int WireFormatLite::SInt32Size(int32 value) {
706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::VarintSize32(ZigZagEncode32(value));
707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int WireFormatLite::SInt64Size(int64 value) {
709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::VarintSize64(ZigZagEncode64(value));
710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int WireFormatLite::EnumSize(int value) {
712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::VarintSize32SignExtended(value);
713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int WireFormatLite::StringSize(const string& value) {
716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::VarintSize32(value.size()) +
717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville         value.size();
718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int WireFormatLite::BytesSize(const string& value) {
720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::VarintSize32(value.size()) +
721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville         value.size();
722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int WireFormatLite::GroupSize(const MessageLite& value) {
726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return value.ByteSize();
727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int WireFormatLite::MessageSize(const MessageLite& value) {
729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int size = value.ByteSize();
730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::VarintSize32(size) + size;
731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate<typename MessageType>
734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int WireFormatLite::GroupSizeNoVirtual(const MessageType& value) {
735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return value.MessageType::ByteSize();
736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate<typename MessageType>
738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline int WireFormatLite::MessageSizeNoVirtual(const MessageType& value) {
739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int size = value.MessageType::ByteSize();
740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return io::CodedOutputStream::VarintSize32(size) + size;
741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace internal
744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_INL_H__
748