15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Protocol Buffers - Google's data interchange format
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2008 Google Inc.  All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://code.google.com/p/protobuf/
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Redistribution and use in source and binary forms, with or without
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modification, are permitted provided that the following conditions are
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// met:
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Redistributions of source code must retain the above copyright
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notice, this list of conditions and the following disclaimer.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Redistributions in binary form must reproduce the above
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// copyright notice, this list of conditions and the following disclaimer
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the documentation and/or other materials provided with the
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// distribution.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Neither the name of Google Inc. nor the names of its
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contributors may be used to endorse or promote products derived from
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this software without specific prior written permission.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: kenton@google.com (Kenton Varda)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  Based on original Protocol Buffers design by
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  Sanjay Ghemawat, Jeff Dean, and others.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/compiler/cpp/cpp_message_field.h>
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/compiler/cpp/cpp_helpers.h>
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/io/printer.h>
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/stubs/strutil.h>
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace google {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protobuf {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace compiler {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace cpp {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetMessageVariables(const FieldDescriptor* descriptor,
48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                         map<string, string>* variables,
49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                         const Options& options) {
50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetCommonFieldVariables(descriptor, variables, options);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*variables)["type"] = FieldMessageTypeName(descriptor);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*variables)["stream_writer"] = (*variables)["declared_type"] +
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (HasFastArraySerialization(descriptor->message_type()->file()) ?
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "MaybeToArray" :
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "");
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ===================================================================
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageFieldGenerator::
63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochMessageFieldGenerator(const FieldDescriptor* descriptor,
64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                      const Options& options)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  : descriptor_(descriptor) {
66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetMessageVariables(descriptor, &variables_, options);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageFieldGenerator::~MessageFieldGenerator() {}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GeneratePrivateMembers(io::Printer* printer) const {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_, "$type$* $name$_;\n");
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateAccessorDeclarations(io::Printer* printer) const {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline const $type$& $name$() const$deprecation$;\n"
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline $type$* mutable_$name$()$deprecation$;\n"
81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "inline $type$* release_$name$()$deprecation$;\n"
82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "inline void set_allocated_$name$($type$* $name$)$deprecation$;\n");
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateInlineAccessorDefinitions(io::Printer* printer) const {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline const $type$& $classname$::$name$() const {\n");
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintHandlingOptionalStaticInitializers(
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    variables_, descriptor_->file(), printer,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // With static initializers.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  return $name$_ != NULL ? *$name$_ : *default_instance_->$name$_;\n",
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Without.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  return $name$_ != NULL ? *$name$_ : *default_instance().$name$_;\n");
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n"
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline $type$* $classname$::mutable_$name$() {\n"
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  set_has_$name$();\n"
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  if ($name$_ == NULL) $name$_ = new $type$;\n"
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  return $name$_;\n"
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n"
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline $type$* $classname$::release_$name$() {\n"
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  clear_has_$name$();\n"
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  $type$* temp = $name$_;\n"
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  $name$_ = NULL;\n"
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  return temp;\n"
109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "}\n"
110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "inline void $classname$::set_allocated_$name$($type$* $name$) {\n"
111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "  delete $name$_;\n"
112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "  $name$_ = $name$;\n"
113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "  if ($name$) {\n"
114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "    set_has_$name$();\n"
115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "  } else {\n"
116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "    clear_has_$name$();\n"
117ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "  }\n"
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n");
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateClearingCode(io::Printer* printer) const {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "if ($name$_ != NULL) $name$_->$type$::Clear();\n");
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateMergingCode(io::Printer* printer) const {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "mutable_$name$()->$type$::MergeFrom(from.$name$());\n");
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSwappingCode(io::Printer* printer) const {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_, "std::swap($name$_, other->$name$_);\n");
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateConstructorCode(io::Printer* printer) const {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_, "$name$_ = NULL;\n");
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateMergeFromCodedStream(io::Printer* printer) const {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (descriptor_->type() == FieldDescriptor::TYPE_MESSAGE) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n"
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "     input, mutable_$name$()));\n");
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "DO_(::google::protobuf::internal::WireFormatLite::ReadGroupNoVirtual(\n"
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      $number$, input, mutable_$name$()));\n");
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSerializeWithCachedSizes(io::Printer* printer) const {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "::google::protobuf::internal::WireFormatLite::Write$stream_writer$(\n"
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  $number$, this->$name$(), output);\n");
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "target = ::google::protobuf::internal::WireFormatLite::\n"
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  Write$declared_type$NoVirtualToArray(\n"
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    $number$, this->$name$(), target);\n");
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateByteSize(io::Printer* printer) const {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "total_size += $tag_size$ +\n"
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  ::google::protobuf::internal::WireFormatLite::$declared_type$SizeNoVirtual(\n"
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    this->$name$());\n");
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ===================================================================
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedMessageFieldGenerator::
182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochRepeatedMessageFieldGenerator(const FieldDescriptor* descriptor,
183ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                              const Options& options)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  : descriptor_(descriptor) {
185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetMessageVariables(descriptor, &variables_, options);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedMessageFieldGenerator::~RepeatedMessageFieldGenerator() {}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GeneratePrivateMembers(io::Printer* printer) const {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "::google::protobuf::RepeatedPtrField< $type$ > $name$_;\n");
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateAccessorDeclarations(io::Printer* printer) const {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline const $type$& $name$(int index) const$deprecation$;\n"
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline $type$* mutable_$name$(int index)$deprecation$;\n"
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline $type$* add_$name$()$deprecation$;\n");
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline const ::google::protobuf::RepeatedPtrField< $type$ >&\n"
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    $name$() const$deprecation$;\n"
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline ::google::protobuf::RepeatedPtrField< $type$ >*\n"
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    mutable_$name$()$deprecation$;\n");
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateInlineAccessorDefinitions(io::Printer* printer) const {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline const $type$& $classname$::$name$(int index) const {\n"
213ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    "  return $name$_.$cppget$(index);\n"
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n"
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline $type$* $classname$::mutable_$name$(int index) {\n"
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  return $name$_.Mutable(index);\n"
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n"
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline $type$* $classname$::add_$name$() {\n"
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  return $name$_.Add();\n"
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n");
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline const ::google::protobuf::RepeatedPtrField< $type$ >&\n"
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$classname$::$name$() const {\n"
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  return $name$_;\n"
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n"
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline ::google::protobuf::RepeatedPtrField< $type$ >*\n"
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$classname$::mutable_$name$() {\n"
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  return &$name$_;\n"
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n");
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateClearingCode(io::Printer* printer) const {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_, "$name$_.Clear();\n");
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateMergingCode(io::Printer* printer) const {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_, "$name$_.MergeFrom(from.$name$_);\n");
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSwappingCode(io::Printer* printer) const {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_, "$name$_.Swap(&other->$name$_);\n");
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateConstructorCode(io::Printer* printer) const {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Not needed for repeated fields.
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateMergeFromCodedStream(io::Printer* printer) const {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (descriptor_->type() == FieldDescriptor::TYPE_MESSAGE) {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n"
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      input, add_$name$()));\n");
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "DO_(::google::protobuf::internal::WireFormatLite::ReadGroupNoVirtual(\n"
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      $number$, input, add_$name$()));\n");
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSerializeWithCachedSizes(io::Printer* printer) const {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "for (int i = 0; i < this->$name$_size(); i++) {\n"
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  ::google::protobuf::internal::WireFormatLite::Write$stream_writer$(\n"
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    $number$, this->$name$(i), output);\n"
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n");
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "for (int i = 0; i < this->$name$_size(); i++) {\n"
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  target = ::google::protobuf::internal::WireFormatLite::\n"
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    Write$declared_type$NoVirtualToArray(\n"
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "      $number$, this->$name$(i), target);\n"
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n");
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateByteSize(io::Printer* printer) const {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "total_size += $tag_size$ * this->$name$_size();\n"
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "for (int i = 0; i < this->$name$_size(); i++) {\n"
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  total_size +=\n"
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    ::google::protobuf::internal::WireFormatLite::$declared_type$SizeNoVirtual(\n"
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "      this->$name$(i));\n"
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n");
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace cpp
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace compiler
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace protobuf
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace google
299