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_primitive_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/wire_format.h>
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/stubs/strutil.h>
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace google {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protobuf {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace compiler {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace cpp {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using internal::WireFormatLite;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For encodings with fixed sizes, returns that size in bytes.  Otherwise
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// returns -1.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int FixedSize(FieldDescriptor::Type type) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FieldDescriptor::TYPE_INT32   : return -1;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FieldDescriptor::TYPE_INT64   : return -1;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FieldDescriptor::TYPE_UINT32  : return -1;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FieldDescriptor::TYPE_UINT64  : return -1;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FieldDescriptor::TYPE_SINT32  : return -1;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FieldDescriptor::TYPE_SINT64  : return -1;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FieldDescriptor::TYPE_FIXED32 : return WireFormatLite::kFixed32Size;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FieldDescriptor::TYPE_FIXED64 : return WireFormatLite::kFixed64Size;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FieldDescriptor::TYPE_SFIXED32: return WireFormatLite::kSFixed32Size;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FieldDescriptor::TYPE_SFIXED64: return WireFormatLite::kSFixed64Size;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FieldDescriptor::TYPE_FLOAT   : return WireFormatLite::kFloatSize;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FieldDescriptor::TYPE_DOUBLE  : return WireFormatLite::kDoubleSize;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FieldDescriptor::TYPE_BOOL    : return WireFormatLite::kBoolSize;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FieldDescriptor::TYPE_ENUM    : return -1;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FieldDescriptor::TYPE_STRING  : return -1;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FieldDescriptor::TYPE_BYTES   : return -1;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FieldDescriptor::TYPE_GROUP   : return -1;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case FieldDescriptor::TYPE_MESSAGE : return -1;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // No default because we want the compiler to complain if any new
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // types are added.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GOOGLE_LOG(FATAL) << "Can't get here.";
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return -1;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetPrimitiveVariables(const FieldDescriptor* descriptor,
83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                           map<string, string>* variables,
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                           const Options& options) {
85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetCommonFieldVariables(descriptor, variables, options);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*variables)["type"] = PrimitiveTypeName(descriptor->cpp_type());
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*variables)["default"] = DefaultValue(descriptor);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*variables)["tag"] = SimpleItoa(internal::WireFormat::MakeTag(descriptor));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int fixed_size = FixedSize(descriptor->type());
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fixed_size != -1) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (*variables)["fixed_size"] = SimpleItoa(fixed_size);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*variables)["wire_format_field_type"] =
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "::google::protobuf::internal::WireFormatLite::" + FieldDescriptorProto_Type_Name(
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          static_cast<FieldDescriptorProto_Type>(descriptor->type()));
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ===================================================================
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrimitiveFieldGenerator::
103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochPrimitiveFieldGenerator(const FieldDescriptor* descriptor,
104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                        const Options& options)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  : descriptor_(descriptor) {
106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetPrimitiveVariables(descriptor, &variables_, options);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrimitiveFieldGenerator::~PrimitiveFieldGenerator() {}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrimitiveFieldGenerator::
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GeneratePrivateMembers(io::Printer* printer) const {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_, "$type$ $name$_;\n");
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrimitiveFieldGenerator::
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateAccessorDeclarations(io::Printer* printer) const {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline $type$ $name$() const$deprecation$;\n"
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline void set_$name$($type$ value)$deprecation$;\n");
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrimitiveFieldGenerator::
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateInlineAccessorDefinitions(io::Printer* printer) const {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline $type$ $classname$::$name$() const {\n"
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  return $name$_;\n"
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n"
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline void $classname$::set_$name$($type$ value) {\n"
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  set_has_$name$();\n"
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  $name$_ = value;\n"
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n");
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrimitiveFieldGenerator::
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateClearingCode(io::Printer* printer) const {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_, "$name$_ = $default$;\n");
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrimitiveFieldGenerator::
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateMergingCode(io::Printer* printer) const {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_, "set_$name$(from.$name$());\n");
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrimitiveFieldGenerator::
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSwappingCode(io::Printer* printer) const {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_, "std::swap($name$_, other->$name$_);\n");
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrimitiveFieldGenerator::
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateConstructorCode(io::Printer* printer) const {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_, "$name$_ = $default$;\n");
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrimitiveFieldGenerator::
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateMergeFromCodedStream(io::Printer* printer) const {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n"
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "         $type$, $wire_format_field_type$>(\n"
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "       input, &$name$_)));\n"
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "set_has_$name$();\n");
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrimitiveFieldGenerator::
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSerializeWithCachedSizes(io::Printer* printer) const {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "::google::protobuf::internal::WireFormatLite::Write$declared_type$("
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "$number$, this->$name$(), output);\n");
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrimitiveFieldGenerator::
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "target = ::google::protobuf::internal::WireFormatLite::Write$declared_type$ToArray("
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "$number$, this->$name$(), target);\n");
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrimitiveFieldGenerator::
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateByteSize(io::Printer* printer) const {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int fixed_size = FixedSize(descriptor_->type());
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fixed_size == -1) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "total_size += $tag_size$ +\n"
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  ::google::protobuf::internal::WireFormatLite::$declared_type$Size(\n"
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    this->$name$());\n");
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "total_size += $tag_size$ + $fixed_size$;\n");
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ===================================================================
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedPrimitiveFieldGenerator::
195ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochRepeatedPrimitiveFieldGenerator(const FieldDescriptor* descriptor,
196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                                const Options& options)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  : descriptor_(descriptor) {
198ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetPrimitiveVariables(descriptor, &variables_, options);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (descriptor->options().packed()) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    variables_["packed_reader"] = "ReadPackedPrimitive";
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    variables_["repeated_reader"] = "ReadRepeatedPrimitiveNoInline";
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    variables_["packed_reader"] = "ReadPackedPrimitiveNoInline";
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    variables_["repeated_reader"] = "ReadRepeatedPrimitive";
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedPrimitiveFieldGenerator::~RepeatedPrimitiveFieldGenerator() {}
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedPrimitiveFieldGenerator::
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GeneratePrivateMembers(io::Printer* printer) const {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "::google::protobuf::RepeatedField< $type$ > $name$_;\n");
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (descriptor_->options().packed() && HasGeneratedMethods(descriptor_->file())) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "mutable int _$name$_cached_byte_size_;\n");
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedPrimitiveFieldGenerator::
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateAccessorDeclarations(io::Printer* printer) const {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline $type$ $name$(int index) const$deprecation$;\n"
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline void set_$name$(int index, $type$ value)$deprecation$;\n"
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline void add_$name$($type$ value)$deprecation$;\n");
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline const ::google::protobuf::RepeatedField< $type$ >&\n"
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    $name$() const$deprecation$;\n"
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline ::google::protobuf::RepeatedField< $type$ >*\n"
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    mutable_$name$()$deprecation$;\n");
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedPrimitiveFieldGenerator::
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateInlineAccessorDefinitions(io::Printer* printer) const {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline $type$ $classname$::$name$(int index) const {\n"
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  return $name$_.Get(index);\n"
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n"
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline void $classname$::set_$name$(int index, $type$ value) {\n"
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  $name$_.Set(index, value);\n"
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n"
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline void $classname$::add_$name$($type$ value) {\n"
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  $name$_.Add(value);\n"
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n");
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline const ::google::protobuf::RepeatedField< $type$ >&\n"
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$classname$::$name$() const {\n"
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  return $name$_;\n"
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n"
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "inline ::google::protobuf::RepeatedField< $type$ >*\n"
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$classname$::mutable_$name$() {\n"
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  return &$name$_;\n"
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n");
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedPrimitiveFieldGenerator::
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateClearingCode(io::Printer* printer) const {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_, "$name$_.Clear();\n");
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedPrimitiveFieldGenerator::
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateMergingCode(io::Printer* printer) const {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_, "$name$_.MergeFrom(from.$name$_);\n");
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedPrimitiveFieldGenerator::
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSwappingCode(io::Printer* printer) const {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_, "$name$_.Swap(&other->$name$_);\n");
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedPrimitiveFieldGenerator::
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateConstructorCode(io::Printer* printer) const {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Not needed for repeated fields.
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedPrimitiveFieldGenerator::
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateMergeFromCodedStream(io::Printer* printer) const {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "DO_((::google::protobuf::internal::WireFormatLite::$repeated_reader$<\n"
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "         $type$, $wire_format_field_type$>(\n"
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "       $tag_size$, $tag$, input, this->mutable_$name$())));\n");
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedPrimitiveFieldGenerator::
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "DO_((::google::protobuf::internal::WireFormatLite::$packed_reader$<\n"
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "         $type$, $wire_format_field_type$>(\n"
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "       input, this->mutable_$name$())));\n");
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedPrimitiveFieldGenerator::
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSerializeWithCachedSizes(io::Printer* printer) const {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (descriptor_->options().packed()) {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Write the tag and the size.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "if (this->$name$_size() > 0) {\n"
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  ::google::protobuf::internal::WireFormatLite::WriteTag("
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "$number$, "
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, "
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "output);\n"
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  output->WriteVarint32(_$name$_cached_byte_size_);\n"
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}\n");
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "for (int i = 0; i < this->$name$_size(); i++) {\n");
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (descriptor_->options().packed()) {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  ::google::protobuf::internal::WireFormatLite::Write$declared_type$NoTag(\n"
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    this->$name$(i), output);\n");
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  ::google::protobuf::internal::WireFormatLite::Write$declared_type$(\n"
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    $number$, this->$name$(i), output);\n");
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print("}\n");
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedPrimitiveFieldGenerator::
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (descriptor_->options().packed()) {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Write the tag and the size.
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "if (this->$name$_size() > 0) {\n"
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  target = ::google::protobuf::internal::WireFormatLite::WriteTagToArray(\n"
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    $number$,\n"
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED,\n"
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    target);\n"
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  target = ::google::protobuf::io::CodedOutputStream::WriteVarint32ToArray(\n"
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    _$name$_cached_byte_size_, target);\n"
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}\n");
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "for (int i = 0; i < this->$name$_size(); i++) {\n");
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (descriptor_->options().packed()) {
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  target = ::google::protobuf::internal::WireFormatLite::\n"
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    Write$declared_type$NoTagToArray(this->$name$(i), target);\n");
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  target = ::google::protobuf::internal::WireFormatLite::\n"
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    Write$declared_type$ToArray($number$, this->$name$(i), target);\n");
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print("}\n");
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedPrimitiveFieldGenerator::
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateByteSize(io::Printer* printer) const {
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "{\n"
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  int data_size = 0;\n");
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Indent();
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int fixed_size = FixedSize(descriptor_->type());
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fixed_size == -1) {
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "for (int i = 0; i < this->$name$_size(); i++) {\n"
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  data_size += ::google::protobuf::internal::WireFormatLite::\n"
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    $declared_type$Size(this->$name$(i));\n"
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}\n");
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "data_size = $fixed_size$ * this->$name$_size();\n");
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (descriptor_->options().packed()) {
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "if (data_size > 0) {\n"
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  total_size += $tag_size$ +\n"
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    ::google::protobuf::internal::WireFormatLite::Int32Size(data_size);\n"
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}\n"
372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n"
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "_$name$_cached_byte_size_ = data_size;\n"
374ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      "GOOGLE_SAFE_CONCURRENT_WRITES_END();\n"
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "total_size += data_size;\n");
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "total_size += $tag_size$ * this->$name$_size() + data_size;\n");
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Outdent();
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print("}\n");
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace cpp
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace compiler
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace protobuf
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace google
388