Index: third_party/protobuf/src/google/protobuf/generated_message_reflection.h |
diff --git a/third_party/protobuf/src/google/protobuf/generated_message_reflection.h b/third_party/protobuf/src/google/protobuf/generated_message_reflection.h |
index c1c142fa8aa400fffe36f9c3ae5f55daf77c4cac..9ef7871075de1e2014617a70f37d3617ad6d1271 100644 |
--- a/third_party/protobuf/src/google/protobuf/generated_message_reflection.h |
+++ b/third_party/protobuf/src/google/protobuf/generated_message_reflection.h |
@@ -1,6 +1,6 @@ |
// Protocol Buffers - Google's data interchange format |
// Copyright 2008 Google Inc. All rights reserved. |
-// http://code.google.com/p/protobuf/ |
+// https://developers.google.com/protocol-buffers/ |
// |
// Redistribution and use in source and binary forms, with or without |
// modification, are permitted provided that the following conditions are |
@@ -40,11 +40,13 @@ |
#include <string> |
#include <vector> |
+#include <google/protobuf/stubs/casts.h> |
#include <google/protobuf/stubs/common.h> |
// TODO(jasonh): Remove this once the compiler change to directly include this |
// is released to components. |
#include <google/protobuf/generated_enum_reflection.h> |
#include <google/protobuf/message.h> |
+#include <google/protobuf/metadata.h> |
#include <google/protobuf/unknown_field_set.h> |
@@ -56,11 +58,14 @@ class GMR_Handlers; |
} // namespace upb |
namespace protobuf { |
- class DescriptorPool; |
+class DescriptorPool; |
+class MapKey; |
+class MapValueRef; |
} |
namespace protobuf { |
namespace internal { |
+class DefaultEmptyOneof; |
// Defined in this file. |
class GeneratedMessageReflection; |
@@ -133,9 +138,77 @@ class LIBPROTOBUF_EXPORT GeneratedMessageReflection : public Reflection { |
int extensions_offset, |
const DescriptorPool* pool, |
MessageFactory* factory, |
- int object_size); |
+ int object_size, |
+ int arena_offset, |
+ int is_default_instance_offset = -1); |
+ |
+ // Similar with the construction above. Call this construction if the |
+ // message has oneof definition. |
+ // Parameters: |
+ // offsets: An array of ints giving the byte offsets. |
+ // For each oneof field, the offset is relative to the |
+ // default_oneof_instance. These can be computed at compile |
+ // time using the |
+ // PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET() 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. |
+ // 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]. |
+ // default_oneof_instance: The default instance of the oneofs. It is a |
+ // struct holding the default value of all oneof fields |
+ // for this message. It is only used to obtain pointers |
+ // to default instances of oneof fields, which Get |
+ // methods will return if the field is not set. |
+ // oneof_case_offset: Offset in the message of an array of uint32s of |
+ // size descriptor->oneof_decl_count(). Each uint32 |
+ // indicates what field is set for each oneof. |
+ // other parameters are the same with the construction above. |
+ GeneratedMessageReflection(const Descriptor* descriptor, |
+ const Message* default_instance, |
+ const int offsets[], |
+ int has_bits_offset, |
+ int unknown_fields_offset, |
+ int extensions_offset, |
+ const void* default_oneof_instance, |
+ int oneof_case_offset, |
+ const DescriptorPool* pool, |
+ MessageFactory* factory, |
+ int object_size, |
+ int arena_offset, |
+ int is_default_instance_offset = -1); |
~GeneratedMessageReflection(); |
+ // Shorter-to-call helpers for the above two constructions that work if the |
+ // pool and factory are the usual, namely, DescriptorPool::generated_pool() |
+ // and MessageFactory::generated_factory(). |
+ |
+ static GeneratedMessageReflection* NewGeneratedMessageReflection( |
+ const Descriptor* descriptor, |
+ const Message* default_instance, |
+ const int offsets[], |
+ int has_bits_offset, |
+ int unknown_fields_offset, |
+ int extensions_offset, |
+ const void* default_oneof_instance, |
+ int oneof_case_offset, |
+ int object_size, |
+ int arena_offset, |
+ int is_default_instance_offset = -1); |
+ |
+ static GeneratedMessageReflection* NewGeneratedMessageReflection( |
+ const Descriptor* descriptor, |
+ const Message* default_instance, |
+ const int offsets[], |
+ int has_bits_offset, |
+ int unknown_fields_offset, |
+ int extensions_offset, |
+ int object_size, |
+ int arena_offset, |
+ int is_default_instance_offset = -1); |
+ |
// implements Reflection ------------------------------------------- |
const UnknownFieldSet& GetUnknownFields(const Message& message) const; |
@@ -146,11 +219,16 @@ class LIBPROTOBUF_EXPORT GeneratedMessageReflection : public Reflection { |
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 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 vector<const FieldDescriptor*>& fields) const; |
void SwapElements(Message* message, const FieldDescriptor* field, |
- int index1, int index2) const; |
+ int index1, int index2) const; |
void ListFields(const Message& message, |
vector<const FieldDescriptor*>* output) const; |
@@ -175,10 +253,36 @@ class LIBPROTOBUF_EXPORT GeneratedMessageReflection : public Reflection { |
string* scratch) const; |
const EnumValueDescriptor* GetEnum(const Message& message, |
const FieldDescriptor* field) const; |
+ int GetEnumValue(const Message& message, |
+ const FieldDescriptor* field) const; |
const Message& GetMessage(const Message& message, |
const FieldDescriptor* field, |
MessageFactory* factory = NULL) const; |
+ const FieldDescriptor* GetOneofFieldDescriptor( |
+ const Message& message, |
+ const OneofDescriptor* oneof_descriptor) const; |
+ |
+ private: |
+ bool ContainsMapKey(const Message& message, |
+ const FieldDescriptor* field, |
+ const MapKey& key) const; |
+ 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; |
+ |
+ public: |
void SetInt32 (Message* message, |
const FieldDescriptor* field, int32 value) const; |
void SetInt64 (Message* message, |
@@ -198,8 +302,13 @@ class LIBPROTOBUF_EXPORT GeneratedMessageReflection : public Reflection { |
const string& value) const; |
void SetEnum (Message* message, const FieldDescriptor* field, |
const EnumValueDescriptor* value) const; |
+ void SetEnumValue(Message* message, const FieldDescriptor* field, |
+ int value) const; |
Message* MutableMessage(Message* message, const FieldDescriptor* field, |
MessageFactory* factory = NULL) const; |
+ void SetAllocatedMessage(Message* message, |
+ Message* sub_message, |
+ const FieldDescriptor* field) const; |
Message* ReleaseMessage(Message* message, const FieldDescriptor* field, |
MessageFactory* factory = NULL) const; |
@@ -225,6 +334,9 @@ class LIBPROTOBUF_EXPORT GeneratedMessageReflection : public Reflection { |
const EnumValueDescriptor* GetRepeatedEnum(const Message& message, |
const FieldDescriptor* field, |
int index) const; |
+ int GetRepeatedEnumValue(const Message& message, |
+ const FieldDescriptor* field, |
+ int index) const; |
const Message& GetRepeatedMessage(const Message& message, |
const FieldDescriptor* field, |
int index) const; |
@@ -249,6 +361,8 @@ class LIBPROTOBUF_EXPORT GeneratedMessageReflection : public Reflection { |
const string& value) const; |
void SetRepeatedEnum(Message* message, const FieldDescriptor* field, |
int index, const EnumValueDescriptor* value) const; |
+ void SetRepeatedEnumValue(Message* message, const FieldDescriptor* field, |
+ int index, int value) const; |
// Get a mutable pointer to a field with a message type. |
Message* MutableRepeatedMessage(Message* message, |
const FieldDescriptor* field, |
@@ -273,33 +387,72 @@ class LIBPROTOBUF_EXPORT GeneratedMessageReflection : public Reflection { |
void AddEnum(Message* message, |
const FieldDescriptor* field, |
const EnumValueDescriptor* value) const; |
+ void AddEnumValue(Message* message, |
+ const FieldDescriptor* field, |
+ int value) const; |
Message* AddMessage(Message* message, const FieldDescriptor* field, |
MessageFactory* factory = NULL) const; |
+ void AddAllocatedMessage( |
+ Message* message, const FieldDescriptor* field, |
+ Message* new_entry) const; |
const FieldDescriptor* FindKnownExtensionByName(const string& name) const; |
const FieldDescriptor* FindKnownExtensionByNumber(int number) const; |
+ bool SupportsUnknownEnumValues() const; |
+ |
+ // This value for arena_offset_ indicates that there is no arena pointer in |
+ // this message (e.g., old generated code). |
+ static const int kNoArenaPointer = -1; |
+ |
+ // This value for unknown_field_offset_ indicates that there is no |
+ // UnknownFieldSet in this message, and that instead, we are using the |
+ // Zero-Overhead Arena Pointer trick. When this is the case, arena_offset_ |
+ // actually indexes to an InternalMetadataWithArena instance, which can return |
+ // either an arena pointer or an UnknownFieldSet or both. It is never the case |
+ // that unknown_field_offset_ == kUnknownFieldSetInMetadata && arena_offset_ |
+ // == kNoArenaPointer. |
+ static const int kUnknownFieldSetInMetadata = -1; |
+ |
protected: |
- virtual void* MutableRawRepeatedField( |
+ void* MutableRawRepeatedField( |
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; |
+ |
+ virtual MessageFactory* GetMessageFactory() const; |
+ |
+ virtual void* RepeatedFieldData( |
+ Message* message, const FieldDescriptor* field, |
+ FieldDescriptor::CppType cpp_type, |
+ const Descriptor* message_type) const; |
+ |
private: |
friend class GeneratedMessage; |
// To parse directly into a proto2 generated class, the class GMR_Handlers |
// needs access to member offsets and hasbits. |
- friend class LIBPROTOBUF_EXPORT upb::google_opensource::GMR_Handlers; |
+ friend class upb::google_opensource::GMR_Handlers; |
const Descriptor* descriptor_; |
const Message* default_instance_; |
+ const void* default_oneof_instance_; |
const int* offsets_; |
int has_bits_offset_; |
+ int oneof_case_offset_; |
int unknown_fields_offset_; |
int extensions_offset_; |
+ int arena_offset_; |
+ int is_default_instance_offset_; |
int object_size_; |
+ static const int kHasNoDefaultInstanceField = -1; |
+ |
const DescriptorPool* descriptor_pool_; |
MessageFactory* message_factory_; |
@@ -311,11 +464,26 @@ class LIBPROTOBUF_EXPORT GeneratedMessageReflection : public Reflection { |
const FieldDescriptor* field) const; |
template <typename Type> |
inline const Type& DefaultRaw(const FieldDescriptor* field) const; |
+ template <typename Type> |
+ inline const Type& DefaultOneofRaw(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 ExtensionSet& GetExtensionSet(const Message& message) const; |
inline 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 GetIsDefaultInstance(const Message& message) const; |
inline bool HasBit(const Message& message, |
const FieldDescriptor* field) const; |
@@ -323,6 +491,26 @@ class LIBPROTOBUF_EXPORT GeneratedMessageReflection : public Reflection { |
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, |
@@ -358,6 +546,31 @@ class LIBPROTOBUF_EXPORT GeneratedMessageReflection : public Reflection { |
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; |
+ |
+ |
+ Message* UnsafeArenaReleaseMessage(Message* message, |
+ const FieldDescriptor* field, |
+ MessageFactory* factory = NULL) const; |
+ |
+ void UnsafeArenaSetAllocatedMessage(Message* message, |
+ Message* sub_message, |
+ const FieldDescriptor* field) const; |
+ |
+ internal::MapFieldBase* MapData( |
+ Message* message, const FieldDescriptor* field) const; |
+ |
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GeneratedMessageReflection); |
}; |
@@ -376,9 +589,14 @@ class LIBPROTOBUF_EXPORT GeneratedMessageReflection : public Reflection { |
// be confused by an unaligned pointer. |
#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TYPE, FIELD) \ |
static_cast<int>( \ |
- reinterpret_cast<const char*>( \ |
- &reinterpret_cast<const TYPE*>(16)->FIELD) - \ |
- reinterpret_cast<const char*>(16)) |
+ reinterpret_cast<const char*>( \ |
+ &reinterpret_cast<const TYPE*>(16)->FIELD) - \ |
+ reinterpret_cast<const char*>(16)) |
+ |
+#define PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET(ONEOF, FIELD) \ |
+ static_cast<int>( \ |
+ reinterpret_cast<const char*>(&(ONEOF->FIELD)) \ |
+ - reinterpret_cast<const char*>(ONEOF)) |
// There are some places in proto2 where dynamic_cast would be useful as an |
// optimization. For example, take Message::MergeFrom(const Message& other). |
@@ -412,6 +630,42 @@ inline To dynamic_cast_if_available(From 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; |
+ |
+#if defined(GOOGLE_PROTOBUF_NO_RTTI) || \ |
+ (defined(_MSC_VER) && !defined(_CPPRTTI)) |
+ 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 |
+} |
+ |
+template <typename T> |
+T* DynamicCastToGenerated(Message* from) { |
+ const Message* message_const = from; |
+ return const_cast<T*>(DynamicCastToGenerated<const T>(message_const)); |
+} |
+ |
} // namespace internal |
} // namespace protobuf |