1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc.  All rights reserved.
3afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson// https://developers.google.com/protocol-buffers/
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//  Based on original Protocol Buffers design by
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Sanjay Ghemawat, Jeff Dean, and others.
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/compiler/cpp/cpp_primitive_field.h>
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/compiler/cpp/cpp_helpers.h>
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/io/printer.h>
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/wire_format.h>
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/strutil.h>
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace compiler {
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace cpp {
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing internal::WireFormatLite;
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace {
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// For encodings with fixed sizes, returns that size in bytes.  Otherwise
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// returns -1.
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleint FixedSize(FieldDescriptor::Type type) {
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  switch (type) {
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_INT32   : return -1;
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_INT64   : return -1;
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_UINT32  : return -1;
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_UINT64  : return -1;
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_SINT32  : return -1;
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_SINT64  : return -1;
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_FIXED32 : return WireFormatLite::kFixed32Size;
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_FIXED64 : return WireFormatLite::kFixed64Size;
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_SFIXED32: return WireFormatLite::kSFixed32Size;
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_SFIXED64: return WireFormatLite::kSFixed64Size;
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_FLOAT   : return WireFormatLite::kFloatSize;
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_DOUBLE  : return WireFormatLite::kDoubleSize;
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_BOOL    : return WireFormatLite::kBoolSize;
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_ENUM    : return -1;
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_STRING  : return -1;
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_BYTES   : return -1;
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_GROUP   : return -1;
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_MESSAGE : return -1;
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // No default because we want the compiler to complain if any new
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // types are added.
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_LOG(FATAL) << "Can't get here.";
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return -1;
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid SetPrimitiveVariables(const FieldDescriptor* descriptor,
83a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                           map<string, string>* variables,
84a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                           const Options& options) {
85a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  SetCommonFieldVariables(descriptor, variables, options);
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  (*variables)["type"] = PrimitiveTypeName(descriptor->cpp_type());
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  (*variables)["default"] = DefaultValue(descriptor);
88d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  (*variables)["tag"] = SimpleItoa(internal::WireFormat::MakeTag(descriptor));
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int fixed_size = FixedSize(descriptor->type());
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (fixed_size != -1) {
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    (*variables)["fixed_size"] = SimpleItoa(fixed_size);
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
93d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  (*variables)["wire_format_field_type"] =
94d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      "::google::protobuf::internal::WireFormatLite::" + FieldDescriptorProto_Type_Name(
95d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville          static_cast<FieldDescriptorProto_Type>(descriptor->type()));
96a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["full_name"] = descriptor->full_name();
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePrimitiveFieldGenerator::
104a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPrimitiveFieldGenerator(const FieldDescriptor* descriptor,
105a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                        const Options& options)
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  : descriptor_(descriptor) {
107a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  SetPrimitiveVariables(descriptor, &variables_, options);
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePrimitiveFieldGenerator::~PrimitiveFieldGenerator() {}
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid PrimitiveFieldGenerator::
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGeneratePrivateMembers(io::Printer* printer) const {
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_, "$type$ $name$_;\n");
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid PrimitiveFieldGenerator::
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateAccessorDeclarations(io::Printer* printer) const {
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline $type$ $name$() const$deprecation$;\n"
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline void set_$name$($type$ value)$deprecation$;\n");
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid PrimitiveFieldGenerator::
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateInlineAccessorDefinitions(io::Printer* printer) const {
126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline $type$ $classname$::$name$() const {\n"
128a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  // @@protoc_insertion_point(field_get:$full_name$)\n"
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return $name$_;\n"
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline void $classname$::set_$name$($type$ value) {\n"
132a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  set_has_$name$();\n"
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  $name$_ = value;\n"
134a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  // @@protoc_insertion_point(field_set:$full_name$)\n"
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid PrimitiveFieldGenerator::
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateClearingCode(io::Printer* printer) const {
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_, "$name$_ = $default$;\n");
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid PrimitiveFieldGenerator::
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergingCode(io::Printer* printer) const {
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_, "set_$name$(from.$name$());\n");
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid PrimitiveFieldGenerator::
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSwappingCode(io::Printer* printer) const {
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_, "std::swap($name$_, other->$name$_);\n");
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid PrimitiveFieldGenerator::
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateConstructorCode(io::Printer* printer) const {
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_, "$name$_ = $default$;\n");
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid PrimitiveFieldGenerator::
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergeFromCodedStream(io::Printer* printer) const {
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
161d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n"
162d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "         $type$, $wire_format_field_type$>(\n"
163d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "       input, &$name$_)));\n"
164a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "set_has_$name$();\n");
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid PrimitiveFieldGenerator::
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizes(io::Printer* printer) const {
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "::google::protobuf::internal::WireFormatLite::Write$declared_type$("
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "$number$, this->$name$(), output);\n");
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid PrimitiveFieldGenerator::
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "target = ::google::protobuf::internal::WireFormatLite::Write$declared_type$ToArray("
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "$number$, this->$name$(), target);\n");
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid PrimitiveFieldGenerator::
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateByteSize(io::Printer* printer) const {
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int fixed_size = FixedSize(descriptor_->type());
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (fixed_size == -1) {
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "total_size += $tag_size$ +\n"
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  ::google::protobuf::internal::WireFormatLite::$declared_type$Size(\n"
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    this->$name$());\n");
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "total_size += $tag_size$ + $fixed_size$;\n");
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
197a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPrimitiveOneofFieldGenerator::
198a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPrimitiveOneofFieldGenerator(const FieldDescriptor* descriptor,
199a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                             const Options& options)
200a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  : PrimitiveFieldGenerator(descriptor, options) {
201a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  SetCommonOneofFieldVariables(descriptor, &variables_);
202a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
203a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
204a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonPrimitiveOneofFieldGenerator::~PrimitiveOneofFieldGenerator() {}
205a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
206a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid PrimitiveOneofFieldGenerator::
207a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateInlineAccessorDefinitions(io::Printer* printer) const {
208a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
209a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "inline $type$ $classname$::$name$() const {\n"
210a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  if (has_$name$()) {\n"
211a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    return $oneof_prefix$$name$_;\n"
212a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  }\n"
213a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return $default$;\n"
214a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n"
215a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "inline void $classname$::set_$name$($type$ value) {\n"
216a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  if (!has_$name$()) {\n"
217a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    clear_$oneof_name$();\n"
218a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    set_has_$name$();\n"
219a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  }\n"
220a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $oneof_prefix$$name$_ = value;\n"
221a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
222a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
223a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
224a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid PrimitiveOneofFieldGenerator::
225a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateClearingCode(io::Printer* printer) const {
226a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_, "$oneof_prefix$$name$_ = $default$;\n");
227a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
228a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
229a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid PrimitiveOneofFieldGenerator::
230a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateSwappingCode(io::Printer* printer) const {
231a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Don't print any swapping code. Swapping the union will swap this field.
232a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
233a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
234a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid PrimitiveOneofFieldGenerator::
235a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateConstructorCode(io::Printer* printer) const {
236a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(
237a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      variables_,
238a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "  $classname$_default_oneof_instance_->$name$_ = $default$;\n");
239a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
240a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
241a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid PrimitiveOneofFieldGenerator::
242a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateMergeFromCodedStream(io::Printer* printer) const {
243a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
244a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "clear_$oneof_name$();\n"
245a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n"
246a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "         $type$, $wire_format_field_type$>(\n"
247a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "       input, &$oneof_prefix$$name$_)));\n"
248a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "set_has_$name$();\n");
249a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
250a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
251a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// ===================================================================
252a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleRepeatedPrimitiveFieldGenerator::
254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonRepeatedPrimitiveFieldGenerator(const FieldDescriptor* descriptor,
255a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                const Options& options)
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  : descriptor_(descriptor) {
257a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  SetPrimitiveVariables(descriptor, &variables_, options);
258d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
259d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (descriptor->options().packed()) {
260d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    variables_["packed_reader"] = "ReadPackedPrimitive";
261d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    variables_["repeated_reader"] = "ReadRepeatedPrimitiveNoInline";
262d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  } else {
263d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    variables_["packed_reader"] = "ReadPackedPrimitiveNoInline";
264d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    variables_["repeated_reader"] = "ReadRepeatedPrimitive";
265d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  }
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleRepeatedPrimitiveFieldGenerator::~RepeatedPrimitiveFieldGenerator() {}
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedPrimitiveFieldGenerator::
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGeneratePrivateMembers(io::Printer* printer) const {
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "::google::protobuf::RepeatedField< $type$ > $name$_;\n");
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (descriptor_->options().packed() && HasGeneratedMethods(descriptor_->file())) {
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "mutable int _$name$_cached_byte_size_;\n");
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedPrimitiveFieldGenerator::
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateAccessorDeclarations(io::Printer* printer) const {
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline $type$ $name$(int index) const$deprecation$;\n"
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline void set_$name$(int index, $type$ value)$deprecation$;\n"
285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline void add_$name$($type$ value)$deprecation$;\n");
286d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  printer->Print(variables_,
287d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "inline const ::google::protobuf::RepeatedField< $type$ >&\n"
288d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "    $name$() const$deprecation$;\n"
289d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "inline ::google::protobuf::RepeatedField< $type$ >*\n"
290d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "    mutable_$name$()$deprecation$;\n");
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedPrimitiveFieldGenerator::
294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateInlineAccessorDefinitions(io::Printer* printer) const {
295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline $type$ $classname$::$name$(int index) const {\n"
297a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  // @@protoc_insertion_point(field_get:$full_name$)\n"
298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return $name$_.Get(index);\n"
299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline void $classname$::set_$name$(int index, $type$ value) {\n"
301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  $name$_.Set(index, value);\n"
302a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  // @@protoc_insertion_point(field_set:$full_name$)\n"
303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline void $classname$::add_$name$($type$ value) {\n"
305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  $name$_.Add(value);\n"
306a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  // @@protoc_insertion_point(field_add:$full_name$)\n"
307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
308d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  printer->Print(variables_,
309d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "inline const ::google::protobuf::RepeatedField< $type$ >&\n"
310d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "$classname$::$name$() const {\n"
311a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  // @@protoc_insertion_point(field_list:$full_name$)\n"
312d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  return $name$_;\n"
313d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "}\n"
314d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "inline ::google::protobuf::RepeatedField< $type$ >*\n"
315d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "$classname$::mutable_$name$() {\n"
316a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  // @@protoc_insertion_point(field_mutable_list:$full_name$)\n"
317d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  return &$name$_;\n"
318d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "}\n");
319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedPrimitiveFieldGenerator::
322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateClearingCode(io::Printer* printer) const {
323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_, "$name$_.Clear();\n");
324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedPrimitiveFieldGenerator::
327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergingCode(io::Printer* printer) const {
328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_, "$name$_.MergeFrom(from.$name$_);\n");
329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedPrimitiveFieldGenerator::
332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSwappingCode(io::Printer* printer) const {
333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_, "$name$_.Swap(&other->$name$_);\n");
334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedPrimitiveFieldGenerator::
337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateConstructorCode(io::Printer* printer) const {
338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Not needed for repeated fields.
339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedPrimitiveFieldGenerator::
342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergeFromCodedStream(io::Printer* printer) const {
343d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  printer->Print(variables_,
344d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "DO_((::google::protobuf::internal::WireFormatLite::$repeated_reader$<\n"
345d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "         $type$, $wire_format_field_type$>(\n"
346d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "       $tag_size$, $tag$, input, this->mutable_$name$())));\n");
347d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}
348d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
349d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savillevoid RepeatedPrimitiveFieldGenerator::
350d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleGenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const {
351d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  printer->Print(variables_,
352d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "DO_((::google::protobuf::internal::WireFormatLite::$packed_reader$<\n"
353d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "         $type$, $wire_format_field_type$>(\n"
354d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "       input, this->mutable_$name$())));\n");
355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedPrimitiveFieldGenerator::
358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizes(io::Printer* printer) const {
359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (descriptor_->options().packed()) {
360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Write the tag and the size.
361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "if (this->$name$_size() > 0) {\n"
363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  ::google::protobuf::internal::WireFormatLite::WriteTag("
364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          "$number$, "
365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          "::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, "
366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          "output);\n"
367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  output->WriteVarint32(_$name$_cached_byte_size_);\n"
368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "}\n");
369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "for (int i = 0; i < this->$name$_size(); i++) {\n");
372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (descriptor_->options().packed()) {
373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  ::google::protobuf::internal::WireFormatLite::Write$declared_type$NoTag(\n"
375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    this->$name$(i), output);\n");
376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  ::google::protobuf::internal::WireFormatLite::Write$declared_type$(\n"
379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    $number$, this->$name$(i), output);\n");
380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print("}\n");
382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedPrimitiveFieldGenerator::
385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (descriptor_->options().packed()) {
387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Write the tag and the size.
388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "if (this->$name$_size() > 0) {\n"
390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  target = ::google::protobuf::internal::WireFormatLite::WriteTagToArray(\n"
391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    $number$,\n"
392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED,\n"
393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    target);\n"
394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  target = ::google::protobuf::io::CodedOutputStream::WriteVarint32ToArray(\n"
395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    _$name$_cached_byte_size_, target);\n"
396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "}\n");
397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "for (int i = 0; i < this->$name$_size(); i++) {\n");
400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (descriptor_->options().packed()) {
401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  target = ::google::protobuf::internal::WireFormatLite::\n"
403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    Write$declared_type$NoTagToArray(this->$name$(i), target);\n");
404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  target = ::google::protobuf::internal::WireFormatLite::\n"
407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    Write$declared_type$ToArray($number$, this->$name$(i), target);\n");
408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print("}\n");
410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedPrimitiveFieldGenerator::
413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateByteSize(io::Printer* printer) const {
414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "{\n"
416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  int data_size = 0;\n");
417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Indent();
418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int fixed_size = FixedSize(descriptor_->type());
419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (fixed_size == -1) {
420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "for (int i = 0; i < this->$name$_size(); i++) {\n"
422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  data_size += ::google::protobuf::internal::WireFormatLite::\n"
423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    $declared_type$Size(this->$name$(i));\n"
424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "}\n");
425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "data_size = $fixed_size$ * this->$name$_size();\n");
428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (descriptor_->options().packed()) {
431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "if (data_size > 0) {\n"
433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  total_size += $tag_size$ +\n"
434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "    ::google::protobuf::internal::WireFormatLite::Int32Size(data_size);\n"
435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "}\n"
436a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n"
437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "_$name$_cached_byte_size_ = data_size;\n"
438a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "GOOGLE_SAFE_CONCURRENT_WRITES_END();\n"
439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "total_size += data_size;\n");
440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "total_size += $tag_size$ * this->$name$_size() + data_size;\n");
443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Outdent();
445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print("}\n");
446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace cpp
449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace compiler
450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
452