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#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_FIELD_H__
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_PROTOBUF_COMPILER_CPP_FIELD_H__
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <map>
39a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <memory>
40b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#ifndef _SHARED_PTR_H
41b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/shared_ptr.h>
42b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#endif
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <string>
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor.h>
46a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/compiler/cpp/cpp_options.h>
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  namespace io {
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    class Printer;             // printer.h
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace compiler {
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace cpp {
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Helper function: set variables in the map that are the same for all
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// field code generators.
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ['name', 'index', 'number', 'classname', 'declared_type', 'tag_size',
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 'deprecation'].
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid SetCommonFieldVariables(const FieldDescriptor* descriptor,
64a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                             map<string, string>* variables,
65a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                             const Options& options);
66a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
67a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid SetCommonOneofFieldVariables(const FieldDescriptor* descriptor,
68a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                  map<string, string>* variables);
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FieldGenerator {
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
72b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  explicit FieldGenerator(const Options& options) : options_(options) {}
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual ~FieldGenerator();
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate lines of code declaring members fields of the message class
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // needed to represent this field.  These are placed inside the message
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // class.
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void GeneratePrivateMembers(io::Printer* printer) const = 0;
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
80a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Generate static default variable for this field. These are placed inside
81a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // the message class. Most field types don't need this, so the default
82a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // implementation is empty.
83b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  virtual void GenerateStaticMembers(io::Printer* /*printer*/) const {}
84b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
85b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Generate prototypes for accessors that will manipulate imported
86b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // messages inline.  These are for .proto.h headers.
87b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  //
88b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // In .proto.h mode, the headers of imports are not #included. However,
89b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // functions that manipulate the imported message types need access to
90b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // the class definition of the imported message, meaning that the headers
91b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // must be #included. To get around this, functions that manipulate
92b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // imported message objects are defined as dependent functions in a base
93b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // template class. By making them dependent template functions, the
94b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // function templates will not be instantiated until they are called, so
95b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // we can defer to those translation units to #include the necessary
96b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // generated headers.
97b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  //
98b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // See:
99b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // http://en.cppreference.com/w/cpp/language/class_template#Implicit_instantiation
100b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  //
101b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Most field types don't need this, so the default implementation is empty.
102b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  virtual void GenerateDependentAccessorDeclarations(
103b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      io::Printer* printer) const {}
104a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate prototypes for all of the accessor functions related to this
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // field.  These are placed inside the class definition.
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void GenerateAccessorDeclarations(io::Printer* printer) const = 0;
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
109b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Generate inline definitions of depenent accessor functions for this field.
110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // These are placed inside the header after all class definitions.
111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  virtual void GenerateDependentInlineAccessorDefinitions(
112b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    io::Printer* printer) const {}
113b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate inline definitions of accessor functions for this field.
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // These are placed inside the header after all class definitions.
116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // In non-.proto.h mode, this generates dependent accessor functions as well.
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void GenerateInlineAccessorDefinitions(
118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    io::Printer* printer, bool is_inline) const = 0;
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate definitions of accessors that aren't inlined.  These are
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // placed somewhere in the .cc file.
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Most field types don't need this, so the default implementation is empty.
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void GenerateNonInlineAccessorDefinitions(
124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    io::Printer* /*printer*/) const {}
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate lines of code (statements, not declarations) which clear the
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // field.  This is used to define the clear_$name$() method as well as
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // the Clear() method for the whole message.
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void GenerateClearingCode(io::Printer* printer) const = 0;
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate lines of code (statements, not declarations) which merges the
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // contents of the field from the current message to the target message,
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // which is stored in the generated code variable "from".
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // This is used to fill in the MergeFrom method for the whole message.
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Details of this usage can be found in message.cc under the
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // GenerateMergeFrom method.
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void GenerateMergingCode(io::Printer* printer) const = 0;
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate lines of code (statements, not declarations) which swaps
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // this field and the corresponding field of another message, which
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // is stored in the generated code variable "other". This is used to
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // define the Swap method. Details of usage can be found in
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // message.cc under the GenerateSwap method.
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void GenerateSwappingCode(io::Printer* printer) const = 0;
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate initialization code for private members declared by
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // GeneratePrivateMembers(). These go into the message class's SharedCtor()
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // method, invoked by each of the generated constructors.
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void GenerateConstructorCode(io::Printer* printer) const = 0;
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate any code that needs to go in the class's SharedDtor() method,
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // invoked by the destructor.
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Most field types don't need this, so the default implementation is empty.
154b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  virtual void GenerateDestructorCode(io::Printer* /*printer*/) const {}
155b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
156b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Generate a manual destructor invocation for use when the message is on an
157b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // arena. The code that this method generates will be executed inside a
158b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // shared-for-the-whole-message-class method registered with OwnDestructor().
159b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // The method should return |true| if it generated any code that requires a
160b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // call; this allows the message generator to eliminate the OwnDestructor()
161b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // registration if no fields require it.
162b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  virtual bool GenerateArenaDestructorCode(io::Printer* printer) const {
163b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return false;
164b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
166a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Generate code that allocates the fields's default instance.
167b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  virtual void GenerateDefaultInstanceAllocator(io::Printer* /*printer*/)
168b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      const {}
169a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
170a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Generate code that should be run when ShutdownProtobufLibrary() is called,
171a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // to delete all dynamically-allocated objects.
172b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  virtual void GenerateShutdownCode(io::Printer* /*printer*/) const {}
173a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate lines to decode this field, which will be placed inside the
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // message's MergeFromCodedStream() method.
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void GenerateMergeFromCodedStream(io::Printer* printer) const = 0;
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
178d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // Generate lines to decode this field from a packed value, which will be
179d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // placed inside the message's MergeFromCodedStream() method.
180d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  virtual void GenerateMergeFromCodedStreamWithPacking(io::Printer* printer)
181d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      const;
182d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate lines to serialize this field, which are placed within the
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // message's SerializeWithCachedSizes() method.
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void GenerateSerializeWithCachedSizes(io::Printer* printer) const = 0;
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate lines to serialize this field directly to the array "target",
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // which are placed within the message's SerializeWithCachedSizesToArray()
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // method. This must also advance "target" past the written bytes.
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void GenerateSerializeWithCachedSizesToArray(
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      io::Printer* printer) const = 0;
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate lines to compute the serialized size of this field, which
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // are placed in the message's ByteSize() method.
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void GenerateByteSize(io::Printer* printer) const = 0;
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
197b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer protected:
198b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  const Options& options_;
199b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGenerator);
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Convenience class which constructs FieldGenerators for a Descriptor.
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FieldGeneratorMap {
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
207b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  FieldGeneratorMap(const Descriptor* descriptor, const Options& options);
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ~FieldGeneratorMap();
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldGenerator& get(const FieldDescriptor* field) const;
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* descriptor_;
214b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  const Options& options_;
215b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  google::protobuf::scoped_array<google::protobuf::scoped_ptr<FieldGenerator> > field_generators_;
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
217a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  static FieldGenerator* MakeGenerator(const FieldDescriptor* field,
218a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                       const Options& options);
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGeneratorMap);
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
223d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace cpp
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace compiler
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // GOOGLE_PROTOBUF_COMPILER_CPP_FIELD_H__
230