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