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