1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc. All rights reserved. 3afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson// https://developers.google.com/protocol-buffers/ 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met: 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions of source code must retain the above copyright 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer. 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions in binary form must reproduce the above 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution. 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Neither the name of Google Inc. nor the names of its 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission. 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda) 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Based on original Protocol Buffers design by 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Sanjay Ghemawat, Jeff Dean, and others. 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/compiler/cpp/cpp_message_field.h> 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/compiler/cpp/cpp_helpers.h> 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/io/printer.h> 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/strutil.h> 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google { 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace compiler { 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace cpp { 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace { 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid SetMessageVariables(const FieldDescriptor* descriptor, 48a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson map<string, string>* variables, 49a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Options& options) { 50a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetCommonFieldVariables(descriptor, variables, options); 51d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville (*variables)["type"] = FieldMessageTypeName(descriptor); 52d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville (*variables)["stream_writer"] = (*variables)["declared_type"] + 53d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville (HasFastArraySerialization(descriptor->message_type()->file()) ? 54d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "MaybeToArray" : 55d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville ""); 56a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // NOTE: Escaped here to unblock proto1->proto2 migration. 57a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // TODO(liujisi): Extend this to apply for other conflicting methods. 58a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["release_name"] = 59a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SafeFunctionName(descriptor->containing_type(), 60a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson descriptor, "release_"); 61a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["full_name"] = descriptor->full_name(); 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleMessageFieldGenerator:: 69a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonMessageFieldGenerator(const FieldDescriptor* descriptor, 70a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Options& options) 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville : descriptor_(descriptor) { 72a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetMessageVariables(descriptor, &variables_, options); 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleMessageFieldGenerator::~MessageFieldGenerator() {} 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator:: 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGeneratePrivateMembers(io::Printer* printer) const { 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, "$type$* $name$_;\n"); 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator:: 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateAccessorDeclarations(io::Printer* printer) const { 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "inline const $type$& $name$() const$deprecation$;\n" 86a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "inline $type$* mutable_$name$()$deprecation$;\n" 87a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "inline $type$* $release_name$()$deprecation$;\n" 88a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "inline void set_allocated_$name$($type$* $name$)$deprecation$;\n"); 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator:: 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateInlineAccessorDefinitions(io::Printer* printer) const { 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "inline const $type$& $classname$::$name$() const {\n" 95a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " // @@protoc_insertion_point(field_get:$full_name$)\n"); 96a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 97a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson PrintHandlingOptionalStaticInitializers( 98a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson variables_, descriptor_->file(), printer, 99a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // With static initializers. 100a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $name$_ != NULL ? *$name$_ : *default_instance_->$name$_;\n", 101a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Without. 102a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $name$_ != NULL ? *$name$_ : *default_instance().$name$_;\n"); 103a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 104a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n" 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "inline $type$* $classname$::mutable_$name$() {\n" 107a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " set_has_$name$();\n" 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " if ($name$_ == NULL) $name$_ = new $type$;\n" 109a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " // @@protoc_insertion_point(field_mutable:$full_name$)\n" 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " return $name$_;\n" 111a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n" 112a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "inline $type$* $classname$::$release_name$() {\n" 113a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " clear_has_$name$();\n" 114a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $type$* temp = $name$_;\n" 115a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = NULL;\n" 116a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return temp;\n" 117a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n" 118a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "inline void $classname$::set_allocated_$name$($type$* $name$) {\n" 119a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " delete $name$_;\n" 120a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = $name$;\n" 121a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if ($name$) {\n" 122a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " set_has_$name$();\n" 123a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } else {\n" 124a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " clear_has_$name$();\n" 125a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 126a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " // @@protoc_insertion_point(field_set_allocated:$full_name$)\n" 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n"); 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator:: 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateClearingCode(io::Printer* printer) const { 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "if ($name$_ != NULL) $name$_->$type$::Clear();\n"); 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator:: 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergingCode(io::Printer* printer) const { 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "mutable_$name$()->$type$::MergeFrom(from.$name$());\n"); 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator:: 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSwappingCode(io::Printer* printer) const { 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, "std::swap($name$_, other->$name$_);\n"); 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator:: 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateConstructorCode(io::Printer* printer) const { 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, "$name$_ = NULL;\n"); 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator:: 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergeFromCodedStream(io::Printer* printer) const { 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (descriptor_->type() == FieldDescriptor::TYPE_MESSAGE) { 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n" 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " input, mutable_$name$()));\n"); 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "DO_(::google::protobuf::internal::WireFormatLite::ReadGroupNoVirtual(\n" 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " $number$, input, mutable_$name$()));\n"); 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator:: 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizes(io::Printer* printer) const { 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 168d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "::google::protobuf::internal::WireFormatLite::Write$stream_writer$(\n" 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " $number$, this->$name$(), output);\n"); 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator:: 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "target = ::google::protobuf::internal::WireFormatLite::\n" 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Write$declared_type$NoVirtualToArray(\n" 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " $number$, this->$name$(), target);\n"); 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid MessageFieldGenerator:: 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateByteSize(io::Printer* printer) const { 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "total_size += $tag_size$ +\n" 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " ::google::protobuf::internal::WireFormatLite::$declared_type$SizeNoVirtual(\n" 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " this->$name$());\n"); 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// =================================================================== 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 190a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonMessageOneofFieldGenerator:: 191a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonMessageOneofFieldGenerator(const FieldDescriptor* descriptor, 192a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Options& options) 193a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson : MessageFieldGenerator(descriptor, options) { 194a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetCommonOneofFieldVariables(descriptor, &variables_); 195a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 196a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 197a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonMessageOneofFieldGenerator::~MessageOneofFieldGenerator() {} 198a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 199a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid MessageOneofFieldGenerator:: 200a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateInlineAccessorDefinitions(io::Printer* printer) const { 201a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 202a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "inline const $type$& $classname$::$name$() const {\n" 203a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return has_$name$() ? *$oneof_prefix$$name$_\n" 204a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " : $type$::default_instance();\n" 205a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n" 206a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "inline $type$* $classname$::mutable_$name$() {\n" 207a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if (!has_$name$()) {\n" 208a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " clear_$oneof_name$();\n" 209a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " set_has_$name$();\n" 210a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $oneof_prefix$$name$_ = new $type$;\n" 211a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 212a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $oneof_prefix$$name$_;\n" 213a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n" 214a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "inline $type$* $classname$::$release_name$() {\n" 215a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if (has_$name$()) {\n" 216a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " clear_has_$oneof_name$();\n" 217a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $type$* temp = $oneof_prefix$$name$_;\n" 218a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $oneof_prefix$$name$_ = NULL;\n" 219a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return temp;\n" 220a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } else {\n" 221a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return NULL;\n" 222a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 223a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n" 224a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "inline void $classname$::set_allocated_$name$($type$* $name$) {\n" 225a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " clear_$oneof_name$();\n" 226a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if ($name$) {\n" 227a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " set_has_$name$();\n" 228a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $oneof_prefix$$name$_ = $name$;\n" 229a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 230a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 231a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 232a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 233a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid MessageOneofFieldGenerator:: 234a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateClearingCode(io::Printer* printer) const { 235a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // if it is the active field, it cannot be NULL. 236a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 237a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "delete $oneof_prefix$$name$_;\n"); 238a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 239a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 240a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid MessageOneofFieldGenerator:: 241a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateSwappingCode(io::Printer* printer) const { 242a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Don't print any swapping code. Swapping the union will swap this field. 243a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 244a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 245a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid MessageOneofFieldGenerator:: 246a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateConstructorCode(io::Printer* printer) const { 247a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Don't print any constructor code. The field is in a union. We allocate 248a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // space only when this field is used. 249a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 250a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 251a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// =================================================================== 252a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleRepeatedMessageFieldGenerator:: 254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonRepeatedMessageFieldGenerator(const FieldDescriptor* descriptor, 255a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Options& options) 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville : descriptor_(descriptor) { 257a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetMessageVariables(descriptor, &variables_, options); 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleRepeatedMessageFieldGenerator::~RepeatedMessageFieldGenerator() {} 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator:: 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGeneratePrivateMembers(io::Printer* printer) const { 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "::google::protobuf::RepeatedPtrField< $type$ > $name$_;\n"); 266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator:: 269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateAccessorDeclarations(io::Printer* printer) const { 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "inline const $type$& $name$(int index) const$deprecation$;\n" 272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "inline $type$* mutable_$name$(int index)$deprecation$;\n" 273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "inline $type$* add_$name$()$deprecation$;\n"); 274d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville printer->Print(variables_, 275d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "inline const ::google::protobuf::RepeatedPtrField< $type$ >&\n" 276d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville " $name$() const$deprecation$;\n" 277d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "inline ::google::protobuf::RepeatedPtrField< $type$ >*\n" 278d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville " mutable_$name$()$deprecation$;\n"); 279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator:: 282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateInlineAccessorDefinitions(io::Printer* printer) const { 283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "inline const $type$& $classname$::$name$(int index) const {\n" 285a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " // @@protoc_insertion_point(field_get:$full_name$)\n" 286a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $name$_.$cppget$(index);\n" 287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n" 288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "inline $type$* $classname$::mutable_$name$(int index) {\n" 289a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " // @@protoc_insertion_point(field_mutable:$full_name$)\n" 290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " return $name$_.Mutable(index);\n" 291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n" 292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "inline $type$* $classname$::add_$name$() {\n" 293a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " // @@protoc_insertion_point(field_add:$full_name$)\n" 294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " return $name$_.Add();\n" 295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n"); 296d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville printer->Print(variables_, 297d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "inline const ::google::protobuf::RepeatedPtrField< $type$ >&\n" 298d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "$classname$::$name$() const {\n" 299a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " // @@protoc_insertion_point(field_list:$full_name$)\n" 300d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville " return $name$_;\n" 301d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "}\n" 302d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "inline ::google::protobuf::RepeatedPtrField< $type$ >*\n" 303d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "$classname$::mutable_$name$() {\n" 304a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " // @@protoc_insertion_point(field_mutable_list:$full_name$)\n" 305d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville " return &$name$_;\n" 306d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "}\n"); 307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator:: 310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateClearingCode(io::Printer* printer) const { 311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, "$name$_.Clear();\n"); 312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator:: 315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergingCode(io::Printer* printer) const { 316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, "$name$_.MergeFrom(from.$name$_);\n"); 317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator:: 320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSwappingCode(io::Printer* printer) const { 321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, "$name$_.Swap(&other->$name$_);\n"); 322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator:: 325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateConstructorCode(io::Printer* printer) const { 326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Not needed for repeated fields. 327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator:: 330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergeFromCodedStream(io::Printer* printer) const { 331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (descriptor_->type() == FieldDescriptor::TYPE_MESSAGE) { 332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n" 334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " input, add_$name$()));\n"); 335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "DO_(::google::protobuf::internal::WireFormatLite::ReadGroupNoVirtual(\n" 338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " $number$, input, add_$name$()));\n"); 339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator:: 343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizes(io::Printer* printer) const { 344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for (int i = 0; i < this->$name$_size(); i++) {\n" 346d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville " ::google::protobuf::internal::WireFormatLite::Write$stream_writer$(\n" 347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " $number$, this->$name$(i), output);\n" 348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n"); 349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator:: 352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { 353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for (int i = 0; i < this->$name$_size(); i++) {\n" 355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " target = ::google::protobuf::internal::WireFormatLite::\n" 356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " Write$declared_type$NoVirtualToArray(\n" 357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " $number$, this->$name$(i), target);\n" 358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n"); 359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid RepeatedMessageFieldGenerator:: 362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateByteSize(io::Printer* printer) const { 363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer->Print(variables_, 364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "total_size += $tag_size$ * this->$name$_size();\n" 365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "for (int i = 0; i < this->$name$_size(); i++) {\n" 366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " total_size +=\n" 367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " ::google::protobuf::internal::WireFormatLite::$declared_type$SizeNoVirtual(\n" 368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " this->$name$(i));\n" 369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n"); 370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace cpp 373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace compiler 374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace protobuf 375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace google 376