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// This header is logically internal, but is made public because it is used
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// from protocol-compiler-generated code, which may reside in other components.
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifndef GOOGLE_PROTOBUF_GENERATED_MESSAGE_REFLECTION_H__
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_REFLECTION_H__
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <string>
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <vector>
43a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/stubs/common.h>
44a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// TODO(jasonh): Remove this once the compiler change to directly include this
45a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// is released to components.
46a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/generated_enum_reflection.h>
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/message.h>
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/unknown_field_set.h>
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
52a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace upb {
53a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace google_opensource {
54a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass GMR_Handlers;
55a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}  // namespace google_opensource
56a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}  // namespace upb
57a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  class DescriptorPool;
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace internal {
64a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass DefaultEmptyOneof;
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in this file.
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass GeneratedMessageReflection;
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Defined in other files.
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ExtensionSet;             // extension_set.h
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS CLASS IS NOT INTENDED FOR DIRECT USE.  It is intended for use
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// by generated code.  This class is just a big hack that reduces code
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// size.
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A GeneratedMessageReflection is an implementation of Reflection
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// which expects all fields to be backed by simple variables located in
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// memory.  The locations are given using a base pointer and a set of
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// offsets.
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// It is required that the user represents fields of each type in a standard
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// way, so that GeneratedMessageReflection can cast the void* pointer to
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// the appropriate type.  For primitive fields and string fields, each field
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// should be represented using the obvious C++ primitive type.  Enums and
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Messages are different:
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  - Singular Message fields are stored as a pointer to a Message.  These
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//    should start out NULL, except for in the default instance where they
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//    should start out pointing to other default instances.
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  - Enum fields are stored as an int.  This int must always contain
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//    a valid value, such that EnumDescriptor::FindValueByNumber() would
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//    not return NULL.
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  - Repeated fields are stored as RepeatedFields or RepeatedPtrFields
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//    of whatever type the individual field would be.  Strings and
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//    Messages use RepeatedPtrFields while everything else uses
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//    RepeatedFields.
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOBUF_EXPORT GeneratedMessageReflection : public Reflection {
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Constructs a GeneratedMessageReflection.
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Parameters:
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   descriptor:    The descriptor for the message type being implemented.
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   default_instance:  The default instance of the message.  This is only
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //                  used to obtain pointers to default instances of embedded
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //                  messages, which GetMessage() will return if the particular
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //                  sub-message has not been initialized yet.  (Thus, all
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //                  embedded message fields *must* have non-NULL pointers
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //                  in the default instance.)
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   offsets:       An array of ints giving the byte offsets, relative to
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //                  the start of the message object, of each field.  These can
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //                  be computed at compile time using the
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //                  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET() macro, defined
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //                  below.
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   has_bits_offset:  Offset in the message of an array of uint32s of size
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //                  descriptor->field_count()/32, rounded up.  This is a
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //                  bitfield where each bit indicates whether or not the
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //                  corresponding field of the message has been initialized.
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //                  The bit for field index i is obtained by the expression:
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //                    has_bits[i / 32] & (1 << (i % 32))
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   unknown_fields_offset:  Offset in the message of the UnknownFieldSet for
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //                  the message.
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   extensions_offset:  Offset in the message of the ExtensionSet for the
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //                  message, or -1 if the message type has no extension
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //                  ranges.
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   pool:          DescriptorPool to search for extension definitions.  Only
124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //                  used by FindKnownExtensionByName() and
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //                  FindKnownExtensionByNumber().
126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   factory:       MessageFactory to use to construct extension messages.
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   object_size:   The size of a message object of this type, as measured
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //                  by sizeof().
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GeneratedMessageReflection(const Descriptor* descriptor,
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                             const Message* default_instance,
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                             const int offsets[],
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                             int has_bits_offset,
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                             int unknown_fields_offset,
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                             int extensions_offset,
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                             const DescriptorPool* pool,
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                             MessageFactory* factory,
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                             int object_size);
138a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
139a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Similar with the construction above. Call this construction if the
140a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // message has oneof definition.
141a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Parameters:
142a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //   offsets:       An array of ints giving the byte offsets.
143a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //                  For each oneof field, the offset is relative to the
144a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //                  default_oneof_instance. These can be computed at compile
145a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //                  time using the
146a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //                  PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET() macro.
147a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //                  For each none oneof field, the offset is related to
148a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //                  the start of the message object.  These can be computed
149a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //                  at compile time using the
150a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //                  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET() macro.
151a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //                  Besides offsets for all fields, this array also contains
152a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //                  offsets for oneof unions. The offset of the i-th oneof
153a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //                  union is offsets[descriptor->field_count() + i].
154a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //   default_oneof_instance: The default instance of the oneofs. It is a
155a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //                  struct holding the default value of all oneof fields
156a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //                  for this message. It is only used to obtain pointers
157a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //                  to default instances of oneof fields, which Get
158a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //                  methods will return if the field is not set.
159a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //   oneof_case_offset:  Offset in the message of an array of uint32s of
160a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //                  size descriptor->oneof_decl_count().  Each uint32
161a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //                  indicates what field is set for each oneof.
162a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //   other parameters are the same with the construction above.
163a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  GeneratedMessageReflection(const Descriptor* descriptor,
164a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                             const Message* default_instance,
165a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                             const int offsets[],
166a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                             int has_bits_offset,
167a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                             int unknown_fields_offset,
168a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                             int extensions_offset,
169a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                             const void* default_oneof_instance,
170a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                             int oneof_case_offset,
171a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                             const DescriptorPool* pool,
172a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                             MessageFactory* factory,
173a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                             int object_size);
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ~GeneratedMessageReflection();
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // implements Reflection -------------------------------------------
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const UnknownFieldSet& GetUnknownFields(const Message& message) const;
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  UnknownFieldSet* MutableUnknownFields(Message* message) const;
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int SpaceUsed(const Message& message) const;
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool HasField(const Message& message, const FieldDescriptor* field) const;
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int FieldSize(const Message& message, const FieldDescriptor* field) const;
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void ClearField(Message* message, const FieldDescriptor* field) const;
186a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  bool HasOneof(const Message& message,
187a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                const OneofDescriptor* oneof_descriptor) const;
188a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void ClearOneof(Message* message, const OneofDescriptor* field) const;
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void RemoveLast(Message* message, const FieldDescriptor* field) const;
190a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  Message* ReleaseLast(Message* message, const FieldDescriptor* field) const;
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void Swap(Message* message1, Message* message2) const;
192a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void SwapFields(Message* message1, Message* message2,
193a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                  const vector<const FieldDescriptor*>& fields) const;
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SwapElements(Message* message, const FieldDescriptor* field,
195a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                    int index1, int index2) const;
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void ListFields(const Message& message,
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                  vector<const FieldDescriptor*>* output) const;
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int32  GetInt32 (const Message& message,
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                   const FieldDescriptor* field) const;
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int64  GetInt64 (const Message& message,
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                   const FieldDescriptor* field) const;
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint32 GetUInt32(const Message& message,
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                   const FieldDescriptor* field) const;
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint64 GetUInt64(const Message& message,
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                   const FieldDescriptor* field) const;
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  float  GetFloat (const Message& message,
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                   const FieldDescriptor* field) const;
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  double GetDouble(const Message& message,
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                   const FieldDescriptor* field) const;
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool   GetBool  (const Message& message,
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                   const FieldDescriptor* field) const;
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string GetString(const Message& message,
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                   const FieldDescriptor* field) const;
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string& GetStringReference(const Message& message,
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                   const FieldDescriptor* field,
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                   string* scratch) const;
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumValueDescriptor* GetEnum(const Message& message,
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                     const FieldDescriptor* field) const;
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Message& GetMessage(const Message& message,
221d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                            const FieldDescriptor* field,
222d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                            MessageFactory* factory = NULL) const;
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
224a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const FieldDescriptor* GetOneofFieldDescriptor(
225a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      const Message& message,
226a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      const OneofDescriptor* oneof_descriptor) const;
227a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
228a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public:
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetInt32 (Message* message,
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 const FieldDescriptor* field, int32  value) const;
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetInt64 (Message* message,
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 const FieldDescriptor* field, int64  value) const;
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetUInt32(Message* message,
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 const FieldDescriptor* field, uint32 value) const;
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetUInt64(Message* message,
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 const FieldDescriptor* field, uint64 value) const;
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetFloat (Message* message,
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 const FieldDescriptor* field, float  value) const;
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetDouble(Message* message,
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 const FieldDescriptor* field, double value) const;
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetBool  (Message* message,
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 const FieldDescriptor* field, bool   value) const;
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetString(Message* message,
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 const FieldDescriptor* field,
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 const string& value) const;
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetEnum  (Message* message, const FieldDescriptor* field,
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 const EnumValueDescriptor* value) const;
248d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  Message* MutableMessage(Message* message, const FieldDescriptor* field,
249d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                          MessageFactory* factory = NULL) const;
250a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void SetAllocatedMessage(Message* message,
251a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                           Message* sub_message,
252a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                           const FieldDescriptor* field) const;
253a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  Message* ReleaseMessage(Message* message, const FieldDescriptor* field,
254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                          MessageFactory* factory = NULL) const;
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int32  GetRepeatedInt32 (const Message& message,
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                           const FieldDescriptor* field, int index) const;
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int64  GetRepeatedInt64 (const Message& message,
259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                           const FieldDescriptor* field, int index) const;
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint32 GetRepeatedUInt32(const Message& message,
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                           const FieldDescriptor* field, int index) const;
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  uint64 GetRepeatedUInt64(const Message& message,
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                           const FieldDescriptor* field, int index) const;
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  float  GetRepeatedFloat (const Message& message,
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                           const FieldDescriptor* field, int index) const;
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  double GetRepeatedDouble(const Message& message,
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                           const FieldDescriptor* field, int index) const;
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool   GetRepeatedBool  (const Message& message,
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                           const FieldDescriptor* field, int index) const;
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string GetRepeatedString(const Message& message,
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                           const FieldDescriptor* field, int index) const;
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const string& GetRepeatedStringReference(const Message& message,
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                           const FieldDescriptor* field,
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                           int index, string* scratch) const;
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const EnumValueDescriptor* GetRepeatedEnum(const Message& message,
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                             const FieldDescriptor* field,
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                             int index) const;
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Message& GetRepeatedMessage(const Message& message,
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                    const FieldDescriptor* field,
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                    int index) const;
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Set the value of a field.
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetRepeatedInt32 (Message* message,
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                         const FieldDescriptor* field, int index, int32  value) const;
285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetRepeatedInt64 (Message* message,
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                         const FieldDescriptor* field, int index, int64  value) const;
287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetRepeatedUInt32(Message* message,
288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                         const FieldDescriptor* field, int index, uint32 value) const;
289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetRepeatedUInt64(Message* message,
290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                         const FieldDescriptor* field, int index, uint64 value) const;
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetRepeatedFloat (Message* message,
292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                         const FieldDescriptor* field, int index, float  value) const;
293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetRepeatedDouble(Message* message,
294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                         const FieldDescriptor* field, int index, double value) const;
295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetRepeatedBool  (Message* message,
296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                         const FieldDescriptor* field, int index, bool   value) const;
297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetRepeatedString(Message* message,
298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                         const FieldDescriptor* field, int index,
299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                         const string& value) const;
300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetRepeatedEnum(Message* message, const FieldDescriptor* field,
301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                       int index, const EnumValueDescriptor* value) const;
302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Get a mutable pointer to a field with a message type.
303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Message* MutableRepeatedMessage(Message* message,
304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                  const FieldDescriptor* field,
305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                  int index) const;
306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AddInt32 (Message* message,
308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 const FieldDescriptor* field, int32  value) const;
309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AddInt64 (Message* message,
310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 const FieldDescriptor* field, int64  value) const;
311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AddUInt32(Message* message,
312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 const FieldDescriptor* field, uint32 value) const;
313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AddUInt64(Message* message,
314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 const FieldDescriptor* field, uint64 value) const;
315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AddFloat (Message* message,
316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 const FieldDescriptor* field, float  value) const;
317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AddDouble(Message* message,
318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 const FieldDescriptor* field, double value) const;
319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AddBool  (Message* message,
320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 const FieldDescriptor* field, bool   value) const;
321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AddString(Message* message,
322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 const FieldDescriptor* field, const string& value) const;
323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void AddEnum(Message* message,
324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville               const FieldDescriptor* field,
325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville               const EnumValueDescriptor* value) const;
326d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  Message* AddMessage(Message* message, const FieldDescriptor* field,
327d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                      MessageFactory* factory = NULL) const;
328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* FindKnownExtensionByName(const string& name) const;
330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const FieldDescriptor* FindKnownExtensionByNumber(int number) const;
331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
332a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson protected:
333a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  virtual void* MutableRawRepeatedField(
334a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      Message* message, const FieldDescriptor* field, FieldDescriptor::CppType,
335a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      int ctype, const Descriptor* desc) const;
336a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  friend class GeneratedMessage;
339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
340a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // To parse directly into a proto2 generated class, the class GMR_Handlers
341a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // needs access to member offsets and hasbits.
342a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  friend class LIBPROTOBUF_EXPORT upb::google_opensource::GMR_Handlers;
343a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Descriptor* descriptor_;
345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const Message* default_instance_;
346a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const void* default_oneof_instance_;
347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const int* offsets_;
348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int has_bits_offset_;
350a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  int oneof_case_offset_;
351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int unknown_fields_offset_;
352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int extensions_offset_;
353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int object_size_;
354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const DescriptorPool* descriptor_pool_;
356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  MessageFactory* message_factory_;
357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename Type>
359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline const Type& GetRaw(const Message& message,
360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                            const FieldDescriptor* field) const;
361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename Type>
362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline Type* MutableRaw(Message* message,
363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                          const FieldDescriptor* field) const;
364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename Type>
365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline const Type& DefaultRaw(const FieldDescriptor* field) const;
366a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  template <typename Type>
367a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  inline const Type& DefaultOneofRaw(const FieldDescriptor* field) const;
368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline const uint32* GetHasBits(const Message& message) const;
370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline uint32* MutableHasBits(Message* message) const;
371a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  inline uint32 GetOneofCase(
372a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      const Message& message,
373a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      const OneofDescriptor* oneof_descriptor) const;
374a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  inline uint32* MutableOneofCase(
375a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      Message* message,
376a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      const OneofDescriptor* oneof_descriptor) const;
377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline const ExtensionSet& GetExtensionSet(const Message& message) const;
378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline ExtensionSet* MutableExtensionSet(Message* message) const;
379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline bool HasBit(const Message& message,
381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                     const FieldDescriptor* field) const;
382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline void SetBit(Message* message,
383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                     const FieldDescriptor* field) const;
384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline void ClearBit(Message* message,
385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                       const FieldDescriptor* field) const;
386a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  inline void SwapBit(Message* message1,
387a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                      Message* message2,
388a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                      const FieldDescriptor* field) const;
389a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
390a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // This function only swaps the field. Should swap corresponding has_bit
391a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // before or after using this function.
392a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void SwapField(Message* message1,
393a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                 Message* message2,
394a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                 const FieldDescriptor* field) const;
395a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
396a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void SwapOneofField(Message* message1,
397a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                      Message* message2,
398a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                      const OneofDescriptor* oneof_descriptor) const;
399a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
400a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  inline bool HasOneofField(const Message& message,
401a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                            const FieldDescriptor* field) const;
402a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  inline void SetOneofCase(Message* message,
403a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                           const FieldDescriptor* field) const;
404a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  inline void ClearOneofField(Message* message,
405a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                              const FieldDescriptor* field) const;
406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename Type>
408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline const Type& GetField(const Message& message,
409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                              const FieldDescriptor* field) const;
410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename Type>
411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline void SetField(Message* message,
412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                       const FieldDescriptor* field, const Type& value) const;
413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename Type>
414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline Type* MutableField(Message* message,
415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                            const FieldDescriptor* field) const;
416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename Type>
417d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  inline const Type& GetRepeatedField(const Message& message,
418d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                      const FieldDescriptor* field,
419d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                                      int index) const;
420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename Type>
421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline const Type& GetRepeatedPtrField(const Message& message,
422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                         const FieldDescriptor* field,
423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                         int index) const;
424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename Type>
425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline void SetRepeatedField(Message* message,
426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                               const FieldDescriptor* field, int index,
427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                               Type value) const;
428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename Type>
429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline Type* MutableRepeatedField(Message* message,
430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                    const FieldDescriptor* field,
431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                    int index) const;
432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename Type>
433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline void AddField(Message* message,
434d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                       const FieldDescriptor* field, const Type& value) const;
435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  template <typename Type>
436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  inline Type* AddField(Message* message,
437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                        const FieldDescriptor* field) const;
438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int GetExtensionNumberOrDie(const Descriptor* type) const;
440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GeneratedMessageReflection);
442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Returns the offset of the given field within the given aggregate type.
445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This is equivalent to the ANSI C offsetof() macro.  However, according
446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// to the C++ standard, offsetof() only works on POD types, and GCC
447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// enforces this requirement with a warning.  In practice, this rule is
448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// unnecessarily strict; there is probably no compiler or platform on
449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// which the offsets of the direct fields of a class are non-constant.
450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Fields inherited from superclasses *can* have non-constant offsets,
451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// but that's not what this macro will be used for.
452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Note that we calculate relative to the pointer value 16 here since if we
454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// just use zero, GCC complains about dereferencing a NULL pointer.  We
455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// choose 16 rather than some other number just in case the compiler would
456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// be confused by an unaligned pointer.
457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TYPE, FIELD)    \
458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static_cast<int>(                                           \
459a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      reinterpret_cast<const char*>(                          \
460a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          &reinterpret_cast<const TYPE*>(16)->FIELD) -        \
461a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      reinterpret_cast<const char*>(16))
462a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
463a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#define PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET(ONEOF, FIELD)     \
464a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  static_cast<int>(                                                   \
465a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      reinterpret_cast<const char*>(&(ONEOF->FIELD))                  \
466a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      - reinterpret_cast<const char*>(ONEOF))
467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// There are some places in proto2 where dynamic_cast would be useful as an
469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// optimization.  For example, take Message::MergeFrom(const Message& other).
470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// For a given generated message FooMessage, we generate these two methods:
471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   void MergeFrom(const FooMessage& other);
472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   void MergeFrom(const Message& other);
473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The former method can be implemented directly in terms of FooMessage's
474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// inline accessors, but the latter method must work with the reflection
475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// interface.  However, if the parameter to the latter method is actually of
476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// type FooMessage, then we'd like to be able to just call the other method
477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// as an optimization.  So, we use dynamic_cast to check this.
478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// That said, dynamic_cast requires RTTI, which many people like to disable
480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// for performance and code size reasons.  When RTTI is not available, we
481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// still need to produce correct results.  So, in this case we have to fall
482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// back to using reflection, which is what we would have done anyway if the
483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// objects were not of the exact same class.
484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// dynamic_cast_if_available() implements this logic.  If RTTI is
486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// enabled, it does a dynamic_cast.  If RTTI is disabled, it just returns
487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// NULL.
488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// If you need to compile without RTTI, simply #define GOOGLE_PROTOBUF_NO_RTTI.
490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// On MSVC, this should be detected automatically.
491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletemplate<typename To, typename From>
492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline To dynamic_cast_if_available(From from) {
493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#if defined(GOOGLE_PROTOBUF_NO_RTTI) || (defined(_MSC_VER)&&!defined(_CPPRTTI))
494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return NULL;
495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#else
496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return dynamic_cast<To>(from);
497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif
498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace internal
501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // GOOGLE_PROTOBUF_GENERATED_MESSAGE_REFLECTION_H__
505