|
|
|
@ -84,12 +84,12 @@ |
|
|
|
|
// // Get the descriptors for the fields we're interested in and verify
|
|
|
|
|
// // their types.
|
|
|
|
|
// const FieldDescriptor* text_field = descriptor->FindFieldByName("text");
|
|
|
|
|
// assert(text_field != NULL);
|
|
|
|
|
// assert(text_field != nullptr);
|
|
|
|
|
// assert(text_field->type() == FieldDescriptor::TYPE_STRING);
|
|
|
|
|
// assert(text_field->label() == FieldDescriptor::LABEL_OPTIONAL);
|
|
|
|
|
// const FieldDescriptor* numbers_field = descriptor->
|
|
|
|
|
// FindFieldByName("numbers");
|
|
|
|
|
// assert(numbers_field != NULL);
|
|
|
|
|
// assert(numbers_field != nullptr);
|
|
|
|
|
// assert(numbers_field->type() == FieldDescriptor::TYPE_INT32);
|
|
|
|
|
// assert(numbers_field->label() == FieldDescriptor::LABEL_REPEATED);
|
|
|
|
|
//
|
|
|
|
@ -119,6 +119,7 @@ |
|
|
|
|
#include <google/protobuf/stubs/common.h> |
|
|
|
|
#include <google/protobuf/arena.h> |
|
|
|
|
#include <google/protobuf/descriptor.h> |
|
|
|
|
#include <google/protobuf/generated_message_reflection.h> |
|
|
|
|
#include <google/protobuf/message_lite.h> |
|
|
|
|
#include <google/protobuf/port.h> |
|
|
|
|
|
|
|
|
@ -141,6 +142,8 @@ class Reflection; |
|
|
|
|
class MessageFactory; |
|
|
|
|
|
|
|
|
|
// Defined in other files.
|
|
|
|
|
class AssignDescriptorsHelper; |
|
|
|
|
class DynamicMessageFactory; |
|
|
|
|
class MapKey; |
|
|
|
|
class MapValueRef; |
|
|
|
|
class MapIterator; |
|
|
|
@ -212,11 +215,11 @@ class PROTOBUF_EXPORT Message : public MessageLite { |
|
|
|
|
Message* New() const override = 0; |
|
|
|
|
|
|
|
|
|
// Construct a new instance on the arena. Ownership is passed to the caller
|
|
|
|
|
// if arena is a NULL. Default implementation allows for API compatibility
|
|
|
|
|
// if arena is a nullptr. Default implementation allows for API compatibility
|
|
|
|
|
// during the Arena transition.
|
|
|
|
|
Message* New(Arena* arena) const override { |
|
|
|
|
Message* message = New(); |
|
|
|
|
if (arena != NULL) { |
|
|
|
|
if (arena != nullptr) { |
|
|
|
|
arena->Own(message); |
|
|
|
|
} |
|
|
|
|
return message; |
|
|
|
@ -394,23 +397,19 @@ class MutableRepeatedFieldRef; |
|
|
|
|
// double the message's memory footprint, probably worse. Allocating the
|
|
|
|
|
// objects on-demand, on the other hand, would be expensive and prone to
|
|
|
|
|
// memory leaks. So, instead we ended up with this flat interface.
|
|
|
|
|
class PROTOBUF_EXPORT Reflection { |
|
|
|
|
class PROTOBUF_EXPORT Reflection final { |
|
|
|
|
public: |
|
|
|
|
inline Reflection() {} |
|
|
|
|
virtual ~Reflection(); |
|
|
|
|
|
|
|
|
|
// Get the UnknownFieldSet for the message. This contains fields which
|
|
|
|
|
// were seen when the Message was parsed but were not recognized according
|
|
|
|
|
// to the Message's definition.
|
|
|
|
|
virtual const UnknownFieldSet& GetUnknownFields( |
|
|
|
|
const Message& message) const = 0; |
|
|
|
|
const UnknownFieldSet& GetUnknownFields(const Message& message) const; |
|
|
|
|
// Get a mutable pointer to the UnknownFieldSet for the message. This
|
|
|
|
|
// contains fields which were seen when the Message was parsed but were not
|
|
|
|
|
// recognized according to the Message's definition.
|
|
|
|
|
virtual UnknownFieldSet* MutableUnknownFields(Message* message) const = 0; |
|
|
|
|
UnknownFieldSet* MutableUnknownFields(Message* message) const; |
|
|
|
|
|
|
|
|
|
// Estimate the amount of memory used by the message object.
|
|
|
|
|
virtual size_t SpaceUsedLong(const Message& message) const = 0; |
|
|
|
|
size_t SpaceUsedLong(const Message& message) const; |
|
|
|
|
|
|
|
|
|
PROTOBUF_DEPRECATED_MSG("Please use SpaceUsedLong() instead") |
|
|
|
|
int SpaceUsed(const Message& message) const { |
|
|
|
@ -418,37 +417,26 @@ class PROTOBUF_EXPORT Reflection { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Check if the given non-repeated field is set.
|
|
|
|
|
virtual bool HasField(const Message& message, |
|
|
|
|
const FieldDescriptor* field) const = 0; |
|
|
|
|
bool HasField(const Message& message, const FieldDescriptor* field) const; |
|
|
|
|
|
|
|
|
|
// Get the number of elements of a repeated field.
|
|
|
|
|
virtual int FieldSize(const Message& message, |
|
|
|
|
const FieldDescriptor* field) const = 0; |
|
|
|
|
int FieldSize(const Message& message, const FieldDescriptor* field) const; |
|
|
|
|
|
|
|
|
|
// Clear the value of a field, so that HasField() returns false or
|
|
|
|
|
// FieldSize() returns zero.
|
|
|
|
|
virtual void ClearField(Message* message, |
|
|
|
|
const FieldDescriptor* field) const = 0; |
|
|
|
|
void ClearField(Message* message, const FieldDescriptor* field) const; |
|
|
|
|
|
|
|
|
|
// Check if the oneof is set. Returns true if any field in oneof
|
|
|
|
|
// is set, false otherwise.
|
|
|
|
|
// TODO(jieluo) - make it pure virtual after updating all
|
|
|
|
|
// the subclasses.
|
|
|
|
|
virtual bool HasOneof(const Message& /*message*/, |
|
|
|
|
const OneofDescriptor* /*oneof_descriptor*/) const { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
bool HasOneof(const Message& message, |
|
|
|
|
const OneofDescriptor* oneof_descriptor) const; |
|
|
|
|
|
|
|
|
|
virtual void ClearOneof(Message* /*message*/, |
|
|
|
|
const OneofDescriptor* /*oneof_descriptor*/) const {} |
|
|
|
|
void ClearOneof(Message* message, |
|
|
|
|
const OneofDescriptor* oneof_descriptor) const; |
|
|
|
|
|
|
|
|
|
// Returns the field descriptor if the oneof is set. NULL otherwise.
|
|
|
|
|
// TODO(jieluo) - make it pure virtual.
|
|
|
|
|
virtual const FieldDescriptor* GetOneofFieldDescriptor( |
|
|
|
|
const Message& /*message*/, |
|
|
|
|
const OneofDescriptor* /*oneof_descriptor*/) const { |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
// Returns the field descriptor if the oneof is set. nullptr otherwise.
|
|
|
|
|
const FieldDescriptor* GetOneofFieldDescriptor( |
|
|
|
|
const Message& message, const OneofDescriptor* oneof_descriptor) const; |
|
|
|
|
|
|
|
|
|
// Removes the last element of a repeated field.
|
|
|
|
|
// We don't provide a way to remove any element other than the last
|
|
|
|
@ -457,24 +445,21 @@ class PROTOBUF_EXPORT Reflection { |
|
|
|
|
// than the last, the best way to do it is to re-arrange the elements
|
|
|
|
|
// (using Swap()) so that the one you want removed is at the end, then
|
|
|
|
|
// call RemoveLast().
|
|
|
|
|
virtual void RemoveLast(Message* message, |
|
|
|
|
const FieldDescriptor* field) const = 0; |
|
|
|
|
void RemoveLast(Message* message, const FieldDescriptor* field) const; |
|
|
|
|
// Removes the last element of a repeated message field, and returns the
|
|
|
|
|
// pointer to the caller. Caller takes ownership of the returned pointer.
|
|
|
|
|
virtual Message* ReleaseLast(Message* message, |
|
|
|
|
const FieldDescriptor* field) const = 0; |
|
|
|
|
Message* ReleaseLast(Message* message, const FieldDescriptor* field) const; |
|
|
|
|
|
|
|
|
|
// Swap the complete contents of two messages.
|
|
|
|
|
virtual void Swap(Message* message1, Message* message2) const = 0; |
|
|
|
|
void Swap(Message* message1, Message* message2) const; |
|
|
|
|
|
|
|
|
|
// Swap fields listed in fields vector of two messages.
|
|
|
|
|
virtual void SwapFields( |
|
|
|
|
Message* message1, Message* message2, |
|
|
|
|
const std::vector<const FieldDescriptor*>& fields) const = 0; |
|
|
|
|
void SwapFields(Message* message1, Message* message2, |
|
|
|
|
const std::vector<const FieldDescriptor*>& fields) const; |
|
|
|
|
|
|
|
|
|
// Swap two elements of a repeated field.
|
|
|
|
|
virtual void SwapElements(Message* message, const FieldDescriptor* field, |
|
|
|
|
int index1, int index2) const = 0; |
|
|
|
|
void SwapElements(Message* message, const FieldDescriptor* field, int index1, |
|
|
|
|
int index2) const; |
|
|
|
|
|
|
|
|
|
// List all fields of the message which are currently set, except for unknown
|
|
|
|
|
// fields, but including extension known to the parser (i.e. compiled in).
|
|
|
|
@ -484,45 +469,36 @@ class PROTOBUF_EXPORT Reflection { |
|
|
|
|
// ordered by field number.
|
|
|
|
|
// Use Reflection::GetUnknownFields() or message.unknown_fields() to also get
|
|
|
|
|
// access to fields/extensions unknown to the parser.
|
|
|
|
|
virtual void ListFields( |
|
|
|
|
const Message& message, |
|
|
|
|
std::vector<const FieldDescriptor*>* output) const = 0; |
|
|
|
|
void ListFields(const Message& message, |
|
|
|
|
std::vector<const FieldDescriptor*>* output) const; |
|
|
|
|
|
|
|
|
|
// Singular field getters ------------------------------------------
|
|
|
|
|
// These get the value of a non-repeated field. They return the default
|
|
|
|
|
// value for fields that aren't set.
|
|
|
|
|
|
|
|
|
|
virtual int32 GetInt32(const Message& message, |
|
|
|
|
const FieldDescriptor* field) const = 0; |
|
|
|
|
virtual int64 GetInt64(const Message& message, |
|
|
|
|
const FieldDescriptor* field) const = 0; |
|
|
|
|
virtual uint32 GetUInt32(const Message& message, |
|
|
|
|
const FieldDescriptor* field) const = 0; |
|
|
|
|
virtual uint64 GetUInt64(const Message& message, |
|
|
|
|
const FieldDescriptor* field) const = 0; |
|
|
|
|
virtual float GetFloat(const Message& message, |
|
|
|
|
const FieldDescriptor* field) const = 0; |
|
|
|
|
virtual double GetDouble(const Message& message, |
|
|
|
|
const FieldDescriptor* field) const = 0; |
|
|
|
|
virtual bool GetBool(const Message& message, |
|
|
|
|
const FieldDescriptor* field) const = 0; |
|
|
|
|
virtual std::string GetString(const Message& message, |
|
|
|
|
const FieldDescriptor* field) const = 0; |
|
|
|
|
virtual const EnumValueDescriptor* GetEnum( |
|
|
|
|
const Message& message, const FieldDescriptor* field) const = 0; |
|
|
|
|
int32 GetInt32(const Message& message, const FieldDescriptor* field) const; |
|
|
|
|
int64 GetInt64(const Message& message, const FieldDescriptor* field) const; |
|
|
|
|
uint32 GetUInt32(const Message& message, const FieldDescriptor* field) const; |
|
|
|
|
uint64 GetUInt64(const Message& message, const FieldDescriptor* field) const; |
|
|
|
|
float GetFloat(const Message& message, const FieldDescriptor* field) const; |
|
|
|
|
double GetDouble(const Message& message, const FieldDescriptor* field) const; |
|
|
|
|
bool GetBool(const Message& message, const FieldDescriptor* field) const; |
|
|
|
|
std::string GetString(const Message& message, |
|
|
|
|
const FieldDescriptor* field) const; |
|
|
|
|
const EnumValueDescriptor* GetEnum(const Message& message, |
|
|
|
|
const FieldDescriptor* field) const; |
|
|
|
|
|
|
|
|
|
// GetEnumValue() returns an enum field's value as an integer rather than
|
|
|
|
|
// an EnumValueDescriptor*. If the integer value does not correspond to a
|
|
|
|
|
// known value descriptor, a new value descriptor is created. (Such a value
|
|
|
|
|
// will only be present when the new unknown-enum-value semantics are enabled
|
|
|
|
|
// for a message.)
|
|
|
|
|
virtual int GetEnumValue(const Message& message, |
|
|
|
|
const FieldDescriptor* field) const = 0; |
|
|
|
|
int GetEnumValue(const Message& message, const FieldDescriptor* field) const; |
|
|
|
|
|
|
|
|
|
// See MutableMessage() for the meaning of the "factory" parameter.
|
|
|
|
|
virtual const Message& GetMessage(const Message& message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
MessageFactory* factory = NULL) const = 0; |
|
|
|
|
const Message& GetMessage(const Message& message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
MessageFactory* factory = nullptr) const; |
|
|
|
|
|
|
|
|
|
// Get a string value without copying, if possible.
|
|
|
|
|
//
|
|
|
|
@ -539,32 +515,32 @@ class PROTOBUF_EXPORT Reflection { |
|
|
|
|
// a newly-constructed string, though, it's just as fast and more
|
|
|
|
|
// readable to use code like:
|
|
|
|
|
// std::string str = reflection->GetString(message, field);
|
|
|
|
|
virtual const std::string& GetStringReference(const Message& message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
std::string* scratch) const = 0; |
|
|
|
|
const std::string& GetStringReference(const Message& message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
std::string* scratch) const; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Singular field mutators -----------------------------------------
|
|
|
|
|
// These mutate the value of a non-repeated field.
|
|
|
|
|
|
|
|
|
|
virtual void SetInt32(Message* message, const FieldDescriptor* field, |
|
|
|
|
int32 value) const = 0; |
|
|
|
|
virtual void SetInt64(Message* message, const FieldDescriptor* field, |
|
|
|
|
int64 value) const = 0; |
|
|
|
|
virtual void SetUInt32(Message* message, const FieldDescriptor* field, |
|
|
|
|
uint32 value) const = 0; |
|
|
|
|
virtual void SetUInt64(Message* message, const FieldDescriptor* field, |
|
|
|
|
uint64 value) const = 0; |
|
|
|
|
virtual void SetFloat(Message* message, const FieldDescriptor* field, |
|
|
|
|
float value) const = 0; |
|
|
|
|
virtual void SetDouble(Message* message, const FieldDescriptor* field, |
|
|
|
|
double value) const = 0; |
|
|
|
|
virtual void SetBool(Message* message, const FieldDescriptor* field, |
|
|
|
|
bool value) const = 0; |
|
|
|
|
virtual void SetString(Message* message, const FieldDescriptor* field, |
|
|
|
|
const std::string& value) const = 0; |
|
|
|
|
virtual void SetEnum(Message* message, const FieldDescriptor* field, |
|
|
|
|
const EnumValueDescriptor* value) const = 0; |
|
|
|
|
void SetInt32(Message* message, const FieldDescriptor* field, |
|
|
|
|
int32 value) const; |
|
|
|
|
void SetInt64(Message* message, const FieldDescriptor* field, |
|
|
|
|
int64 value) const; |
|
|
|
|
void SetUInt32(Message* message, const FieldDescriptor* field, |
|
|
|
|
uint32 value) const; |
|
|
|
|
void SetUInt64(Message* message, const FieldDescriptor* field, |
|
|
|
|
uint64 value) const; |
|
|
|
|
void SetFloat(Message* message, const FieldDescriptor* field, |
|
|
|
|
float value) const; |
|
|
|
|
void SetDouble(Message* message, const FieldDescriptor* field, |
|
|
|
|
double value) const; |
|
|
|
|
void SetBool(Message* message, const FieldDescriptor* field, |
|
|
|
|
bool value) const; |
|
|
|
|
void SetString(Message* message, const FieldDescriptor* field, |
|
|
|
|
const std::string& value) const; |
|
|
|
|
void SetEnum(Message* message, const FieldDescriptor* field, |
|
|
|
|
const EnumValueDescriptor* value) const; |
|
|
|
|
// Set an enum field's value with an integer rather than EnumValueDescriptor.
|
|
|
|
|
// For proto3 this is just setting the enum field to the value specified, for
|
|
|
|
|
// proto2 it's more complicated. If value is a known enum value the field is
|
|
|
|
@ -572,8 +548,8 @@ class PROTOBUF_EXPORT Reflection { |
|
|
|
|
// set. Note this matches the behavior of parsing unknown enum values.
|
|
|
|
|
// If multiple calls with unknown values happen than they are all added to the
|
|
|
|
|
// unknown field set in order of the calls.
|
|
|
|
|
virtual void SetEnumValue(Message* message, const FieldDescriptor* field, |
|
|
|
|
int value) const = 0; |
|
|
|
|
void SetEnumValue(Message* message, const FieldDescriptor* field, |
|
|
|
|
int value) const; |
|
|
|
|
|
|
|
|
|
// Get a mutable pointer to a field with a message type. If a MessageFactory
|
|
|
|
|
// is provided, it will be used to construct instances of the sub-message;
|
|
|
|
@ -585,97 +561,86 @@ class PROTOBUF_EXPORT Reflection { |
|
|
|
|
// FieldDescriptor is for a compiled-in extension, then
|
|
|
|
|
// factory->GetPrototype(field->message_type()) MUST return an instance of
|
|
|
|
|
// the compiled-in class for this type, NOT DynamicMessage.
|
|
|
|
|
virtual Message* MutableMessage(Message* message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
MessageFactory* factory = NULL) const = 0; |
|
|
|
|
Message* MutableMessage(Message* message, const FieldDescriptor* field, |
|
|
|
|
MessageFactory* factory = nullptr) const; |
|
|
|
|
// Replaces the message specified by 'field' with the already-allocated object
|
|
|
|
|
// sub_message, passing ownership to the message. If the field contained a
|
|
|
|
|
// message, that message is deleted. If sub_message is NULL, the field is
|
|
|
|
|
// message, that message is deleted. If sub_message is nullptr, the field is
|
|
|
|
|
// cleared.
|
|
|
|
|
virtual void SetAllocatedMessage(Message* message, Message* sub_message, |
|
|
|
|
const FieldDescriptor* field) const = 0; |
|
|
|
|
void SetAllocatedMessage(Message* message, Message* sub_message, |
|
|
|
|
const FieldDescriptor* field) const; |
|
|
|
|
// Releases the message specified by 'field' and returns the pointer,
|
|
|
|
|
// ReleaseMessage() will return the message the message object if it exists.
|
|
|
|
|
// Otherwise, it may or may not return NULL. In any case, if the return value
|
|
|
|
|
// is non-NULL, the caller takes ownership of the pointer.
|
|
|
|
|
// Otherwise, it may or may not return nullptr. In any case, if the return
|
|
|
|
|
// value is non-null, the caller takes ownership of the pointer.
|
|
|
|
|
// If the field existed (HasField() is true), then the returned pointer will
|
|
|
|
|
// be the same as the pointer returned by MutableMessage().
|
|
|
|
|
// This function has the same effect as ClearField().
|
|
|
|
|
virtual Message* ReleaseMessage(Message* message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
MessageFactory* factory = NULL) const = 0; |
|
|
|
|
Message* ReleaseMessage(Message* message, const FieldDescriptor* field, |
|
|
|
|
MessageFactory* factory = nullptr) const; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Repeated field getters ------------------------------------------
|
|
|
|
|
// These get the value of one element of a repeated field.
|
|
|
|
|
|
|
|
|
|
virtual int32 GetRepeatedInt32(const Message& message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
int index) const = 0; |
|
|
|
|
virtual int64 GetRepeatedInt64(const Message& message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
int index) const = 0; |
|
|
|
|
virtual uint32 GetRepeatedUInt32(const Message& message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
int index) const = 0; |
|
|
|
|
virtual uint64 GetRepeatedUInt64(const Message& message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
int index) const = 0; |
|
|
|
|
virtual float GetRepeatedFloat(const Message& message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
int index) const = 0; |
|
|
|
|
virtual double GetRepeatedDouble(const Message& message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
int index) const = 0; |
|
|
|
|
virtual bool GetRepeatedBool(const Message& message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
int index) const = 0; |
|
|
|
|
virtual std::string GetRepeatedString(const Message& message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
int index) const = 0; |
|
|
|
|
virtual const EnumValueDescriptor* GetRepeatedEnum( |
|
|
|
|
const Message& message, const FieldDescriptor* field, |
|
|
|
|
int index) const = 0; |
|
|
|
|
int32 GetRepeatedInt32(const Message& message, const FieldDescriptor* field, |
|
|
|
|
int index) const; |
|
|
|
|
int64 GetRepeatedInt64(const Message& message, const FieldDescriptor* field, |
|
|
|
|
int index) const; |
|
|
|
|
uint32 GetRepeatedUInt32(const Message& message, const FieldDescriptor* field, |
|
|
|
|
int index) const; |
|
|
|
|
uint64 GetRepeatedUInt64(const Message& message, const FieldDescriptor* field, |
|
|
|
|
int index) const; |
|
|
|
|
float GetRepeatedFloat(const Message& message, const FieldDescriptor* field, |
|
|
|
|
int index) const; |
|
|
|
|
double GetRepeatedDouble(const Message& message, const FieldDescriptor* field, |
|
|
|
|
int index) const; |
|
|
|
|
bool GetRepeatedBool(const Message& message, const FieldDescriptor* field, |
|
|
|
|
int index) const; |
|
|
|
|
std::string GetRepeatedString(const Message& message, |
|
|
|
|
const FieldDescriptor* field, int index) const; |
|
|
|
|
const EnumValueDescriptor* GetRepeatedEnum(const Message& message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
int index) const; |
|
|
|
|
// GetRepeatedEnumValue() returns an enum field's value as an integer rather
|
|
|
|
|
// than an EnumValueDescriptor*. If the integer value does not correspond to a
|
|
|
|
|
// known value descriptor, a new value descriptor is created. (Such a value
|
|
|
|
|
// will only be present when the new unknown-enum-value semantics are enabled
|
|
|
|
|
// for a message.)
|
|
|
|
|
virtual int GetRepeatedEnumValue(const Message& message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
int index) const = 0; |
|
|
|
|
virtual const Message& GetRepeatedMessage(const Message& message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
int index) const = 0; |
|
|
|
|
int GetRepeatedEnumValue(const Message& message, const FieldDescriptor* field, |
|
|
|
|
int index) const; |
|
|
|
|
const Message& GetRepeatedMessage(const Message& message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
int index) const; |
|
|
|
|
|
|
|
|
|
// See GetStringReference(), above.
|
|
|
|
|
virtual const std::string& GetRepeatedStringReference( |
|
|
|
|
const Message& message, const FieldDescriptor* field, int index, |
|
|
|
|
std::string* scratch) const = 0; |
|
|
|
|
const std::string& GetRepeatedStringReference(const Message& message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
int index, |
|
|
|
|
std::string* scratch) const; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Repeated field mutators -----------------------------------------
|
|
|
|
|
// These mutate the value of one element of a repeated field.
|
|
|
|
|
|
|
|
|
|
virtual void SetRepeatedInt32(Message* message, const FieldDescriptor* field, |
|
|
|
|
int index, int32 value) const = 0; |
|
|
|
|
virtual void SetRepeatedInt64(Message* message, const FieldDescriptor* field, |
|
|
|
|
int index, int64 value) const = 0; |
|
|
|
|
virtual void SetRepeatedUInt32(Message* message, const FieldDescriptor* field, |
|
|
|
|
int index, uint32 value) const = 0; |
|
|
|
|
virtual void SetRepeatedUInt64(Message* message, const FieldDescriptor* field, |
|
|
|
|
int index, uint64 value) const = 0; |
|
|
|
|
virtual void SetRepeatedFloat(Message* message, const FieldDescriptor* field, |
|
|
|
|
int index, float value) const = 0; |
|
|
|
|
virtual void SetRepeatedDouble(Message* message, const FieldDescriptor* field, |
|
|
|
|
int index, double value) const = 0; |
|
|
|
|
virtual void SetRepeatedBool(Message* message, const FieldDescriptor* field, |
|
|
|
|
int index, bool value) const = 0; |
|
|
|
|
virtual void SetRepeatedString(Message* message, const FieldDescriptor* field, |
|
|
|
|
int index, const std::string& value) const = 0; |
|
|
|
|
virtual void SetRepeatedEnum(Message* message, const FieldDescriptor* field, |
|
|
|
|
int index, |
|
|
|
|
const EnumValueDescriptor* value) const = 0; |
|
|
|
|
void SetRepeatedInt32(Message* message, const FieldDescriptor* field, |
|
|
|
|
int index, int32 value) const; |
|
|
|
|
void SetRepeatedInt64(Message* message, const FieldDescriptor* field, |
|
|
|
|
int index, int64 value) const; |
|
|
|
|
void SetRepeatedUInt32(Message* message, const FieldDescriptor* field, |
|
|
|
|
int index, uint32 value) const; |
|
|
|
|
void SetRepeatedUInt64(Message* message, const FieldDescriptor* field, |
|
|
|
|
int index, uint64 value) const; |
|
|
|
|
void SetRepeatedFloat(Message* message, const FieldDescriptor* field, |
|
|
|
|
int index, float value) const; |
|
|
|
|
void SetRepeatedDouble(Message* message, const FieldDescriptor* field, |
|
|
|
|
int index, double value) const; |
|
|
|
|
void SetRepeatedBool(Message* message, const FieldDescriptor* field, |
|
|
|
|
int index, bool value) const; |
|
|
|
|
void SetRepeatedString(Message* message, const FieldDescriptor* field, |
|
|
|
|
int index, const std::string& value) const; |
|
|
|
|
void SetRepeatedEnum(Message* message, const FieldDescriptor* field, |
|
|
|
|
int index, const EnumValueDescriptor* value) const; |
|
|
|
|
// Set an enum field's value with an integer rather than EnumValueDescriptor.
|
|
|
|
|
// For proto3 this is just setting the enum field to the value specified, for
|
|
|
|
|
// proto2 it's more complicated. If value is a known enum value the field is
|
|
|
|
@ -683,37 +648,36 @@ class PROTOBUF_EXPORT Reflection { |
|
|
|
|
// set. Note this matches the behavior of parsing unknown enum values.
|
|
|
|
|
// If multiple calls with unknown values happen than they are all added to the
|
|
|
|
|
// unknown field set in order of the calls.
|
|
|
|
|
virtual void SetRepeatedEnumValue(Message* message, |
|
|
|
|
const FieldDescriptor* field, int index, |
|
|
|
|
int value) const = 0; |
|
|
|
|
void SetRepeatedEnumValue(Message* message, const FieldDescriptor* field, |
|
|
|
|
int index, int value) const; |
|
|
|
|
// Get a mutable pointer to an element of a repeated field with a message
|
|
|
|
|
// type.
|
|
|
|
|
virtual Message* MutableRepeatedMessage(Message* message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
int index) const = 0; |
|
|
|
|
Message* MutableRepeatedMessage(Message* message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
int index) const; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Repeated field adders -------------------------------------------
|
|
|
|
|
// These add an element to a repeated field.
|
|
|
|
|
|
|
|
|
|
virtual void AddInt32(Message* message, const FieldDescriptor* field, |
|
|
|
|
int32 value) const = 0; |
|
|
|
|
virtual void AddInt64(Message* message, const FieldDescriptor* field, |
|
|
|
|
int64 value) const = 0; |
|
|
|
|
virtual void AddUInt32(Message* message, const FieldDescriptor* field, |
|
|
|
|
uint32 value) const = 0; |
|
|
|
|
virtual void AddUInt64(Message* message, const FieldDescriptor* field, |
|
|
|
|
uint64 value) const = 0; |
|
|
|
|
virtual void AddFloat(Message* message, const FieldDescriptor* field, |
|
|
|
|
float value) const = 0; |
|
|
|
|
virtual void AddDouble(Message* message, const FieldDescriptor* field, |
|
|
|
|
double value) const = 0; |
|
|
|
|
virtual void AddBool(Message* message, const FieldDescriptor* field, |
|
|
|
|
bool value) const = 0; |
|
|
|
|
virtual void AddString(Message* message, const FieldDescriptor* field, |
|
|
|
|
const std::string& value) const = 0; |
|
|
|
|
virtual void AddEnum(Message* message, const FieldDescriptor* field, |
|
|
|
|
const EnumValueDescriptor* value) const = 0; |
|
|
|
|
void AddInt32(Message* message, const FieldDescriptor* field, |
|
|
|
|
int32 value) const; |
|
|
|
|
void AddInt64(Message* message, const FieldDescriptor* field, |
|
|
|
|
int64 value) const; |
|
|
|
|
void AddUInt32(Message* message, const FieldDescriptor* field, |
|
|
|
|
uint32 value) const; |
|
|
|
|
void AddUInt64(Message* message, const FieldDescriptor* field, |
|
|
|
|
uint64 value) const; |
|
|
|
|
void AddFloat(Message* message, const FieldDescriptor* field, |
|
|
|
|
float value) const; |
|
|
|
|
void AddDouble(Message* message, const FieldDescriptor* field, |
|
|
|
|
double value) const; |
|
|
|
|
void AddBool(Message* message, const FieldDescriptor* field, |
|
|
|
|
bool value) const; |
|
|
|
|
void AddString(Message* message, const FieldDescriptor* field, |
|
|
|
|
const std::string& value) const; |
|
|
|
|
void AddEnum(Message* message, const FieldDescriptor* field, |
|
|
|
|
const EnumValueDescriptor* value) const; |
|
|
|
|
// Add an integer value to a repeated enum field rather than
|
|
|
|
|
// EnumValueDescriptor. For proto3 this is just setting the enum field to the
|
|
|
|
|
// value specified, for proto2 it's more complicated. If value is a known enum
|
|
|
|
@ -721,19 +685,16 @@ class PROTOBUF_EXPORT Reflection { |
|
|
|
|
// to the unknown field set. Note this matches the behavior of parsing unknown
|
|
|
|
|
// enum values. If multiple calls with unknown values happen than they are all
|
|
|
|
|
// added to the unknown field set in order of the calls.
|
|
|
|
|
virtual void AddEnumValue(Message* message, const FieldDescriptor* field, |
|
|
|
|
int value) const = 0; |
|
|
|
|
void AddEnumValue(Message* message, const FieldDescriptor* field, |
|
|
|
|
int value) const; |
|
|
|
|
// See MutableMessage() for comments on the "factory" parameter.
|
|
|
|
|
virtual Message* AddMessage(Message* message, const FieldDescriptor* field, |
|
|
|
|
MessageFactory* factory = NULL) const = 0; |
|
|
|
|
Message* AddMessage(Message* message, const FieldDescriptor* field, |
|
|
|
|
MessageFactory* factory = nullptr) const; |
|
|
|
|
|
|
|
|
|
// Appends an already-allocated object 'new_entry' to the repeated field
|
|
|
|
|
// specified by 'field' passing ownership to the message.
|
|
|
|
|
// TODO(tmarek): Make virtual after all subclasses have been
|
|
|
|
|
// updated.
|
|
|
|
|
virtual void AddAllocatedMessage(Message* message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
Message* new_entry) const; |
|
|
|
|
void AddAllocatedMessage(Message* message, const FieldDescriptor* field, |
|
|
|
|
Message* new_entry) const; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Get a RepeatedFieldRef object that can be used to read the underlying
|
|
|
|
@ -821,14 +782,17 @@ class PROTOBUF_EXPORT Reflection { |
|
|
|
|
// Extensions ----------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
// Try to find an extension of this message type by fully-qualified field
|
|
|
|
|
// name. Returns NULL if no extension is known for this name or number.
|
|
|
|
|
virtual const FieldDescriptor* FindKnownExtensionByName( |
|
|
|
|
const std::string& name) const = 0; |
|
|
|
|
// name. Returns nullptr if no extension is known for this name or number.
|
|
|
|
|
PROTOBUF_DEPRECATED_MSG( |
|
|
|
|
"Please use DescriptorPool::FindExtensionByPrintableName instead") |
|
|
|
|
const FieldDescriptor* FindKnownExtensionByName( |
|
|
|
|
const std::string& name) const; |
|
|
|
|
|
|
|
|
|
// Try to find an extension of this message type by field number.
|
|
|
|
|
// Returns NULL if no extension is known for this name or number.
|
|
|
|
|
virtual const FieldDescriptor* FindKnownExtensionByNumber( |
|
|
|
|
int number) const = 0; |
|
|
|
|
// Returns nullptr if no extension is known for this name or number.
|
|
|
|
|
PROTOBUF_DEPRECATED_MSG( |
|
|
|
|
"Please use DescriptorPool::FindExtensionByNumber instead") |
|
|
|
|
const FieldDescriptor* FindKnownExtensionByNumber(int number) const; |
|
|
|
|
|
|
|
|
|
// Feature Flags -------------------------------------------------------------
|
|
|
|
|
|
|
|
|
@ -849,7 +813,7 @@ class PROTOBUF_EXPORT Reflection { |
|
|
|
|
// reflection->SetEnumValue(message, field, new_value);
|
|
|
|
|
// } else {
|
|
|
|
|
// if (field_descriptor->enum_type()->
|
|
|
|
|
// FindValueByNumber(new_value) != NULL) {
|
|
|
|
|
// FindValueByNumber(new_value) != nullptr) {
|
|
|
|
|
// reflection->SetEnumValue(message, field, new_value);
|
|
|
|
|
// } else if (emit_unknown_enum_values) {
|
|
|
|
|
// reflection->MutableUnknownFields(message)->AddVarint(
|
|
|
|
@ -860,7 +824,7 @@ class PROTOBUF_EXPORT Reflection { |
|
|
|
|
// reflection->SetEnumValue(message, field, new_value);
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
virtual bool SupportsUnknownEnumValues() const { return false; } |
|
|
|
|
bool SupportsUnknownEnumValues() const; |
|
|
|
|
|
|
|
|
|
// Returns the MessageFactory associated with this message. This can be
|
|
|
|
|
// useful for determining if a message is a generated message or not, for
|
|
|
|
@ -871,60 +835,63 @@ class PROTOBUF_EXPORT Reflection { |
|
|
|
|
// }
|
|
|
|
|
// It can also be used to create more messages of this type, though
|
|
|
|
|
// Message::New() is an easier way to accomplish this.
|
|
|
|
|
virtual MessageFactory* GetMessageFactory() const; |
|
|
|
|
MessageFactory* GetMessageFactory() const; |
|
|
|
|
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
protected: |
|
|
|
|
private: |
|
|
|
|
// Obtain a pointer to a Repeated Field Structure and do some type checking:
|
|
|
|
|
// on field->cpp_type(),
|
|
|
|
|
// on field->field_option().ctype() (if ctype >= 0)
|
|
|
|
|
// of field->message_type() (if message_type != NULL).
|
|
|
|
|
// of field->message_type() (if message_type != nullptr).
|
|
|
|
|
// We use 2 routine rather than 4 (const vs mutable) x (scalar vs pointer).
|
|
|
|
|
virtual void* MutableRawRepeatedField( |
|
|
|
|
Message* message, const FieldDescriptor* field, FieldDescriptor::CppType, |
|
|
|
|
int ctype, const Descriptor* message_type) const = 0; |
|
|
|
|
|
|
|
|
|
// TODO(jieluo) - make it pure virtual after updating all the subclasses.
|
|
|
|
|
virtual const void* GetRawRepeatedField( |
|
|
|
|
const Message& message, const FieldDescriptor* field, |
|
|
|
|
FieldDescriptor::CppType cpptype, int ctype, |
|
|
|
|
const Descriptor* message_type) const { |
|
|
|
|
return MutableRawRepeatedField(const_cast<Message*>(&message), field, |
|
|
|
|
cpptype, ctype, message_type); |
|
|
|
|
} |
|
|
|
|
void* MutableRawRepeatedField(Message* message, const FieldDescriptor* field, |
|
|
|
|
FieldDescriptor::CppType, int ctype, |
|
|
|
|
const Descriptor* message_type) const; |
|
|
|
|
|
|
|
|
|
const void* GetRawRepeatedField(const Message& message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
FieldDescriptor::CppType cpptype, int ctype, |
|
|
|
|
const Descriptor* message_type) const; |
|
|
|
|
|
|
|
|
|
// The following methods are used to implement (Mutable)RepeatedFieldRef.
|
|
|
|
|
// A Ref object will store a raw pointer to the repeated field data (obtained
|
|
|
|
|
// from RepeatedFieldData()) and a pointer to a Accessor (obtained from
|
|
|
|
|
// RepeatedFieldAccessor) which will be used to access the raw data.
|
|
|
|
|
//
|
|
|
|
|
// TODO(xiaofeng): Make these methods pure-virtual.
|
|
|
|
|
|
|
|
|
|
// Returns a raw pointer to the repeated field
|
|
|
|
|
//
|
|
|
|
|
// "cpp_type" and "message_type" are deduced from the type parameter T passed
|
|
|
|
|
// to Get(Mutable)RepeatedFieldRef. If T is a generated message type,
|
|
|
|
|
// "message_type" should be set to its descriptor. Otherwise "message_type"
|
|
|
|
|
// should be set to NULL. Implementations of this method should check whether
|
|
|
|
|
// "cpp_type"/"message_type" is consistent with the actual type of the field.
|
|
|
|
|
// We use 1 routine rather than 2 (const vs mutable) because it is protected
|
|
|
|
|
// and it doesn't change the message.
|
|
|
|
|
virtual void* RepeatedFieldData(Message* message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
FieldDescriptor::CppType cpp_type, |
|
|
|
|
const Descriptor* message_type) const; |
|
|
|
|
// should be set to nullptr. Implementations of this method should check
|
|
|
|
|
// whether "cpp_type"/"message_type" is consistent with the actual type of the
|
|
|
|
|
// field. We use 1 routine rather than 2 (const vs mutable) because it is
|
|
|
|
|
// protected and it doesn't change the message.
|
|
|
|
|
void* RepeatedFieldData(Message* message, const FieldDescriptor* field, |
|
|
|
|
FieldDescriptor::CppType cpp_type, |
|
|
|
|
const Descriptor* message_type) const; |
|
|
|
|
|
|
|
|
|
// The returned pointer should point to a singleton instance which implements
|
|
|
|
|
// the RepeatedFieldAccessor interface.
|
|
|
|
|
virtual const internal::RepeatedFieldAccessor* RepeatedFieldAccessor( |
|
|
|
|
const internal::RepeatedFieldAccessor* RepeatedFieldAccessor( |
|
|
|
|
const FieldDescriptor* field) const; |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
const Descriptor* const descriptor_; |
|
|
|
|
const internal::ReflectionSchema schema_; |
|
|
|
|
const DescriptorPool* const descriptor_pool_; |
|
|
|
|
MessageFactory* const message_factory_; |
|
|
|
|
|
|
|
|
|
// Last non weak field index. This is an optimization when most weak fields
|
|
|
|
|
// are at the end of the containing message. If a message proto doesn't
|
|
|
|
|
// contain weak fields, then this field equals descriptor_->field_count().
|
|
|
|
|
int last_non_weak_field_index_; |
|
|
|
|
|
|
|
|
|
template <typename T, typename Enable> |
|
|
|
|
friend class RepeatedFieldRef; |
|
|
|
|
template <typename T, typename Enable> |
|
|
|
|
friend class MutableRepeatedFieldRef; |
|
|
|
|
friend class ::PROTOBUF_NAMESPACE_ID::MessageLayoutInspector; |
|
|
|
|
friend class ::PROTOBUF_NAMESPACE_ID::AssignDescriptorsHelper; |
|
|
|
|
friend class DynamicMessageFactory; |
|
|
|
|
friend class python::MapReflectionFriend; |
|
|
|
|
#define GOOGLE_PROTOBUF_HAS_CEL_MAP_REFLECTION_FRIEND |
|
|
|
|
friend class expr::CelMapReflectionFriend; |
|
|
|
@ -936,6 +903,10 @@ class PROTOBUF_EXPORT Reflection { |
|
|
|
|
friend class internal::MapFieldPrinterHelper; |
|
|
|
|
friend class internal::ReflectionAccessor; |
|
|
|
|
|
|
|
|
|
Reflection(const Descriptor* descriptor, |
|
|
|
|
const internal::ReflectionSchema& schema, |
|
|
|
|
const DescriptorPool* pool, MessageFactory* factory); |
|
|
|
|
|
|
|
|
|
// Special version for specialized implementations of string. We can't
|
|
|
|
|
// call MutableRawRepeatedField directly here because we don't have access to
|
|
|
|
|
// FieldOptions::* which are defined in descriptor.pb.h. Including that
|
|
|
|
@ -946,63 +917,150 @@ class PROTOBUF_EXPORT Reflection { |
|
|
|
|
bool is_string) const; |
|
|
|
|
|
|
|
|
|
friend class MapReflectionTester; |
|
|
|
|
// TODO(jieluo) - make the map APIs pure virtual after updating
|
|
|
|
|
// all the subclasses.
|
|
|
|
|
// Returns true if key is in map. Returns false if key is not in map field.
|
|
|
|
|
virtual bool ContainsMapKey(const Message& /* message */, |
|
|
|
|
const FieldDescriptor* /* field */, |
|
|
|
|
const MapKey& /* key */) const { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
bool ContainsMapKey(const Message& message, const FieldDescriptor* field, |
|
|
|
|
const MapKey& key) const; |
|
|
|
|
|
|
|
|
|
// If key is in map field: Saves the value pointer to val and returns
|
|
|
|
|
// false. If key in not in map field: Insert the key into map, saves
|
|
|
|
|
// value pointer to val and retuns true.
|
|
|
|
|
virtual bool InsertOrLookupMapValue(Message* /* message */, |
|
|
|
|
const FieldDescriptor* /* field */, |
|
|
|
|
const MapKey& /* key */, |
|
|
|
|
MapValueRef* /* val */) const { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
bool InsertOrLookupMapValue(Message* message, const FieldDescriptor* field, |
|
|
|
|
const MapKey& key, MapValueRef* val) const; |
|
|
|
|
|
|
|
|
|
// Delete and returns true if key is in the map field. Returns false
|
|
|
|
|
// otherwise.
|
|
|
|
|
virtual bool DeleteMapValue(Message* /* message */, |
|
|
|
|
const FieldDescriptor* /* field */, |
|
|
|
|
const MapKey& /* key */) const { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
bool DeleteMapValue(Message* message, const FieldDescriptor* field, |
|
|
|
|
const MapKey& key) const; |
|
|
|
|
|
|
|
|
|
// Returns a MapIterator referring to the first element in the map field.
|
|
|
|
|
// If the map field is empty, this function returns the same as
|
|
|
|
|
// reflection::MapEnd. Mutation to the field may invalidate the iterator.
|
|
|
|
|
virtual MapIterator MapBegin(Message* message, |
|
|
|
|
const FieldDescriptor* field) const; |
|
|
|
|
MapIterator MapBegin(Message* message, const FieldDescriptor* field) const; |
|
|
|
|
|
|
|
|
|
// Returns a MapIterator referring to the theoretical element that would
|
|
|
|
|
// follow the last element in the map field. It does not point to any
|
|
|
|
|
// real element. Mutation to the field may invalidate the iterator.
|
|
|
|
|
virtual MapIterator MapEnd(Message* message, |
|
|
|
|
const FieldDescriptor* field) const; |
|
|
|
|
MapIterator MapEnd(Message* message, const FieldDescriptor* field) const; |
|
|
|
|
|
|
|
|
|
// Get the number of <key, value> pair of a map field. The result may be
|
|
|
|
|
// different from FieldSize which can have duplicate keys.
|
|
|
|
|
virtual int MapSize(const Message& /* message */, |
|
|
|
|
const FieldDescriptor* /* field */) const { |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
int MapSize(const Message& message, const FieldDescriptor* field) const; |
|
|
|
|
|
|
|
|
|
// Help method for MapIterator.
|
|
|
|
|
friend class MapIterator; |
|
|
|
|
virtual internal::MapFieldBase* MutableMapData( |
|
|
|
|
Message* /* message */, const FieldDescriptor* /* field */) const { |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
internal::MapFieldBase* MutableMapData(Message* message, |
|
|
|
|
const FieldDescriptor* field) const; |
|
|
|
|
|
|
|
|
|
const internal::MapFieldBase* GetMapData(const Message& message, |
|
|
|
|
const FieldDescriptor* field) const; |
|
|
|
|
|
|
|
|
|
template <class T> |
|
|
|
|
const T& GetRawNonOneof(const Message& message, |
|
|
|
|
const FieldDescriptor* field) const; |
|
|
|
|
template <class T> |
|
|
|
|
T* MutableRawNonOneof(Message* message, const FieldDescriptor* field) const; |
|
|
|
|
|
|
|
|
|
template <typename Type> |
|
|
|
|
const Type& GetRaw(const Message& message, |
|
|
|
|
const FieldDescriptor* field) const; |
|
|
|
|
template <typename Type> |
|
|
|
|
inline Type* MutableRaw(Message* message, const FieldDescriptor* field) const; |
|
|
|
|
template <typename Type> |
|
|
|
|
inline const Type& DefaultRaw(const FieldDescriptor* field) const; |
|
|
|
|
|
|
|
|
|
inline const uint32* GetHasBits(const Message& message) const; |
|
|
|
|
inline uint32* MutableHasBits(Message* message) const; |
|
|
|
|
inline uint32 GetOneofCase(const Message& message, |
|
|
|
|
const OneofDescriptor* oneof_descriptor) const; |
|
|
|
|
inline uint32* MutableOneofCase( |
|
|
|
|
Message* message, const OneofDescriptor* oneof_descriptor) const; |
|
|
|
|
inline const internal::ExtensionSet& GetExtensionSet( |
|
|
|
|
const Message& message) const; |
|
|
|
|
inline internal::ExtensionSet* MutableExtensionSet(Message* message) const; |
|
|
|
|
inline Arena* GetArena(Message* message) const; |
|
|
|
|
|
|
|
|
|
inline const internal::InternalMetadataWithArena& |
|
|
|
|
GetInternalMetadataWithArena(const Message& message) const; |
|
|
|
|
|
|
|
|
|
inline internal::InternalMetadataWithArena* MutableInternalMetadataWithArena( |
|
|
|
|
Message* message) const; |
|
|
|
|
|
|
|
|
|
inline bool IsInlined(const FieldDescriptor* field) const; |
|
|
|
|
|
|
|
|
|
inline bool HasBit(const Message& message, |
|
|
|
|
const FieldDescriptor* field) const; |
|
|
|
|
inline void SetBit(Message* message, const FieldDescriptor* field) const; |
|
|
|
|
inline void ClearBit(Message* message, const FieldDescriptor* field) const; |
|
|
|
|
inline void SwapBit(Message* message1, Message* message2, |
|
|
|
|
const FieldDescriptor* field) const; |
|
|
|
|
|
|
|
|
|
// This function only swaps the field. Should swap corresponding has_bit
|
|
|
|
|
// before or after using this function.
|
|
|
|
|
void SwapField(Message* message1, Message* message2, |
|
|
|
|
const FieldDescriptor* field) const; |
|
|
|
|
|
|
|
|
|
void SwapOneofField(Message* message1, Message* message2, |
|
|
|
|
const OneofDescriptor* oneof_descriptor) const; |
|
|
|
|
|
|
|
|
|
inline bool HasOneofField(const Message& message, |
|
|
|
|
const FieldDescriptor* field) const; |
|
|
|
|
inline void SetOneofCase(Message* message, |
|
|
|
|
const FieldDescriptor* field) const; |
|
|
|
|
inline void ClearOneofField(Message* message, |
|
|
|
|
const FieldDescriptor* field) const; |
|
|
|
|
|
|
|
|
|
template <typename Type> |
|
|
|
|
inline const Type& GetField(const Message& message, |
|
|
|
|
const FieldDescriptor* field) const; |
|
|
|
|
template <typename Type> |
|
|
|
|
inline void SetField(Message* message, const FieldDescriptor* field, |
|
|
|
|
const Type& value) const; |
|
|
|
|
template <typename Type> |
|
|
|
|
inline Type* MutableField(Message* message, |
|
|
|
|
const FieldDescriptor* field) const; |
|
|
|
|
template <typename Type> |
|
|
|
|
inline const Type& GetRepeatedField(const Message& message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
int index) const; |
|
|
|
|
template <typename Type> |
|
|
|
|
inline const Type& GetRepeatedPtrField(const Message& message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
int index) const; |
|
|
|
|
template <typename Type> |
|
|
|
|
inline void SetRepeatedField(Message* message, const FieldDescriptor* field, |
|
|
|
|
int index, Type value) const; |
|
|
|
|
template <typename Type> |
|
|
|
|
inline Type* MutableRepeatedField(Message* message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
int index) const; |
|
|
|
|
template <typename Type> |
|
|
|
|
inline void AddField(Message* message, const FieldDescriptor* field, |
|
|
|
|
const Type& value) const; |
|
|
|
|
template <typename Type> |
|
|
|
|
inline Type* AddField(Message* message, const FieldDescriptor* field) const; |
|
|
|
|
|
|
|
|
|
int GetExtensionNumberOrDie(const Descriptor* type) const; |
|
|
|
|
|
|
|
|
|
// Internal versions of EnumValue API perform no checking. Called after checks
|
|
|
|
|
// by public methods.
|
|
|
|
|
void SetEnumValueInternal(Message* message, const FieldDescriptor* field, |
|
|
|
|
int value) const; |
|
|
|
|
void SetRepeatedEnumValueInternal(Message* message, |
|
|
|
|
const FieldDescriptor* field, int index, |
|
|
|
|
int value) const; |
|
|
|
|
void AddEnumValueInternal(Message* message, const FieldDescriptor* field, |
|
|
|
|
int value) const; |
|
|
|
|
|
|
|
|
|
virtual const internal::MapFieldBase* GetMapData( |
|
|
|
|
const Message& /* message */, const FieldDescriptor* /* field */) const { |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
Message* UnsafeArenaReleaseMessage(Message* message, |
|
|
|
|
const FieldDescriptor* field, |
|
|
|
|
MessageFactory* factory = nullptr) const; |
|
|
|
|
|
|
|
|
|
void UnsafeArenaSetAllocatedMessage(Message* message, Message* sub_message, |
|
|
|
|
const FieldDescriptor* field) const; |
|
|
|
|
|
|
|
|
|
friend inline // inline so nobody can call this function.
|
|
|
|
|
void |
|
|
|
|
RegisterAllTypesInternal(const Metadata* file_level_metadata, int size); |
|
|
|
|
|
|
|
|
|
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Reflection); |
|
|
|
|
}; |
|
|
|
@ -1027,7 +1085,7 @@ class PROTOBUF_EXPORT MessageFactory { |
|
|
|
|
// outlive the MessageFactory.
|
|
|
|
|
//
|
|
|
|
|
// Some implementations do not support all types. GetPrototype() will
|
|
|
|
|
// return NULL if the descriptor passed in is not supported.
|
|
|
|
|
// return nullptr if the descriptor passed in is not supported.
|
|
|
|
|
//
|
|
|
|
|
// This method may or may not be thread-safe depending on the implementation.
|
|
|
|
|
// Each implementation should document its own degree thread-safety.
|
|
|
|
@ -1039,7 +1097,7 @@ class PROTOBUF_EXPORT MessageFactory { |
|
|
|
|
// FooMessage::descriptor()) == FooMessage::default_instance()
|
|
|
|
|
// This factory supports all types which are found in
|
|
|
|
|
// DescriptorPool::generated_pool(). If given a descriptor from any other
|
|
|
|
|
// pool, GetPrototype() will return NULL. (You can also check if a
|
|
|
|
|
// pool, GetPrototype() will return nullptr. (You can also check if a
|
|
|
|
|
// descriptor is for a generated message by checking if
|
|
|
|
|
// descriptor->file()->pool() == DescriptorPool::generated_pool().)
|
|
|
|
|
//
|
|
|
|
@ -1091,8 +1149,8 @@ DECLARE_GET_REPEATED_FIELD(bool) |
|
|
|
|
|
|
|
|
|
#undef DECLARE_GET_REPEATED_FIELD |
|
|
|
|
|
|
|
|
|
// Tries to downcast this message to a generated message type. Returns NULL if
|
|
|
|
|
// this class is not an instance of T. This works even if RTTI is disabled.
|
|
|
|
|
// Tries to downcast this message to a generated message type. Returns nullptr
|
|
|
|
|
// if this class is not an instance of T. This works even if RTTI is disabled.
|
|
|
|
|
//
|
|
|
|
|
// This also has the effect of creating a strong reference to T that will
|
|
|
|
|
// prevent the linker from stripping it out at link time. This can be important
|
|
|
|
@ -1180,14 +1238,14 @@ template <> |
|
|
|
|
inline const RepeatedPtrField<Message>& Reflection::GetRepeatedPtrField( |
|
|
|
|
const Message& message, const FieldDescriptor* field) const { |
|
|
|
|
return *static_cast<const RepeatedPtrField<Message>*>(GetRawRepeatedField( |
|
|
|
|
message, field, FieldDescriptor::CPPTYPE_MESSAGE, -1, NULL)); |
|
|
|
|
message, field, FieldDescriptor::CPPTYPE_MESSAGE, -1, nullptr)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <> |
|
|
|
|
inline RepeatedPtrField<Message>* Reflection::MutableRepeatedPtrField( |
|
|
|
|
Message* message, const FieldDescriptor* field) const { |
|
|
|
|
return static_cast<RepeatedPtrField<Message>*>(MutableRawRepeatedField( |
|
|
|
|
message, field, FieldDescriptor::CPPTYPE_MESSAGE, -1, NULL)); |
|
|
|
|
message, field, FieldDescriptor::CPPTYPE_MESSAGE, -1, nullptr)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
template <typename PB> |
|
|
|
|