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_message_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/stubs/strutil.h>
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace compiler {
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace cpp {
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace {
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid SetMessageVariables(const FieldDescriptor* descriptor,
48a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                         map<string, string>* variables,
49a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                         const Options& options) {
50a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  SetCommonFieldVariables(descriptor, variables, options);
51d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  (*variables)["type"] = FieldMessageTypeName(descriptor);
52d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  (*variables)["stream_writer"] = (*variables)["declared_type"] +
53d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      (HasFastArraySerialization(descriptor->message_type()->file()) ?
54d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville       "MaybeToArray" :
55d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville       "");
56a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // NOTE: Escaped here to unblock proto1->proto2 migration.
57a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // TODO(liujisi): Extend this to apply for other conflicting methods.
58a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["release_name"] =
59a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SafeFunctionName(descriptor->containing_type(),
60a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                       descriptor, "release_");
61a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["full_name"] = descriptor->full_name();
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleMessageFieldGenerator::
69a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonMessageFieldGenerator(const FieldDescriptor* descriptor,
70a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                      const Options& options)
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  : descriptor_(descriptor) {
72a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  SetMessageVariables(descriptor, &variables_, options);
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleMessageFieldGenerator::~MessageFieldGenerator() {}
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator::
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGeneratePrivateMembers(io::Printer* printer) const {
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_, "$type$* $name$_;\n");
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator::
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateAccessorDeclarations(io::Printer* printer) const {
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline const $type$& $name$() const$deprecation$;\n"
86a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "inline $type$* mutable_$name$()$deprecation$;\n"
87a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "inline $type$* $release_name$()$deprecation$;\n"
88a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "inline void set_allocated_$name$($type$* $name$)$deprecation$;\n");
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator::
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateInlineAccessorDefinitions(io::Printer* printer) const {
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline const $type$& $classname$::$name$() const {\n"
95a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  // @@protoc_insertion_point(field_get:$full_name$)\n");
96a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
97a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintHandlingOptionalStaticInitializers(
98a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    variables_, descriptor_->file(), printer,
99a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // With static initializers.
100a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return $name$_ != NULL ? *$name$_ : *default_instance_->$name$_;\n",
101a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // Without.
102a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return $name$_ != NULL ? *$name$_ : *default_instance().$name$_;\n");
103a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
104a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline $type$* $classname$::mutable_$name$() {\n"
107a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  set_has_$name$();\n"
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  if ($name$_ == NULL) $name$_ = new $type$;\n"
109a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return $name$_;\n"
111a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n"
112a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "inline $type$* $classname$::$release_name$() {\n"
113a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  clear_has_$name$();\n"
114a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $type$* temp = $name$_;\n"
115a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $name$_ = NULL;\n"
116a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return temp;\n"
117a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n"
118a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "inline void $classname$::set_allocated_$name$($type$* $name$) {\n"
119a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  delete $name$_;\n"
120a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $name$_ = $name$;\n"
121a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  if ($name$) {\n"
122a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    set_has_$name$();\n"
123a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  } else {\n"
124a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    clear_has_$name$();\n"
125a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  }\n"
126a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n"
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator::
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateClearingCode(io::Printer* printer) const {
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "if ($name$_ != NULL) $name$_->$type$::Clear();\n");
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator::
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergingCode(io::Printer* printer) const {
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "mutable_$name$()->$type$::MergeFrom(from.$name$());\n");
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator::
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSwappingCode(io::Printer* printer) const {
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_, "std::swap($name$_, other->$name$_);\n");
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator::
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateConstructorCode(io::Printer* printer) const {
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_, "$name$_ = NULL;\n");
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator::
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergeFromCodedStream(io::Printer* printer) const {
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (descriptor_->type() == FieldDescriptor::TYPE_MESSAGE) {
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n"
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "     input, mutable_$name$()));\n");
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "DO_(::google::protobuf::internal::WireFormatLite::ReadGroupNoVirtual(\n"
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "      $number$, input, mutable_$name$()));\n");
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator::
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizes(io::Printer* printer) const {
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
168d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "::google::protobuf::internal::WireFormatLite::Write$stream_writer$(\n"
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  $number$, this->$name$(), output);\n");
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator::
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "target = ::google::protobuf::internal::WireFormatLite::\n"
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  Write$declared_type$NoVirtualToArray(\n"
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    $number$, this->$name$(), target);\n");
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator::
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateByteSize(io::Printer* printer) const {
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "total_size += $tag_size$ +\n"
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  ::google::protobuf::internal::WireFormatLite::$declared_type$SizeNoVirtual(\n"
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    this->$name$());\n");
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
190a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonMessageOneofFieldGenerator::
191a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonMessageOneofFieldGenerator(const FieldDescriptor* descriptor,
192a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                           const Options& options)
193a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  : MessageFieldGenerator(descriptor, options) {
194a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  SetCommonOneofFieldVariables(descriptor, &variables_);
195a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
196a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
197a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonMessageOneofFieldGenerator::~MessageOneofFieldGenerator() {}
198a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
199a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid MessageOneofFieldGenerator::
200a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateInlineAccessorDefinitions(io::Printer* printer) const {
201a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
202a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "inline const $type$& $classname$::$name$() const {\n"
203a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return has_$name$() ? *$oneof_prefix$$name$_\n"
204a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "                      : $type$::default_instance();\n"
205a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n"
206a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "inline $type$* $classname$::mutable_$name$() {\n"
207a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  if (!has_$name$()) {\n"
208a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    clear_$oneof_name$();\n"
209a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    set_has_$name$();\n"
210a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $oneof_prefix$$name$_ = new $type$;\n"
211a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  }\n"
212a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return $oneof_prefix$$name$_;\n"
213a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n"
214a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "inline $type$* $classname$::$release_name$() {\n"
215a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  if (has_$name$()) {\n"
216a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    clear_has_$oneof_name$();\n"
217a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $type$* temp = $oneof_prefix$$name$_;\n"
218a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $oneof_prefix$$name$_ = NULL;\n"
219a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    return temp;\n"
220a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  } else {\n"
221a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    return NULL;\n"
222a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  }\n"
223a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n"
224a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "inline void $classname$::set_allocated_$name$($type$* $name$) {\n"
225a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  clear_$oneof_name$();\n"
226a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  if ($name$) {\n"
227a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    set_has_$name$();\n"
228a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $oneof_prefix$$name$_ = $name$;\n"
229a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  }\n"
230a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
231a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
232a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
233a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid MessageOneofFieldGenerator::
234a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateClearingCode(io::Printer* printer) const {
235a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // if it is the active field, it cannot be NULL.
236a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
237a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "delete $oneof_prefix$$name$_;\n");
238a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
239a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
240a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid MessageOneofFieldGenerator::
241a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateSwappingCode(io::Printer* printer) const {
242a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Don't print any swapping code. Swapping the union will swap this field.
243a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
244a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
245a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid MessageOneofFieldGenerator::
246a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateConstructorCode(io::Printer* printer) const {
247a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Don't print any constructor code. The field is in a union. We allocate
248a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // space only when this field is used.
249a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
250a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
251a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// ===================================================================
252a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleRepeatedMessageFieldGenerator::
254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonRepeatedMessageFieldGenerator(const FieldDescriptor* descriptor,
255a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                              const Options& options)
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  : descriptor_(descriptor) {
257a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  SetMessageVariables(descriptor, &variables_, options);
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleRepeatedMessageFieldGenerator::~RepeatedMessageFieldGenerator() {}
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator::
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGeneratePrivateMembers(io::Printer* printer) const {
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "::google::protobuf::RepeatedPtrField< $type$ > $name$_;\n");
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator::
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateAccessorDeclarations(io::Printer* printer) const {
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline const $type$& $name$(int index) const$deprecation$;\n"
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline $type$* mutable_$name$(int index)$deprecation$;\n"
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline $type$* add_$name$()$deprecation$;\n");
274d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  printer->Print(variables_,
275d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "inline const ::google::protobuf::RepeatedPtrField< $type$ >&\n"
276d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "    $name$() const$deprecation$;\n"
277d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "inline ::google::protobuf::RepeatedPtrField< $type$ >*\n"
278d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "    mutable_$name$()$deprecation$;\n");
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator::
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateInlineAccessorDefinitions(io::Printer* printer) const {
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline const $type$& $classname$::$name$(int index) const {\n"
285a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  // @@protoc_insertion_point(field_get:$full_name$)\n"
286a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return $name$_.$cppget$(index);\n"
287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline $type$* $classname$::mutable_$name$(int index) {\n"
289a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return $name$_.Mutable(index);\n"
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "inline $type$* $classname$::add_$name$() {\n"
293a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  // @@protoc_insertion_point(field_add:$full_name$)\n"
294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return $name$_.Add();\n"
295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
296d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  printer->Print(variables_,
297d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "inline const ::google::protobuf::RepeatedPtrField< $type$ >&\n"
298d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "$classname$::$name$() const {\n"
299a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  // @@protoc_insertion_point(field_list:$full_name$)\n"
300d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  return $name$_;\n"
301d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "}\n"
302d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "inline ::google::protobuf::RepeatedPtrField< $type$ >*\n"
303d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "$classname$::mutable_$name$() {\n"
304a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  // @@protoc_insertion_point(field_mutable_list:$full_name$)\n"
305d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  return &$name$_;\n"
306d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "}\n");
307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator::
310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateClearingCode(io::Printer* printer) const {
311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_, "$name$_.Clear();\n");
312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator::
315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergingCode(io::Printer* printer) const {
316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_, "$name$_.MergeFrom(from.$name$_);\n");
317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator::
320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSwappingCode(io::Printer* printer) const {
321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_, "$name$_.Swap(&other->$name$_);\n");
322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator::
325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateConstructorCode(io::Printer* printer) const {
326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Not needed for repeated fields.
327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator::
330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergeFromCodedStream(io::Printer* printer) const {
331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (descriptor_->type() == FieldDescriptor::TYPE_MESSAGE) {
332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n"
334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "      input, add_$name$()));\n");
335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "DO_(::google::protobuf::internal::WireFormatLite::ReadGroupNoVirtual(\n"
338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "      $number$, input, add_$name$()));\n");
339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator::
343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizes(io::Printer* printer) const {
344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "for (int i = 0; i < this->$name$_size(); i++) {\n"
346d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  ::google::protobuf::internal::WireFormatLite::Write$stream_writer$(\n"
347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    $number$, this->$name$(i), output);\n"
348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator::
352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "for (int i = 0; i < this->$name$_size(); i++) {\n"
355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  target = ::google::protobuf::internal::WireFormatLite::\n"
356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    Write$declared_type$NoVirtualToArray(\n"
357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "      $number$, this->$name$(i), target);\n"
358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator::
362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateByteSize(io::Printer* printer) const {
363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "total_size += $tag_size$ * this->$name$_size();\n"
365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "for (int i = 0; i < this->$name$_size(); i++) {\n"
366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  total_size +=\n"
367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    ::google::protobuf::internal::WireFormatLite::$declared_type$SizeNoVirtual(\n"
368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "      this->$name$(i));\n"
369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace cpp
373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace compiler
374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
376