1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc.  All rights reserved.
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/
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_MESSAGE_H__
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_H__
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <string>
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h>
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/compiler/cpp/cpp_field.h>
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  namespace io {
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    class Printer;             // printer.h
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace compiler {
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace cpp {
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass EnumGenerator;           // enum.h
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ExtensionGenerator;      // extension.h
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass MessageGenerator {
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // See generator.cc for the meaning of dllexport_decl.
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  explicit MessageGenerator(const Descriptor* descriptor,
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                            const string& dllexport_decl);
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ~MessageGenerator();
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Header stuff.
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate foward declarations for this class and all its nested types.
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateForwardDeclaration(io::Printer* printer);
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate definitions of all nested enums (must come before class
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // definitions because those classes use the enums definitions).
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateEnumDefinitions(io::Printer* printer);
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate specializations of GetEnumDescriptor<MyEnum>().
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Precondition: in ::google::protobuf namespace.
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateGetEnumDescriptorSpecializations(io::Printer* printer);
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate definitions for this class and all its nested types.
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateClassDefinition(io::Printer* printer);
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate definitions of inline methods (placed at the end of the header
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // file).
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateInlineMethods(io::Printer* printer);
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Source file stuff.
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate code which declares all the global descriptor pointers which
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // will be initialized by the methods below.
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateDescriptorDeclarations(io::Printer* printer);
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate code that initializes the global variable storing the message's
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // descriptor.
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateDescriptorInitializer(io::Printer* printer, int index);
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate code that calls MessageFactory::InternalRegisterGeneratedMessage()
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // for all types.
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateTypeRegistrations(io::Printer* printer);
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generates code that allocates the message's default instance.
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateDefaultInstanceAllocator(io::Printer* printer);
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generates code that initializes the message's default instance.  This
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // is separate from allocating because all default instances must be
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // allocated before any can be initialized.
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateDefaultInstanceInitializer(io::Printer* printer);
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generates code that should be run when ShutdownProtobufLibrary() is called,
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // to delete all dynamically-allocated objects.
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateShutdownCode(io::Printer* printer);
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate all non-inline methods for this class.
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateClassMethods(io::Printer* printer);
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate declarations and definitions of accessors for fields.
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateFieldAccessorDeclarations(io::Printer* printer);
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateFieldAccessorDefinitions(io::Printer* printer);
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate the field offsets array.
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateOffsets(io::Printer* printer);
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate constructors and destructor.
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateStructors(io::Printer* printer);
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The compiler typically generates multiple copies of each constructor and
124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // destructor: http://gcc.gnu.org/bugs.html#nonbugs_cxx
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Placing common code in a separate method reduces the generated code size.
126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate the shared constructor code.
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateSharedConstructorCode(io::Printer* printer);
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate the shared destructor code.
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateSharedDestructorCode(io::Printer* printer);
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate standard Message methods.
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateClear(io::Printer* printer);
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateMergeFromCodedStream(io::Printer* printer);
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateSerializeWithCachedSizes(io::Printer* printer);
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateSerializeWithCachedSizesToArray(io::Printer* printer);
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateSerializeWithCachedSizesBody(io::Printer* printer,
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                            bool to_array);
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateByteSize(io::Printer* printer);
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateMergeFrom(io::Printer* printer);
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateCopyFrom(io::Printer* printer);
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateSwap(io::Printer* printer);
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateIsInitialized(io::Printer* printer);
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Helpers for GenerateSerializeWithCachedSizes().
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateSerializeOneField(io::Printer* printer,
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                 const FieldDescriptor* field,
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                 bool unbounded);
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void GenerateSerializeOneExtensionRange(
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      io::Printer* printer, const Descriptor::ExtensionRange* range,
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      bool unbounded);
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
153d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* descriptor_;
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string classname_;
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string dllexport_decl_;
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  FieldGeneratorMap field_generators_;
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  scoped_array<scoped_ptr<MessageGenerator> > nested_generators_;
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  scoped_array<scoped_ptr<EnumGenerator> > enum_generators_;
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  scoped_array<scoped_ptr<ExtensionGenerator> > extension_generators_;
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageGenerator);
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace cpp
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace compiler
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_H__
171