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_field.h> 36a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <memory> 37b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#ifndef _SHARED_PTR_H 38b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/shared_ptr.h> 39b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#endif 40a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/compiler/cpp/cpp_helpers.h> 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/compiler/cpp/cpp_primitive_field.h> 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/compiler/cpp/cpp_string_field.h> 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/compiler/cpp/cpp_enum_field.h> 45b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/compiler/cpp/cpp_map_field.h> 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/compiler/cpp/cpp_message_field.h> 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor.pb.h> 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/wire_format.h> 49d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville#include <google/protobuf/io/printer.h> 50b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/logging.h> 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h> 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/strutil.h> 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google { 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace compiler { 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace cpp { 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing internal::WireFormat; 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid SetCommonFieldVariables(const FieldDescriptor* descriptor, 62a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson map<string, string>* variables, 63a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Options& options) { 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (*variables)["name"] = FieldName(descriptor); 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (*variables)["index"] = SimpleItoa(descriptor->index()); 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (*variables)["number"] = SimpleItoa(descriptor->number()); 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (*variables)["classname"] = ClassName(FieldScope(descriptor), false); 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (*variables)["declared_type"] = DeclaredTypeMethodName(descriptor->type()); 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 70b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // non_null_ptr_to_name is usable only if has_$name$ is true. It yields a 71b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // pointer that will not be NULL. Subclasses of FieldGenerator may set 72b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // (*variables)["non_null_ptr_to_name"] differently. 73b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*variables)["non_null_ptr_to_name"] = 74b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StrCat("&this->", FieldName(descriptor), "()"); 75b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (*variables)["tag_size"] = SimpleItoa( 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville WireFormat::TagSize(descriptor->number(), descriptor->type())); 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (*variables)["deprecation"] = descriptor->options().deprecated() 79d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville ? " PROTOBUF_DEPRECATED" : ""; 80b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*variables)["deprecated_attr"] = descriptor->options().deprecated() 81b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer ? "PROTOBUF_DEPRECATED_ATTR " : ""; 82d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 83a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["cppget"] = "Get"; 84b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 85b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (HasFieldPresence(descriptor->file())) { 86b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*variables)["set_hasbit"] = 87b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "set_has_" + FieldName(descriptor) + "();"; 88b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*variables)["clear_hasbit"] = 89b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "clear_has_" + FieldName(descriptor) + "();"; 90b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } else { 91b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*variables)["set_hasbit"] = ""; 92b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*variables)["clear_hasbit"] = ""; 93b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 94b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 95b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // By default, empty string, so that generic code used for both oneofs and 96b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // singular fields can be written. 97b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*variables)["oneof_prefix"] = ""; 98a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 99a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 100a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid SetCommonOneofFieldVariables(const FieldDescriptor* descriptor, 101a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson map<string, string>* variables) { 102b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const string prefix = descriptor->containing_oneof()->name() + "_."; 103b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*variables)["oneof_prefix"] = prefix; 104a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["oneof_name"] = descriptor->containing_oneof()->name(); 105b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*variables)["non_null_ptr_to_name"] = 106b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StrCat(prefix, (*variables)["name"], "_"); 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleFieldGenerator::~FieldGenerator() {} 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 111d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savillevoid FieldGenerator:: 112d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleGenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const { 113d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Reaching here indicates a bug. Cases are: 114d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // - This FieldGenerator should support packing, but this method should be 115d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // overridden. 116d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // - This FieldGenerator doesn't support packing, and this method should 117d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // never have been called. 118d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville GOOGLE_LOG(FATAL) << "GenerateMergeFromCodedStreamWithPacking() " 119d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville << "called on field generator that does not support packing."; 120d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 121d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville} 122d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 123a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonFieldGeneratorMap::FieldGeneratorMap(const Descriptor* descriptor, 124a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Options& options) 125a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson : descriptor_(descriptor), 126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer options_(options), 127a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field_generators_( 128b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer new google::protobuf::scoped_ptr<FieldGenerator>[descriptor->field_count()]) { 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Construct all the FieldGenerators. 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for (int i = 0; i < descriptor->field_count(); i++) { 131a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson field_generators_[i].reset(MakeGenerator(descriptor->field(i), options)); 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 135a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonFieldGenerator* FieldGeneratorMap::MakeGenerator(const FieldDescriptor* field, 136a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const Options& options) { 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if (field->is_repeated()) { 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville switch (field->cpp_type()) { 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_MESSAGE: 140b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (field->is_map()) { 141b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return new MapFieldGenerator(field, options); 142b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } else { 143b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return new RepeatedMessageFieldGenerator(field, options); 144b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_STRING: 146d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville switch (field->options().ctype()) { 147d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville default: // RepeatedStringFieldGenerator handles unknown ctypes. 148d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville case FieldOptions::STRING: 149a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return new RepeatedStringFieldGenerator(field, options); 150a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 151a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FieldDescriptor::CPPTYPE_ENUM: 152a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return new RepeatedEnumFieldGenerator(field, options); 153a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson default: 154a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return new RepeatedPrimitiveFieldGenerator(field, options); 155a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 156a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else if (field->containing_oneof()) { 157a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson switch (field->cpp_type()) { 158a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FieldDescriptor::CPPTYPE_MESSAGE: 159a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return new MessageOneofFieldGenerator(field, options); 160a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FieldDescriptor::CPPTYPE_STRING: 161a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson switch (field->options().ctype()) { 162a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson default: // StringOneofFieldGenerator handles unknown ctypes. 163a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson case FieldOptions::STRING: 164a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return new StringOneofFieldGenerator(field, options); 165d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_ENUM: 167a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return new EnumOneofFieldGenerator(field, options); 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville default: 169a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return new PrimitiveOneofFieldGenerator(field, options); 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } else { 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville switch (field->cpp_type()) { 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_MESSAGE: 174a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return new MessageFieldGenerator(field, options); 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_STRING: 176d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville switch (field->options().ctype()) { 177d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville default: // StringFieldGenerator handles unknown ctypes. 178d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville case FieldOptions::STRING: 179a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return new StringFieldGenerator(field, options); 180d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville case FieldDescriptor::CPPTYPE_ENUM: 182a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return new EnumFieldGenerator(field, options); 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville default: 184a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return new PrimitiveFieldGenerator(field, options); 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleFieldGeneratorMap::~FieldGeneratorMap() {} 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst FieldGenerator& FieldGeneratorMap::get( 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const FieldDescriptor* field) const { 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOOGLE_CHECK_EQ(field->containing_type(), descriptor_); 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return *field_generators_[field->index()]; 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 197d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace cpp 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace compiler 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace protobuf 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace google 202