diff options
Diffstat (limited to 'src/google/protobuf/generated_message_reflection.h')
-rw-r--r-- | src/google/protobuf/generated_message_reflection.h | 460 |
1 files changed, 213 insertions, 247 deletions
diff --git a/src/google/protobuf/generated_message_reflection.h b/src/google/protobuf/generated_message_reflection.h index 31f249b6..0ffb3ff2 100644 --- a/src/google/protobuf/generated_message_reflection.h +++ b/src/google/protobuf/generated_message_reflection.h @@ -47,33 +47,44 @@ #include <google/protobuf/generated_enum_reflection.h> #include <google/protobuf/message.h> #include <google/protobuf/metadata.h> +#include <google/protobuf/stubs/once.h> +#include <google/protobuf/port.h> #include <google/protobuf/unknown_field_set.h> -namespace google { +#include <google/protobuf/port_def.inc> + +#ifdef SWIG +#error "You cannot SWIG proto headers" +#endif + namespace upb { namespace google_opensource { class GMR_Handlers; } // namespace google_opensource } // namespace upb +namespace google { namespace protobuf { class DescriptorPool; class MapKey; class MapValueRef; } // namespace protobuf +} // namespace google - +namespace google { namespace protobuf { namespace flat { class MetadataBuilder; } // namespace flat } // namespace protobuf +} // namespace google - +namespace google { namespace protobuf { namespace internal { class DefaultEmptyOneof; +class ReflectionAccessor; // Defined in this file. class GeneratedMessageReflection; @@ -98,7 +109,7 @@ class WeakFieldMap; // weak_field_map.h // macro. For each none oneof field, the offset is related to // the start of the message object. These can be computed at // compile time using the -// GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET() macro. +// PROTO2_GENERATED_MESSAGE_FIELD_OFFSET() macro. // Besides offsets for all fields, this array also contains // offsets for oneof unions. The offset of the i-th oneof union // is offsets[descriptor->field_count() + i]. @@ -304,199 +315,198 @@ class GeneratedMessageReflection final : public Reflection { const DescriptorPool* pool, MessageFactory* factory); - ~GeneratedMessageReflection(); + ~GeneratedMessageReflection() override; // implements Reflection ------------------------------------------- - const UnknownFieldSet& GetUnknownFields(const Message& message) const; - UnknownFieldSet* MutableUnknownFields(Message* message) const; + const UnknownFieldSet& GetUnknownFields( + const Message& message) const override; + UnknownFieldSet* MutableUnknownFields(Message* message) const override; - size_t SpaceUsedLong(const Message& message) const; + size_t SpaceUsedLong(const Message& message) const override; - bool HasField(const Message& message, const FieldDescriptor* field) const; - int FieldSize(const Message& message, const FieldDescriptor* field) const; - void ClearField(Message* message, const FieldDescriptor* field) const; + bool HasField(const Message& message, + const FieldDescriptor* field) const override; + int FieldSize(const Message& message, + const FieldDescriptor* field) const override; + void ClearField(Message* message, + const FieldDescriptor* field) const override; bool HasOneof(const Message& message, - const OneofDescriptor* oneof_descriptor) const; - void ClearOneof(Message* message, const OneofDescriptor* field) const; - void RemoveLast(Message* message, const FieldDescriptor* field) const; - Message* ReleaseLast(Message* message, const FieldDescriptor* field) const; - void Swap(Message* message1, Message* message2) const; - void SwapFields(Message* message1, Message* message2, - const std::vector<const FieldDescriptor*>& fields) const; - void SwapElements(Message* message, const FieldDescriptor* field, - int index1, int index2) const; + const OneofDescriptor* oneof_descriptor) const override; + void ClearOneof(Message* message, + const OneofDescriptor* oneof_descriptor) const override; + void RemoveLast(Message* message, + const FieldDescriptor* field) const override; + Message* ReleaseLast(Message* message, + const FieldDescriptor* field) const override; + void Swap(Message* message1, Message* message2) const override; + void SwapFields( + Message* message1, Message* message2, + const std::vector<const FieldDescriptor*>& fields) const override; + void SwapElements(Message* message, const FieldDescriptor* field, int index1, + int index2) const override; void ListFields(const Message& message, - std::vector<const FieldDescriptor*>* output) const; - - int32 GetInt32 (const Message& message, - const FieldDescriptor* field) const; - int64 GetInt64 (const Message& message, - const FieldDescriptor* field) const; + std::vector<const FieldDescriptor*>* output) const override; + int32 GetInt32(const Message& message, + const FieldDescriptor* field) const override; + int64 GetInt64(const Message& message, + const FieldDescriptor* field) const override; uint32 GetUInt32(const Message& message, - const FieldDescriptor* field) const; + const FieldDescriptor* field) const override; uint64 GetUInt64(const Message& message, - const FieldDescriptor* field) const; - float GetFloat (const Message& message, - const FieldDescriptor* field) const; + const FieldDescriptor* field) const override; + float GetFloat(const Message& message, + const FieldDescriptor* field) const override; double GetDouble(const Message& message, - const FieldDescriptor* field) const; - bool GetBool (const Message& message, - const FieldDescriptor* field) const; - string GetString(const Message& message, - const FieldDescriptor* field) const; - const string& GetStringReference(const Message& message, + const FieldDescriptor* field) const override; + bool GetBool(const Message& message, + const FieldDescriptor* field) const override; + std::string GetString(const Message& message, + const FieldDescriptor* field) const override; + const std::string& GetStringReference(const Message& message, const FieldDescriptor* field, - string* scratch) const; - const EnumValueDescriptor* GetEnum(const Message& message, - const FieldDescriptor* field) const; + std::string* scratch) const override; + const EnumValueDescriptor* GetEnum( + const Message& message, const FieldDescriptor* field) const override; int GetEnumValue(const Message& message, - const FieldDescriptor* field) const; + const FieldDescriptor* field) const override; const Message& GetMessage(const Message& message, const FieldDescriptor* field, - MessageFactory* factory = NULL) const; + MessageFactory* factory = NULL) const override; const FieldDescriptor* GetOneofFieldDescriptor( const Message& message, - const OneofDescriptor* oneof_descriptor) const; + const OneofDescriptor* oneof_descriptor) const override; private: - bool ContainsMapKey(const Message& message, - const FieldDescriptor* field, - const MapKey& key) const; - bool InsertOrLookupMapValue(Message* message, - const FieldDescriptor* field, + bool ContainsMapKey(const Message& message, const FieldDescriptor* field, + const MapKey& key) const override; + bool InsertOrLookupMapValue(Message* message, const FieldDescriptor* field, const MapKey& key, - MapValueRef* val) const; - bool DeleteMapValue(Message* message, - const FieldDescriptor* field, - const MapKey& key) const; - MapIterator MapBegin( - Message* message, - const FieldDescriptor* field) const; - MapIterator MapEnd( - Message* message, - const FieldDescriptor* field) const; - int MapSize(const Message& message, const FieldDescriptor* field) const; + MapValueRef* val) const override; + bool DeleteMapValue(Message* message, const FieldDescriptor* field, + const MapKey& key) const override; + MapIterator MapBegin(Message* message, + const FieldDescriptor* field) const override; + MapIterator MapEnd(Message* message, + const FieldDescriptor* field) const override; + int MapSize(const Message& message, + const FieldDescriptor* field) const override; public: - 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 string& value) const; - void SetEnum (Message* message, const FieldDescriptor* field, - const EnumValueDescriptor* value) const; + void SetInt32(Message* message, const FieldDescriptor* field, + int32 value) const override; + void SetInt64(Message* message, const FieldDescriptor* field, + int64 value) const override; + void SetUInt32(Message* message, const FieldDescriptor* field, + uint32 value) const override; + void SetUInt64(Message* message, const FieldDescriptor* field, + uint64 value) const override; + void SetFloat(Message* message, const FieldDescriptor* field, + float value) const override; + void SetDouble(Message* message, const FieldDescriptor* field, + double value) const override; + void SetBool(Message* message, const FieldDescriptor* field, + bool value) const override; + void SetString(Message* message, const FieldDescriptor* field, + const std::string& value) const override; + void SetEnum(Message* message, const FieldDescriptor* field, + const EnumValueDescriptor* value) const override; void SetEnumValue(Message* message, const FieldDescriptor* field, - int value) const; + int value) const override; Message* MutableMessage(Message* message, const FieldDescriptor* field, - MessageFactory* factory = NULL) const; - void SetAllocatedMessage(Message* message, - Message* sub_message, - const FieldDescriptor* field) const; + MessageFactory* factory = NULL) const override; + void SetAllocatedMessage(Message* message, Message* sub_message, + const FieldDescriptor* field) const override; Message* ReleaseMessage(Message* message, const FieldDescriptor* field, - MessageFactory* factory = NULL) const; - - 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; - string GetRepeatedString(const Message& message, - const FieldDescriptor* field, int index) const; - const string& GetRepeatedStringReference(const Message& message, + MessageFactory* factory = NULL) const override; + + int32 GetRepeatedInt32(const Message& message, const FieldDescriptor* field, + int index) const override; + int64 GetRepeatedInt64(const Message& message, const FieldDescriptor* field, + int index) const override; + uint32 GetRepeatedUInt32(const Message& message, const FieldDescriptor* field, + int index) const override; + uint64 GetRepeatedUInt64(const Message& message, const FieldDescriptor* field, + int index) const override; + float GetRepeatedFloat(const Message& message, const FieldDescriptor* field, + int index) const override; + double GetRepeatedDouble(const Message& message, const FieldDescriptor* field, + int index) const override; + bool GetRepeatedBool(const Message& message, const FieldDescriptor* field, + int index) const override; + std::string GetRepeatedString(const Message& message, const FieldDescriptor* field, + int index) const override; + const std::string& GetRepeatedStringReference(const Message& message, const FieldDescriptor* field, - int index, string* scratch) const; + int index, + std::string* scratch) const override; const EnumValueDescriptor* GetRepeatedEnum(const Message& message, const FieldDescriptor* field, - int index) const; - int GetRepeatedEnumValue(const Message& message, - const FieldDescriptor* field, - int index) const; + int index) const override; + int GetRepeatedEnumValue(const Message& message, const FieldDescriptor* field, + int index) const override; const Message& GetRepeatedMessage(const Message& message, const FieldDescriptor* field, - int index) const; + int index) const override; // Set the value of a field. - 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 string& value) const; + void SetRepeatedInt32(Message* message, const FieldDescriptor* field, + int index, int32 value) const override; + void SetRepeatedInt64(Message* message, const FieldDescriptor* field, + int index, int64 value) const override; + void SetRepeatedUInt32(Message* message, const FieldDescriptor* field, + int index, uint32 value) const override; + void SetRepeatedUInt64(Message* message, const FieldDescriptor* field, + int index, uint64 value) const override; + void SetRepeatedFloat(Message* message, const FieldDescriptor* field, + int index, float value) const override; + void SetRepeatedDouble(Message* message, const FieldDescriptor* field, + int index, double value) const override; + void SetRepeatedBool(Message* message, const FieldDescriptor* field, + int index, bool value) const override; + void SetRepeatedString(Message* message, const FieldDescriptor* field, + int index, const std::string& value) const override; void SetRepeatedEnum(Message* message, const FieldDescriptor* field, - int index, const EnumValueDescriptor* value) const; + int index, + const EnumValueDescriptor* value) const override; void SetRepeatedEnumValue(Message* message, const FieldDescriptor* field, - int index, int value) const; + int index, int value) const override; // Get a mutable pointer to a field with a message type. Message* MutableRepeatedMessage(Message* message, const FieldDescriptor* field, - int index) const; - - 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 string& value) const; - void AddEnum(Message* message, - const FieldDescriptor* field, - const EnumValueDescriptor* value) const; - void AddEnumValue(Message* message, - const FieldDescriptor* field, - int value) const; + int index) const override; + + void AddInt32(Message* message, const FieldDescriptor* field, + int32 value) const override; + void AddInt64(Message* message, const FieldDescriptor* field, + int64 value) const override; + void AddUInt32(Message* message, const FieldDescriptor* field, + uint32 value) const override; + void AddUInt64(Message* message, const FieldDescriptor* field, + uint64 value) const override; + void AddFloat(Message* message, const FieldDescriptor* field, + float value) const override; + void AddDouble(Message* message, const FieldDescriptor* field, + double value) const override; + void AddBool(Message* message, const FieldDescriptor* field, + bool value) const override; + void AddString(Message* message, const FieldDescriptor* field, + const std::string& value) const override; + void AddEnum(Message* message, const FieldDescriptor* field, + const EnumValueDescriptor* value) const override; + void AddEnumValue(Message* message, const FieldDescriptor* field, + int value) const override; Message* AddMessage(Message* message, const FieldDescriptor* field, - MessageFactory* factory = NULL) const; - void AddAllocatedMessage( - Message* message, const FieldDescriptor* field, - Message* new_entry) const; + MessageFactory* factory = NULL) const override; + void AddAllocatedMessage(Message* message, const FieldDescriptor* field, + Message* new_entry) const override; - const FieldDescriptor* FindKnownExtensionByName(const string& name) const; - const FieldDescriptor* FindKnownExtensionByNumber(int number) const; + const FieldDescriptor* FindKnownExtensionByName( + const std::string& name) const override; + const FieldDescriptor* FindKnownExtensionByNumber(int number) const override; - bool SupportsUnknownEnumValues() const; + bool SupportsUnknownEnumValues() const override; // This value for arena_offset_ indicates that there is no arena pointer in // this message (e.g., old generated code). @@ -512,24 +522,24 @@ class GeneratedMessageReflection final : public Reflection { static const int kUnknownFieldSetInMetadata = -1; protected: - void* MutableRawRepeatedField( - Message* message, const FieldDescriptor* field, FieldDescriptor::CppType, - int ctype, const Descriptor* desc) const; + void* MutableRawRepeatedField(Message* message, const FieldDescriptor* field, + FieldDescriptor::CppType, int ctype, + const Descriptor* desc) const override; - const void* GetRawRepeatedField( - const Message& message, const FieldDescriptor* field, - FieldDescriptor::CppType, int ctype, - const Descriptor* desc) const; + const void* GetRawRepeatedField(const Message& message, + const FieldDescriptor* field, + FieldDescriptor::CppType, int ctype, + const Descriptor* desc) const override; - virtual MessageFactory* GetMessageFactory() const; + MessageFactory* GetMessageFactory() const override; - virtual void* RepeatedFieldData( - Message* message, const FieldDescriptor* field, - FieldDescriptor::CppType cpp_type, - const Descriptor* message_type) const; + void* RepeatedFieldData(Message* message, const FieldDescriptor* field, + FieldDescriptor::CppType cpp_type, + const Descriptor* message_type) const override; private: friend class google::protobuf::flat::MetadataBuilder; + friend class ReflectionAccessor; friend class upb::google_opensource::GMR_Handlers; const Descriptor* const descriptor_; @@ -660,8 +670,8 @@ class GeneratedMessageReflection final : public Reflection { Message* sub_message, const FieldDescriptor* field) const; - internal::MapFieldBase* MapData( - Message* message, const FieldDescriptor* field) const; + internal::MapFieldBase* MapData(Message* message, + const FieldDescriptor* field) const override; friend inline // inline so nobody can call this function. void @@ -669,89 +679,45 @@ class GeneratedMessageReflection final : public Reflection { GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GeneratedMessageReflection); }; -// There are some places in proto2 where dynamic_cast would be useful as an -// optimization. For example, take Message::MergeFrom(const Message& other). -// For a given generated message FooMessage, we generate these two methods: -// void MergeFrom(const FooMessage& other); -// void MergeFrom(const Message& other); -// The former method can be implemented directly in terms of FooMessage's -// inline accessors, but the latter method must work with the reflection -// interface. However, if the parameter to the latter method is actually of -// type FooMessage, then we'd like to be able to just call the other method -// as an optimization. So, we use dynamic_cast to check this. -// -// That said, dynamic_cast requires RTTI, which many people like to disable -// for performance and code size reasons. When RTTI is not available, we -// still need to produce correct results. So, in this case we have to fall -// back to using reflection, which is what we would have done anyway if the -// objects were not of the exact same class. -// -// dynamic_cast_if_available() implements this logic. If RTTI is -// enabled, it does a dynamic_cast. If RTTI is disabled, it just returns -// NULL. -template<typename To, typename From> -inline To dynamic_cast_if_available(From from) { -#ifdef GOOGLE_PROTOBUF_NO_RTTI - // Avoid the compiler warning about unused variables. - (void)from; - return NULL; -#else - return dynamic_cast<To>(from); -#endif -} - -// Tries to downcast this message to a generated message type. -// Returns NULL if this class is not an instance of T. -// -// This is like dynamic_cast_if_available, except it works even when -// dynamic_cast is not available by using Reflection. However it only works -// with Message objects. -// -// TODO(haberman): can we remove dynamic_cast_if_available in favor of this? -template <typename T> -T* DynamicCastToGenerated(const Message* from) { - // Compile-time assert that T is a generated type that has a - // default_instance() accessor, but avoid actually calling it. - const T&(*get_default_instance)() = &T::default_instance; - (void)get_default_instance; - - // Compile-time assert that T is a subclass of google::protobuf::Message. - const Message* unused = static_cast<T*>(NULL); - (void)unused; - -#ifdef GOOGLE_PROTOBUF_NO_RTTI - bool ok = &T::default_instance() == - from->GetReflection()->GetMessageFactory()->GetPrototype( - from->GetDescriptor()); - return ok ? down_cast<T*>(from) : NULL; -#else - return dynamic_cast<T*>(from); -#endif -} +typedef void (*InitFunc)(); + +struct PROTOBUF_EXPORT AssignDescriptorsTable { + once_flag once; + InitFunc add_descriptors; + const char* filename; + const MigrationSchema* schemas; + const Message* const* default_instances; + const uint32* offsets; + // update the following descriptor arrays. + Metadata* file_level_metadata; + int num_messages; + const EnumDescriptor** file_level_enum_descriptors; + const ServiceDescriptor** file_level_service_descriptors; +}; -template <typename T> -T* DynamicCastToGenerated(Message* from) { - const Message* message_const = from; - return const_cast<T*>(DynamicCastToGenerated<const T>(message_const)); -} +void PROTOBUF_EXPORT AssignDescriptors(AssignDescriptorsTable* table); -LIBPROTOBUF_EXPORT void AssignDescriptors( - const string& filename, const MigrationSchema* schemas, - const Message* const* default_instances_, const uint32* offsets, - // update the following descriptor arrays. - Metadata* file_level_metadata, - const EnumDescriptor** file_level_enum_descriptors, - const ServiceDescriptor** file_level_service_descriptors); +struct PROTOBUF_EXPORT DescriptorTable { + bool is_initialized; + InitFunc init_defaults; + const char* descriptor; + const char* filename; + AssignDescriptorsTable* assign_descriptors_table; + int size; // of serialized descriptor +}; -LIBPROTOBUF_EXPORT void RegisterAllTypes(const Metadata* file_level_metadata, int size); +void PROTOBUF_EXPORT AddDescriptors(DescriptorTable* table, + const InitFunc* deps, int num_deps); // These cannot be in lite so we put them in the reflection. -LIBPROTOBUF_EXPORT void UnknownFieldSetSerializer(const uint8* base, uint32 offset, uint32 tag, - uint32 has_offset, - ::google::protobuf::io::CodedOutputStream* output); +PROTOBUF_EXPORT void UnknownFieldSetSerializer(const uint8* base, uint32 offset, + uint32 tag, uint32 has_offset, + io::CodedOutputStream* output); } // namespace internal } // namespace protobuf - } // namespace google + +#include <google/protobuf/port_undef.inc> + #endif // GOOGLE_PROTOBUF_GENERATED_MESSAGE_REFLECTION_H__ |