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