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);
52b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (descriptor->options().weak() || !descriptor->containing_oneof()) {
53b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*variables)["non_null_ptr_to_name"] =
54b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        StrCat("this->", (*variables)["name"], "_");
55b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
56b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  (*variables)["stream_writer"] =
57b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      (*variables)["declared_type"] +
58b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      (HasFastArraySerialization(descriptor->message_type()->file(), options)
59b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer           ? "MaybeToArray"
60b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer           : "");
61a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // NOTE: Escaped here to unblock proto1->proto2 migration.
62a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // TODO(liujisi): Extend this to apply for other conflicting methods.
63a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["release_name"] =
64a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      SafeFunctionName(descriptor->containing_type(),
65a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                       descriptor, "release_");
66a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["full_name"] = descriptor->full_name();
67b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (options.proto_h && IsFieldDependent(descriptor)) {
68b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*variables)["dependent_type"] = "T::" + DependentTypeName(descriptor);
69b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*variables)["dependent_typename"] =
70b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "typename T::" + DependentTypeName(descriptor);
71b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else {
72b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*variables)["dependent_type"] = FieldMessageTypeName(descriptor);
73b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    (*variables)["dependent_typename"] = FieldMessageTypeName(descriptor);
74b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
81b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerMessageFieldGenerator::MessageFieldGenerator(const FieldDescriptor* descriptor,
82b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                                             const Options& options)
83b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    : FieldGenerator(options),
84b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      descriptor_(descriptor),
85b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      dependent_field_(options.proto_h && IsFieldDependent(descriptor)) {
86a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  SetMessageVariables(descriptor, &variables_, options);
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleMessageFieldGenerator::~MessageFieldGenerator() {}
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator::
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGeneratePrivateMembers(io::Printer* printer) const {
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_, "$type$* $name$_;\n");
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator::
97b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateGetterDeclaration(io::Printer* printer) const {
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
99b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$deprecated_attr$const $type$& $name$() const;\n");
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator::
103b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateDependentAccessorDeclarations(io::Printer* printer) const {
104b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!dependent_field_) {
105b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return;
106b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
107b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Arena manipulation code is out-of-line in the derived message class.
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
109b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$deprecated_attr$$type$* mutable_$name$();\n"
110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$deprecated_attr$$type$* $release_name$();\n"
111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$deprecated_attr$void set_allocated_$name$($type$* $name$);\n");
112b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
113b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
114b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid MessageFieldGenerator::
115b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateAccessorDeclarations(io::Printer* printer) const {
116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (SupportsArenas(descriptor_)) {
117b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables_,
118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer       "private:\n"
119b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer       "void _slow_mutable_$name$();\n");
120b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    if (SupportsArenas(descriptor_->message_type())) {
121b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      printer->Print(variables_,
122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer       "void _slow_set_allocated_$name$(\n"
123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer       "    ::google::protobuf::Arena* message_arena, $type$** $name$);\n");
124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
125b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables_,
126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer       "$type$* _slow_$release_name$();\n"
127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer       "public:\n");
128b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
129b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  GenerateGetterDeclaration(printer);
130b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!dependent_field_) {
131b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables_,
132b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$deprecated_attr$$type$* mutable_$name$();\n"
133b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$deprecated_attr$$type$* $release_name$();\n"
134b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$deprecated_attr$void set_allocated_$name$($type$* $name$);\n");
135b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
136b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (SupportsArenas(descriptor_)) {
137b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables_,
138b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$deprecated_attr$$type$* unsafe_arena_release_$name$();\n"
139b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$deprecated_attr$void unsafe_arena_set_allocated_$name$(\n"
140b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $type$* $name$);\n");
141b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
142b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
143b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
144b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid MessageFieldGenerator::GenerateNonInlineAccessorDefinitions(
145b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    io::Printer* printer) const {
146b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (SupportsArenas(descriptor_)) {
147b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables_,
148b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "void $classname$::_slow_mutable_$name$() {\n");
149b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      if (SupportsArenas(descriptor_->message_type())) {
150b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        printer->Print(variables_,
151b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "  $name$_ = ::google::protobuf::Arena::CreateMessage< $type$ >(\n"
152b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "      GetArenaNoVirtual());\n");
153b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      } else {
154b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        printer->Print(variables_,
155b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "  $name$_ = ::google::protobuf::Arena::Create< $type$ >(\n"
156b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "      GetArenaNoVirtual());\n");
157b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      }
158b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables_,
159b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n"
160b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$type$* $classname$::_slow_$release_name$() {\n"
161b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if ($name$_ == NULL) {\n"
162b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    return NULL;\n"
163b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  } else {\n"
164b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $type$* temp = new $type$;\n"
165b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    temp->MergeFrom(*$name$_);\n"
166b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $name$_ = NULL;\n"
167b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    return temp;\n"
168b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
169b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n"
170b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$type$* $classname$::unsafe_arena_release_$name$() {\n"
171b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_unsafe_arena_release:$full_name$)\n"
172b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $clear_hasbit$\n"
173b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $type$* temp = $name$_;\n"
174b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $name$_ = NULL;\n"
175b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return temp;\n"
176b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
177b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    if (SupportsArenas(descriptor_->message_type())) {
178b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // NOTE: the same logic is mirrored in weak_message_field.cc. Any
179b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // arena-related semantics changes should be made in both places.
180b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      printer->Print(variables_,
181b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "void $classname$::_slow_set_allocated_$name$(\n"
182b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "    ::google::protobuf::Arena* message_arena, $type$** $name$) {\n"
183b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "    if (message_arena != NULL && \n"
184b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "        ::google::protobuf::Arena::GetArena(*$name$) == NULL) {\n"
185b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "      message_arena->Own(*$name$);\n"
186b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "    } else if (message_arena !=\n"
187b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "               ::google::protobuf::Arena::GetArena(*$name$)) {\n"
188b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "      $type$* new_$name$ = \n"
189b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "            ::google::protobuf::Arena::CreateMessage< $type$ >(\n"
190b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "            message_arena);\n"
191b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "      new_$name$->CopyFrom(**$name$);\n"
192b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "      *$name$ = new_$name$;\n"
193b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "    }\n"
194b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "}\n");
195b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
196b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables_,
197b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "void $classname$::unsafe_arena_set_allocated_$name$(\n"
198b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $type$* $name$) {\n"
199b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // If we're not on an arena, free whatever we were holding before.
200b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // (If we are on arena, we can just forget the earlier pointer.)
201b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if (GetArenaNoVirtual() == NULL) {\n"
202b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    delete $name$_;\n"
203b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
204b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $name$_ = $name$;\n"
205b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if ($name$) {\n"
206b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $set_hasbit$\n"
207b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  } else {\n"
208b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $clear_hasbit$\n"
209b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
210b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_unsafe_arena_set_allocated"
211b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      ":$full_name$)\n"
212b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
213b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
214b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
215b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
216b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid MessageFieldGenerator::
217b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateDependentInlineAccessorDefinitions(io::Printer* printer) const {
218b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!dependent_field_) {
219b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return;
220b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
221b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
222b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  map<string, string> variables(variables_);
223b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // For the CRTP base class, all mutation methods are dependent, and so
224b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // they must be in the header.
225b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["dependent_classname"] =
226b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      DependentBaseClassTemplateName(descriptor_->containing_type()) + "<T>";
227b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["this_message"] = DependentBaseDownCast();
228b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!variables["set_hasbit"].empty()) {
229b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    variables["set_hasbit"] =
230b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        variables["this_message"] + variables["set_hasbit"];
231b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
232b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!variables["clear_hasbit"].empty()) {
233b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    variables["clear_hasbit"] =
234b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        variables["this_message"] + variables["clear_hasbit"];
235b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
236b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
237b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (SupportsArenas(descriptor_)) {
238b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables,
239b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "template <class T>\n"
240b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "inline $type$* $dependent_classname$::mutable_$name$() {\n"
241b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $set_hasbit$\n"
242b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $dependent_typename$*& $name$_ = $this_message$$name$_;\n"
243b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if ($name$_ == NULL) {\n"
244b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $this_message$_slow_mutable_$name$();\n"
245b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
246b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
247b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return $name$_;\n"
248b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n"
249b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "template <class T>\n"
250b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "inline $type$* $dependent_classname$::$release_name$() {\n"
251b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_release:$full_name$)\n"
252b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $dependent_typename$*& $name$_ = $this_message$$name$_;\n"
253b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $clear_hasbit$\n"
254b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if ($this_message$GetArenaNoVirtual() != NULL) {\n"
255b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    return $this_message$_slow_$release_name$();\n"
256b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  } else {\n"
257b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $dependent_typename$* temp = $name$_;\n"
258b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $name$_ = NULL;\n"
259b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    return temp;\n"
260b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
261b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n"
262b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "template <class T>\n"
263b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "inline void $dependent_classname$::"
264b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "set_allocated_$name$($type$* $name$) {\n"
265b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  ::google::protobuf::Arena* message_arena = $this_message$GetArenaNoVirtual();\n"
266b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $dependent_typename$*& $name$_ = $this_message$$name$_;\n"
267b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if (message_arena == NULL) {\n"
268b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    delete $name$_;\n"
269b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
270b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if ($name$ != NULL) {\n");
271b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    if (SupportsArenas(descriptor_->message_type())) {
272b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // If we're on an arena and the incoming message is not, simply Own() it
273b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // rather than copy to the arena -- either way we need a heap dealloc,
274b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // so we might as well defer it. Otherwise, if incoming message is on a
275b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // different ownership domain (specific arena, or the heap) than we are,
276b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // copy to our arena (or heap, as the case may be).
277b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      printer->Print(variables,
278b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "    $this_message$_slow_set_allocated_$name$(message_arena, "
279b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "&$name$);\n");
280b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    } else {
281b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      printer->Print(variables,
282b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "    if (message_arena != NULL) {\n"
283b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "      message_arena->Own($name$);\n"
284b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "    }\n");
285b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
286b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables,
287b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
288b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $name$_ = $name$;\n"
289b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if ($name$) {\n"
290b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $set_hasbit$\n"
291b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  } else {\n"
292b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $clear_hasbit$\n"
293b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
294b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // TODO(dlj): move insertion points to message class.
295b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n"
296b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
297b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else {
298b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables,
299b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "template <class T>\n"
300b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "inline $type$* $dependent_classname$::mutable_$name$() {\n"
301b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $set_hasbit$\n"
302b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $dependent_typename$*& $name$_ = $this_message$$name$_;\n"
303b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if ($name$_ == NULL) {\n"
304b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $name$_ = new $dependent_typename$;\n"
305b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
306b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
307b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return $name$_;\n"
308b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n"
309b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "template <class T>\n"
310b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "inline $type$* $dependent_classname$::$release_name$() {\n"
311b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_release:$full_name$)\n"
312b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $clear_hasbit$\n"
313b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $dependent_typename$*& $name$_ = $this_message$$name$_;\n"
314b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $dependent_typename$* temp = $name$_;\n"
315b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $name$_ = NULL;\n"
316b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return temp;\n"
317b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n"
318b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "template <class T>\n"
319b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "inline void $dependent_classname$::"
320b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "set_allocated_$name$($type$* $name$) {\n"
321b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $dependent_typename$*& $name$_ = $this_message$$name$_;\n"
322b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  delete $name$_;\n");
323b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
324b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    if (SupportsArenas(descriptor_->message_type())) {
325b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      printer->Print(variables,
326b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if ($name$ != NULL && static_cast< $dependent_typename$* >($name$)"
327b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "->GetArena() != NULL) {\n"
328b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $dependent_typename$* new_$name$ = new $dependent_typename$;\n"
329b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    new_$name$->CopyFrom(*$name$);\n"
330b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $name$ = new_$name$;\n"
331b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n");
332b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
333b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
334b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables,
335b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $name$_ = $name$;\n"
336b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if ($name$) {\n"
337b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $set_hasbit$\n"
338b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  } else {\n"
339b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $clear_hasbit$\n"
340b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
341b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n"
342b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
343b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
344b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
345b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
346b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid MessageFieldGenerator::
347b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateInlineAccessorDefinitions(io::Printer* printer,
348b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                                  bool is_inline) const {
349b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  map<string, string> variables(variables_);
350b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["inline"] = is_inline ? "inline " : "";
351b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables,
352b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$inline$const $type$& $classname$::$name$() const {\n"
353a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  // @@protoc_insertion_point(field_get:$full_name$)\n");
354a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
355a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintHandlingOptionalStaticInitializers(
356b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      variables, descriptor_->file(), options_, printer,
357b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // With static initializers.
358b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return $name$_ != NULL ? *$name$_ : *default_instance_->$name$_;\n",
359b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // Without.
360b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return $name$_ != NULL ? *$name$_ : *default_instance().$name$_;\n");
361b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables, "}\n");
362a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
363b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (dependent_field_) {
364b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return;
365b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
366b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
367b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (SupportsArenas(descriptor_)) {
368b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables,
369b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$inline$"
370b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$type$* $classname$::mutable_$name$() {\n"
371b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $set_hasbit$\n"
372b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if ($name$_ == NULL) {\n"
373b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    _slow_mutable_$name$();\n"
374b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
375b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
376b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return $name$_;\n"
377b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n"
378b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$inline$"
379b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$type$* $classname$::$release_name$() {\n"
380b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_release:$full_name$)\n"
381b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $clear_hasbit$\n"
382b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if (GetArenaNoVirtual() != NULL) {\n"
383b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    return _slow_$release_name$();\n"
384b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  } else {\n"
385b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $type$* temp = $name$_;\n"
386b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $name$_ = NULL;\n"
387b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    return temp;\n"
388b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
389b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n"
390b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$inline$ "
391b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "void $classname$::set_allocated_$name$($type$* $name$) {\n"
392b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();\n"
393b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if (message_arena == NULL) {\n"
394b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    delete $name$_;\n"
395b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
396b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if ($name$ != NULL) {\n");
397b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    if (SupportsArenas(descriptor_->message_type())) {
398b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // If we're on an arena and the incoming message is not, simply Own() it
399b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // rather than copy to the arena -- either way we need a heap dealloc,
400b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // so we might as well defer it. Otherwise, if incoming message is on a
401b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // different ownership domain (specific arena, or the heap) than we are,
402b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // copy to our arena (or heap, as the case may be).
403b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      printer->Print(variables,
404b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "    _slow_set_allocated_$name$(message_arena, &$name$);\n");
405b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    } else {
406b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      printer->Print(variables,
407b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "    if (message_arena != NULL) {\n"
408b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "      message_arena->Own($name$);\n"
409b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "    }\n");
410b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
411b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables,
412b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
413b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $name$_ = $name$;\n"
414b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if ($name$) {\n"
415b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $set_hasbit$\n"
416b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  } else {\n"
417b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $clear_hasbit$\n"
418b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
419b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n"
420b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
421b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else {
422b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables,
423b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$inline$"
424b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$type$* $classname$::mutable_$name$() {\n"
425b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $set_hasbit$\n"
426b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if ($name$_ == NULL) {\n"
427b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $name$_ = new $type$;\n"
428b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
429b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
430b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return $name$_;\n"
431b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n"
432b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$inline$"
433b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$type$* $classname$::$release_name$() {\n"
434b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_release:$full_name$)\n"
435b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $clear_hasbit$\n"
436b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $type$* temp = $name$_;\n"
437b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $name$_ = NULL;\n"
438b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return temp;\n"
439b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n"
440b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$inline$"
441b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "void $classname$::set_allocated_$name$($type$* $name$) {\n"
442b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  delete $name$_;\n");
443b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
444b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    if (SupportsArenas(descriptor_->message_type())) {
445b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      printer->Print(variables,
446b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if ($name$ != NULL && $name$->GetArena() != NULL) {\n"
447b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $type$* new_$name$ = new $type$;\n"
448b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    new_$name$->CopyFrom(*$name$);\n"
449b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $name$ = new_$name$;\n"
450b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n");
451b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
452b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
453b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables,
454b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $name$_ = $name$;\n"
455b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if ($name$) {\n"
456b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $set_hasbit$\n"
457b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  } else {\n"
458b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $clear_hasbit$\n"
459b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
460b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n"
461b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
462b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator::
466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateClearingCode(io::Printer* printer) const {
467b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  map<string, string> variables(variables_);
468b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["this_message"] = dependent_field_ ? DependentBaseDownCast() : "";
469b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!HasFieldPresence(descriptor_->file())) {
470b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // If we don't have has-bits, message presence is indicated only by ptr !=
471b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // NULL. Thus on clear, we need to delete the object.
472b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables,
473b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "if ($this_message$GetArenaNoVirtual() == NULL && "
474b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$this_message$$name$_ != NULL) delete $this_message$$name$_;\n"
475b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$this_message$$name$_ = NULL;\n");
476b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else {
477b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables,
478b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "if ($this_message$$name$_ != NULL) $this_message$$name$_->"
479b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$dependent_type$::Clear();\n");
480b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator::
484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergingCode(io::Printer* printer) const {
485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "mutable_$name$()->$type$::MergeFrom(from.$name$());\n");
487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator::
490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSwappingCode(io::Printer* printer) const {
491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_, "std::swap($name$_, other->$name$_);\n");
492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator::
495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateConstructorCode(io::Printer* printer) const {
496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_, "$name$_ = NULL;\n");
497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator::
500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergeFromCodedStream(io::Printer* printer) const {
501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (descriptor_->type() == FieldDescriptor::TYPE_MESSAGE) {
502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n"
504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "     input, mutable_$name$()));\n");
505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "DO_(::google::protobuf::internal::WireFormatLite::ReadGroupNoVirtual(\n"
508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "      $number$, input, mutable_$name$()));\n");
509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator::
513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizes(io::Printer* printer) const {
514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
515d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "::google::protobuf::internal::WireFormatLite::Write$stream_writer$(\n"
516b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  $number$, *$non_null_ptr_to_name$, output);\n");
517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator::
520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "target = ::google::protobuf::internal::WireFormatLite::\n"
523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  Write$declared_type$NoVirtualToArray(\n"
524b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    $number$, *$non_null_ptr_to_name$, target);\n");
525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator::
528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateByteSize(io::Printer* printer) const {
529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "total_size += $tag_size$ +\n"
531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  ::google::protobuf::internal::WireFormatLite::$declared_type$SizeNoVirtual(\n"
532b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    *$non_null_ptr_to_name$);\n");
533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
537a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonMessageOneofFieldGenerator::
538a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonMessageOneofFieldGenerator(const FieldDescriptor* descriptor,
539a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                           const Options& options)
540b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  : MessageFieldGenerator(descriptor, options),
541b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    dependent_base_(options.proto_h) {
542a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  SetCommonOneofFieldVariables(descriptor, &variables_);
543a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
544a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
545a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonMessageOneofFieldGenerator::~MessageOneofFieldGenerator() {}
546a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
547b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
548a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid MessageOneofFieldGenerator::
549b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateDependentAccessorDeclarations(io::Printer* printer) const {
550b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Oneof field getters must be dependent as they call default_instance().
551b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Otherwise, the logic is the same as MessageFields.
552b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!dependent_field_) {
553b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return;
554b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
555a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
556b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$deprecated_attr$const $type$& $name$() const;\n");
557b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  MessageFieldGenerator::GenerateDependentAccessorDeclarations(printer);
558b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
559b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
560b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid MessageOneofFieldGenerator::
561b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateGetterDeclaration(io::Printer* printer) const {
562b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Oneof field getters must be dependent as they call default_instance().
563b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Unlike MessageField, this means there is no (non-dependent) getter to
564b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // generate.
565b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (dependent_field_) {
566b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return;
567b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
568b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables_,
569b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$deprecated_attr$const $type$& $name$() const;\n");
570b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
571b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
572b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid MessageOneofFieldGenerator::
573b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateDependentInlineAccessorDefinitions(io::Printer* printer) const {
574b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // For the CRTP base class, all mutation methods are dependent, and so
575b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // they must be in the header.
576b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!dependent_base_) {
577b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return;
578b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
579b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  map<string, string> variables(variables_);
580b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["inline"] = "inline ";
581b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["dependent_classname"] =
582b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      DependentBaseClassTemplateName(descriptor_->containing_type()) + "<T>";
583b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["this_message"] = "reinterpret_cast<T*>(this)->";
584b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Const message access is needed for the dependent getter.
585b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["this_const_message"] = "reinterpret_cast<const T*>(this)->";
586b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["tmpl"] = "template <class T>\n";
587b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["field_member"] = variables["this_message"] +
588b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                              variables["oneof_prefix"] + variables["name"] +
589b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                              "_";
590b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  InternalGenerateInlineAccessorDefinitions(variables, printer);
591b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
592b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
593b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid MessageOneofFieldGenerator::
594b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateInlineAccessorDefinitions(io::Printer* printer,
595b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                                  bool is_inline) const {
596b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (dependent_base_) {
597b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return;
598b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
599b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  map<string, string> variables(variables_);
600b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["inline"] = is_inline ? "inline " : "";
601b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["dependent_classname"] = variables["classname"];
602b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["this_message"] = "";
603b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["this_const_message"] = "";
604b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["tmpl"] = "";
605b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["field_member"] =
606b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      variables["oneof_prefix"] + variables["name"] + "_";
607b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["dependent_type"] = variables["type"];
608b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  InternalGenerateInlineAccessorDefinitions(variables, printer);
609b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
610b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
611b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid MessageOneofFieldGenerator::
612b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateNonInlineAccessorDefinitions(io::Printer* printer) const {
613b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  map<string, string> variables(variables_);
614b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["field_member"] =
615b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      variables["oneof_prefix"] + variables["name"] + "_";
616b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
617b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  //printer->Print(variables,
618b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
619b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
620b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid MessageOneofFieldGenerator::
621b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerInternalGenerateInlineAccessorDefinitions(const map<string, string>& variables,
622b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                                          io::Printer* printer) const {
623b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables,
624b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$tmpl$"
625b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$inline$ "
626b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "const $type$& $dependent_classname$::$name$() const {\n"
627b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  // @@protoc_insertion_point(field_get:$full_name$)\n"
628b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  return $this_const_message$has_$name$()\n"
629b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "      ? *$this_const_message$$oneof_prefix$$name$_\n"
630b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "      : $dependent_type$::default_instance();\n"
631a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
632b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
633b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (SupportsArenas(descriptor_)) {
634b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables,
635b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$tmpl$"
636b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$inline$"
637b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$type$* $dependent_classname$::mutable_$name$() {\n"
638b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if (!$this_message$has_$name$()) {\n"
639b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $this_message$clear_$oneof_name$();\n"
640b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $this_message$set_has_$name$();\n");
641b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    if (SupportsArenas(descriptor_->message_type())) {
642b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      printer->Print(variables,
643b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer         "    $field_member$ = \n"
644b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer         "      ::google::protobuf::Arena::CreateMessage< $dependent_typename$ >(\n"
645b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer         "      $this_message$GetArenaNoVirtual());\n");
646b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    } else {
647b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      printer->Print(variables,
648b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer         "    $this_message$$oneof_prefix$$name$_ = \n"
649b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer         "      ::google::protobuf::Arena::Create< $dependent_typename$ >(\n"
650b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer         "      $this_message$GetArenaNoVirtual());\n");
651b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
652b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables,
653b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
654b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
655b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return $field_member$;\n"
656b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n"
657b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$tmpl$"
658b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$inline$"
659b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$type$* $dependent_classname$::$release_name$() {\n"
660b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_release:$full_name$)\n"
661b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if ($this_message$has_$name$()) {\n"
662b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $this_message$clear_has_$oneof_name$();\n"
663b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    if ($this_message$GetArenaNoVirtual() != NULL) {\n"
664b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // N.B.: safe to use the underlying field pointer here because we are sure
665b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // that it is non-NULL (because has_$name$() returned true).
666b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "      $dependent_typename$* temp = new $dependent_typename$;\n"
667b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "      temp->MergeFrom(*$field_member$);\n"
668b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "      $field_member$ = NULL;\n"
669b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "      return temp;\n"
670b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    } else {\n"
671b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "      $dependent_typename$* temp = $field_member$;\n"
672b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "      $field_member$ = NULL;\n"
673b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "      return temp;\n"
674b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    }\n"
675b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  } else {\n"
676b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    return NULL;\n"
677b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
678b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n"
679b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$tmpl$"
680b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$inline$"
681b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "void $dependent_classname$::"
682b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "set_allocated_$name$($type$* $name$) {\n"
683b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $this_message$clear_$oneof_name$();\n"
684b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if ($name$) {\n");
685b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
686b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    if (SupportsArenas(descriptor_->message_type())) {
687b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      printer->Print(variables,
688b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        // If incoming message is on the heap and we are on an arena, just Own()
689b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        // it (see above). If it's on a different arena than we are or one of us
690b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        // is on the heap, we make a copy to our arena/heap.
691b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "    if ($this_message$GetArenaNoVirtual() != NULL &&\n"
692b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "        ::google::protobuf::Arena::GetArena($name$) == NULL) {\n"
693b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "      $this_message$GetArenaNoVirtual()->Own($name$);\n"
694b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "    } else if ($this_message$GetArenaNoVirtual() !=\n"
695b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "               ::google::protobuf::Arena::GetArena($name$)) {\n"
696b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "      $dependent_typename$* new_$name$ = \n"
697b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "          ::google::protobuf::Arena::CreateMessage< $dependent_typename$ >(\n"
698b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "          $this_message$GetArenaNoVirtual());\n"
699b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "      new_$name$->CopyFrom(*$name$);\n"
700b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "      $name$ = new_$name$;\n"
701b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "    }\n");
702b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    } else {
703b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      printer->Print(variables,
704b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "    if ($this_message$GetArenaNoVirtual() != NULL) {\n"
705b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "      $this_message$GetArenaNoVirtual()->Own($name$);\n"
706b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "    }\n");
707b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
708b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
709b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables,
710b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $this_message$set_has_$name$();\n"
711b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $field_member$ = $name$;\n"
712b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
713b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n"
714b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n"
715b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$inline$ $type$* $classname$::unsafe_arena_release_$name$() {\n"
716b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_unsafe_arena_release"
717b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      ":$full_name$)\n"
718b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if (has_$name$()) {\n"
719b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    clear_has_$oneof_name$();\n"
720b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $type$* temp = $oneof_prefix$$name$_;\n"
721b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $oneof_prefix$$name$_ = NULL;\n"
722b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    return temp;\n"
723b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  } else {\n"
724b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    return NULL;\n"
725b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
726b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n"
727b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$inline$ void $classname$::unsafe_arena_set_allocated_$name$"
728b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "($type$* $name$) {\n"
729b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // We rely on the oneof clear method to free the earlier contents of this
730b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // oneof. We can directly use the pointer we're given to set the new
731b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // value.
732b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  clear_$oneof_name$();\n"
733b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if ($name$) {\n"
734b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    set_has_$name$();\n"
735b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $oneof_prefix$$name$_ = $name$;\n"
736b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
737b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_unsafe_arena_set_allocated:"
738b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$full_name$)\n"
739b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
740b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else {
741b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables,
742b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$tmpl$"
743b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$inline$"
744b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$type$* $dependent_classname$::mutable_$name$() {\n"
745b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if (!$this_message$has_$name$()) {\n"
746b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $this_message$clear_$oneof_name$();\n"
747b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $this_message$set_has_$name$();\n"
748b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $field_member$ = new $dependent_typename$;\n"
749b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
750b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
751b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return $field_member$;\n"
752b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n"
753b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$tmpl$"
754b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$inline$"
755b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$type$* $dependent_classname$::$release_name$() {\n"
756b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_release:$full_name$)\n"
757b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if ($this_message$has_$name$()) {\n"
758b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $this_message$clear_has_$oneof_name$();\n"
759b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $dependent_typename$* temp = $field_member$;\n"
760b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $field_member$ = NULL;\n"
761b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    return temp;\n"
762b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  } else {\n"
763b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    return NULL;\n"
764b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
765b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n"
766b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$tmpl$"
767b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$inline$"
768b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "void $dependent_classname$::"
769b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "set_allocated_$name$($type$* $name$) {\n"
770b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  $this_message$clear_$oneof_name$();\n"
771b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  if ($name$) {\n");
772b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    if (SupportsArenas(descriptor_->message_type())) {
773b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      printer->Print(variables,
774b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "    if (static_cast< $dependent_typename$*>($name$)->"
775b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "GetArena() != NULL) {\n"
776b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "      $dependent_typename$* new_$name$ = new $dependent_typename$;\n"
777b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "      new_$name$->CopyFrom(*$name$);\n"
778b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "      $name$ = new_$name$;\n"
779b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "    }\n");
780b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
781b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables,
782b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $this_message$set_has_$name$();\n"
783b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $field_member$ = $name$;\n"
784b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  }\n"
785b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_set_allocated:$full_name$)\n"
786b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
787b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
788a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
789a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
790a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid MessageOneofFieldGenerator::
791a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateClearingCode(io::Printer* printer) const {
792b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  map<string, string> variables(variables_);
793b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["this_message"] = dependent_field_ ? DependentBaseDownCast() : "";
794b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (SupportsArenas(descriptor_)) {
795b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables,
796b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "if ($this_message$GetArenaNoVirtual() == NULL) {\n"
797b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  delete $this_message$$oneof_prefix$$name$_;\n"
798b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
799b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else {
800b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables,
801b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "delete $this_message$$oneof_prefix$$name$_;\n");
802b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
803a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
804a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
805a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid MessageOneofFieldGenerator::
806a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateSwappingCode(io::Printer* printer) const {
807a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Don't print any swapping code. Swapping the union will swap this field.
808a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
809a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
810a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid MessageOneofFieldGenerator::
811a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateConstructorCode(io::Printer* printer) const {
812a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Don't print any constructor code. The field is in a union. We allocate
813a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // space only when this field is used.
814a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
815a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
816a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// ===================================================================
817a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
818b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerRepeatedMessageFieldGenerator::RepeatedMessageFieldGenerator(
819b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    const FieldDescriptor* descriptor, const Options& options)
820b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    : FieldGenerator(options),
821b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      descriptor_(descriptor),
822b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      dependent_field_(options.proto_h && IsFieldDependent(descriptor)),
823b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      dependent_getter_(dependent_field_ && options.safe_boundary_check) {
824a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  SetMessageVariables(descriptor, &variables_, options);
825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleRepeatedMessageFieldGenerator::~RepeatedMessageFieldGenerator() {}
828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator::
830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGeneratePrivateMembers(io::Printer* printer) const {
831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "::google::protobuf::RepeatedPtrField< $type$ > $name$_;\n");
833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator::
836b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerInternalGenerateTypeDependentAccessorDeclarations(io::Printer* printer) const {
837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
838b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$deprecated_attr$$type$* mutable_$name$(int index);\n"
839b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$deprecated_attr$$type$* add_$name$();\n");
840b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (dependent_getter_) {
841b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables_,
842b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$deprecated_attr$const ::google::protobuf::RepeatedPtrField< $type$ >&\n"
843b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $name$() const;\n");
844b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
845d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  printer->Print(variables_,
846b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$deprecated_attr$::google::protobuf::RepeatedPtrField< $type$ >*\n"
847b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    mutable_$name$();\n");
848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator::
851b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateDependentAccessorDeclarations(io::Printer* printer) const {
852b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (dependent_getter_) {
853b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables_,
854b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$deprecated_attr$const $type$& $name$(int index) const;\n");
855b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
856b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (dependent_field_) {
857b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    InternalGenerateTypeDependentAccessorDeclarations(printer);
858b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
859b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
860b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
861b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid RepeatedMessageFieldGenerator::
862b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateAccessorDeclarations(io::Printer* printer) const {
863b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!dependent_getter_) {
864b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables_,
865b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$deprecated_attr$const $type$& $name$(int index) const;\n");
866b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
867b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!dependent_field_) {
868b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    InternalGenerateTypeDependentAccessorDeclarations(printer);
869b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
870b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!dependent_getter_) {
871b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables_,
872b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$deprecated_attr$const ::google::protobuf::RepeatedPtrField< $type$ >&\n"
873b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    $name$() const;\n");
874b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
875b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
876b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
877b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid RepeatedMessageFieldGenerator::
878b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateDependentInlineAccessorDefinitions(io::Printer* printer) const {
879b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!dependent_field_) {
880b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return;
881b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
882b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  map<string, string> variables(variables_);
883b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // For the CRTP base class, all mutation methods are dependent, and so
884b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // they must be in the header.
885b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["dependent_classname"] =
886b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      DependentBaseClassTemplateName(descriptor_->containing_type()) + "<T>";
887b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["this_message"] = DependentBaseDownCast();
888b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["this_const_message"] = DependentBaseConstDownCast();
889b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
890b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (dependent_getter_) {
891b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables,
892b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "template <class T>\n"
893b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "inline const $type$& $dependent_classname$::$name$(int index) const {\n"
894b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_get:$full_name$)\n"
895b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return $this_const_message$$name$_.$cppget$(index);\n"
896b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
897b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
898b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
899b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Generate per-element accessors:
900b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables,
901b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "template <class T>\n"
902b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "inline $type$* $dependent_classname$::mutable_$name$(int index) {\n"
903b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // TODO(dlj): move insertion points
904a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
905b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  return $this_message$$name$_.Mutable(index);\n"
906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
907b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "template <class T>\n"
908b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "inline $type$* $dependent_classname$::add_$name$() {\n"
909a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  // @@protoc_insertion_point(field_add:$full_name$)\n"
910b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  return $this_message$$name$_.Add();\n"
911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
912b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
913b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
914b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (dependent_getter_) {
915b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables,
916b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "template <class T>\n"
917b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "inline const ::google::protobuf::RepeatedPtrField< $type$ >&\n"
918b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$dependent_classname$::$name$() const {\n"
919b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_list:$full_name$)\n"
920b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return $this_const_message$$name$_;\n"
921b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
922b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
923b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
924b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Generate mutable access to the entire list:
925b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables,
926b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "template <class T>\n"
927d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "inline ::google::protobuf::RepeatedPtrField< $type$ >*\n"
928b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$dependent_classname$::mutable_$name$() {\n"
929a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  // @@protoc_insertion_point(field_mutable_list:$full_name$)\n"
930b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  return &$this_message$$name$_;\n"
931d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "}\n");
932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator::
935b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateInlineAccessorDefinitions(io::Printer* printer,
936b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                                  bool is_inline) const {
937b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  map<string, string> variables(variables_);
938b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["inline"] = is_inline ? "inline " : "";
939b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
940b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!dependent_getter_) {
941b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables,
942b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$inline$"
943b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "const $type$& $classname$::$name$(int index) const {\n"
944b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_get:$full_name$)\n"
945b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return $name$_.$cppget$(index);\n"
946b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
947b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
948b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
949b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!dependent_field_) {
950b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables,
951b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$inline$"
952b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$type$* $classname$::mutable_$name$(int index) {\n"
953b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // TODO(dlj): move insertion points
954b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_mutable:$full_name$)\n"
955b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return $name$_.Mutable(index);\n"
956b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n"
957b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$inline$"
958b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$type$* $classname$::add_$name$() {\n"
959b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_add:$full_name$)\n"
960b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return $name$_.Add();\n"
961b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
962b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
963b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
964b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
965b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!dependent_field_) {
966b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables,
967b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$inline$"
968b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "::google::protobuf::RepeatedPtrField< $type$ >*\n"
969b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$classname$::mutable_$name$() {\n"
970b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_mutable_list:$full_name$)\n"
971b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return &$name$_;\n"
972b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
973b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
974b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!dependent_getter_) {
975b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables,
976b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$inline$"
977b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "const ::google::protobuf::RepeatedPtrField< $type$ >&\n"
978b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$classname$::$name$() const {\n"
979b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  // @@protoc_insertion_point(field_list:$full_name$)\n"
980b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return $name$_;\n"
981b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
982b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
983b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
984b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
985b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid RepeatedMessageFieldGenerator::
986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateClearingCode(io::Printer* printer) const {
987b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  map<string, string> variables(variables_);
988b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  variables["this_message"] = dependent_field_ ? DependentBaseDownCast() : "";
989b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables, "$this_message$$name$_.Clear();\n");
990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator::
993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergingCode(io::Printer* printer) const {
994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_, "$name$_.MergeFrom(from.$name$_);\n");
995fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
996fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
997fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator::
998fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSwappingCode(io::Printer* printer) const {
999b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables_, "$name$_.UnsafeArenaSwap(&other->$name$_);\n");
1000fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1001fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1002fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator::
1003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateConstructorCode(io::Printer* printer) const {
1004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Not needed for repeated fields.
1005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator::
1008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergeFromCodedStream(io::Printer* printer) const {
1009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (descriptor_->type() == FieldDescriptor::TYPE_MESSAGE) {
1010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
1011b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DO_(::google::protobuf::internal::WireFormatLite::"
1012b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "ReadMessageNoVirtualNoRecursionDepth(\n"
1013fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "      input, add_$name$()));\n");
1014fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
1015fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
1016b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DO_(::google::protobuf::internal::WireFormatLite::"
1017b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "ReadGroupNoVirtualNoRecursionDepth(\n"
1018fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "      $number$, input, add_$name$()));\n");
1019fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1020fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1021fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1022fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator::
1023fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizes(io::Printer* printer) const {
1024fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
1025b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "for (unsigned int i = 0, n = this->$name$_size(); i < n; i++) {\n"
1026d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "  ::google::protobuf::internal::WireFormatLite::Write$stream_writer$(\n"
1027fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    $number$, this->$name$(i), output);\n"
1028fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
1029fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1030fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1031fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator::
1032fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
1033fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
1034b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "for (unsigned int i = 0, n = this->$name$_size(); i < n; i++) {\n"
1035fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  target = ::google::protobuf::internal::WireFormatLite::\n"
1036fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    Write$declared_type$NoVirtualToArray(\n"
1037fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "      $number$, this->$name$(i), target);\n"
1038fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
1039fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1040fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1041fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator::
1042fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateByteSize(io::Printer* printer) const {
1043fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
1044fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "total_size += $tag_size$ * this->$name$_size();\n"
1045fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "for (int i = 0; i < this->$name$_size(); i++) {\n"
1046fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  total_size +=\n"
1047fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    ::google::protobuf::internal::WireFormatLite::$declared_type$SizeNoVirtual(\n"
1048fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "      this->$name$(i));\n"
1049fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
1050fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1051fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace cpp
1053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace compiler
1054fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
1055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
1056