Index: third_party/protobuf/src/google/protobuf/metadata.h |
diff --git a/third_party/protobuf/src/google/protobuf/metadata.h b/third_party/protobuf/src/google/protobuf/metadata.h |
index f9257534eecf4f5589dceb39b308f3779f64ef57..fdee150b44f5c7d92ba1ccf0fc062c4887e65b8c 100644 |
--- a/third_party/protobuf/src/google/protobuf/metadata.h |
+++ b/third_party/protobuf/src/google/protobuf/metadata.h |
@@ -40,8 +40,6 @@ |
#include <google/protobuf/stubs/common.h> |
#include <google/protobuf/arena.h> |
-#include <google/protobuf/arenastring.h> |
-#include <google/protobuf/generated_message_util.h> |
#include <google/protobuf/unknown_field_set.h> |
namespace google { |
@@ -58,30 +56,30 @@ namespace internal { |
// The tagged pointer uses the LSB to disambiguate cases, and uses bit 0 == 0 to |
// indicate an arena pointer and bit 0 == 1 to indicate a UFS+Arena-container |
// pointer. |
-template <class T, class Derived> |
-class InternalMetadataWithArenaBase { |
+class LIBPROTOBUF_EXPORT InternalMetadataWithArena { |
public: |
- InternalMetadataWithArenaBase() : ptr_(NULL) {} |
- explicit InternalMetadataWithArenaBase(Arena* arena) : ptr_(arena) {} |
+ InternalMetadataWithArena() : ptr_(NULL) {} |
+ explicit InternalMetadataWithArena(Arena* arena) |
+ : ptr_ (arena) {} |
- ~InternalMetadataWithArenaBase() { |
+ ~InternalMetadataWithArena() { |
if (have_unknown_fields() && arena() == NULL) { |
delete PtrValue<Container>(); |
} |
ptr_ = NULL; |
} |
- GOOGLE_ATTRIBUTE_ALWAYS_INLINE const T& unknown_fields() const { |
+ GOOGLE_ATTRIBUTE_ALWAYS_INLINE const UnknownFieldSet& unknown_fields() const { |
if (GOOGLE_PREDICT_FALSE(have_unknown_fields())) { |
- return PtrValue<Container>()->unknown_fields; |
+ return PtrValue<Container>()->unknown_fields_; |
} else { |
- return Derived::default_instance(); |
+ return *UnknownFieldSet::default_instance(); |
} |
} |
- GOOGLE_ATTRIBUTE_ALWAYS_INLINE T* mutable_unknown_fields() { |
+ GOOGLE_ATTRIBUTE_ALWAYS_INLINE UnknownFieldSet* mutable_unknown_fields() { |
if (GOOGLE_PREDICT_TRUE(have_unknown_fields())) { |
- return &PtrValue<Container>()->unknown_fields; |
+ return &PtrValue<Container>()->unknown_fields_; |
} else { |
return mutable_unknown_fields_slow(); |
} |
@@ -89,7 +87,7 @@ class InternalMetadataWithArenaBase { |
GOOGLE_ATTRIBUTE_ALWAYS_INLINE Arena* arena() const { |
if (GOOGLE_PREDICT_FALSE(have_unknown_fields())) { |
- return PtrValue<Container>()->arena; |
+ return PtrValue<Container>()->arena_; |
} else { |
return PtrValue<Arena>(); |
} |
@@ -99,7 +97,7 @@ class InternalMetadataWithArenaBase { |
return PtrTag() == kTagContainer; |
} |
- GOOGLE_ATTRIBUTE_ALWAYS_INLINE void Swap(Derived* other) { |
+ GOOGLE_ATTRIBUTE_ALWAYS_INLINE void Swap(InternalMetadataWithArena* other) { |
// Semantics here are that we swap only the unknown fields, not the arena |
// pointer. We cannot simply swap ptr_ with other->ptr_ because we need to |
// maintain our own arena ptr. Also, our ptr_ and other's ptr_ may be in |
@@ -107,19 +105,7 @@ class InternalMetadataWithArenaBase { |
// cannot simply swap ptr_ and then restore the arena pointers. We reuse |
// UFS's swap implementation instead. |
if (have_unknown_fields() || other->have_unknown_fields()) { |
- static_cast<Derived*>(this)->DoSwap(other->mutable_unknown_fields()); |
- } |
- } |
- |
- GOOGLE_ATTRIBUTE_ALWAYS_INLINE void MergeFrom(const Derived& other) { |
- if (other.have_unknown_fields()) { |
- static_cast<Derived*>(this)->DoMergeFrom(other.unknown_fields()); |
- } |
- } |
- |
- GOOGLE_ATTRIBUTE_ALWAYS_INLINE void Clear() { |
- if (have_unknown_fields()) { |
- static_cast<Derived*>(this)->DoClear(); |
+ mutable_unknown_fields()->Swap(other->mutable_unknown_fields()); |
} |
} |
@@ -145,80 +131,30 @@ class InternalMetadataWithArenaBase { |
return reinterpret_cast<intptr_t>(ptr_) & kPtrTagMask; |
} |
- template<typename U> U* PtrValue() const { |
- return reinterpret_cast<U*>( |
+ template<typename T> T* PtrValue() const { |
+ return reinterpret_cast<T*>( |
reinterpret_cast<intptr_t>(ptr_) & kPtrValueMask); |
} |
// If ptr_'s tag is kTagContainer, it points to an instance of this struct. |
struct Container { |
- T unknown_fields; |
- Arena* arena; |
+ UnknownFieldSet unknown_fields_; |
+ Arena* arena_; |
}; |
- GOOGLE_ATTRIBUTE_NOINLINE T* mutable_unknown_fields_slow() { |
+ GOOGLE_ATTRIBUTE_NOINLINE UnknownFieldSet* mutable_unknown_fields_slow() { |
Arena* my_arena = arena(); |
Container* container = Arena::Create<Container>(my_arena); |
ptr_ = reinterpret_cast<void*>( |
reinterpret_cast<intptr_t>(container) | kTagContainer); |
- container->arena = my_arena; |
- return &(container->unknown_fields); |
- } |
-}; |
- |
-class InternalMetadataWithArena |
- : public InternalMetadataWithArenaBase<UnknownFieldSet, |
- InternalMetadataWithArena> { |
- public: |
- InternalMetadataWithArena() {} |
- explicit InternalMetadataWithArena(Arena* arena) |
- : InternalMetadataWithArenaBase(arena) {} |
- |
- void DoSwap(UnknownFieldSet* other) { |
- mutable_unknown_fields()->Swap(other); |
- } |
- |
- void DoMergeFrom(const UnknownFieldSet& other) { |
- mutable_unknown_fields()->MergeFrom(other); |
- } |
- |
- void DoClear() { |
- mutable_unknown_fields()->Clear(); |
- } |
- |
- static const UnknownFieldSet& default_instance() { |
- return *UnknownFieldSet::default_instance(); |
+ container->arena_ = my_arena; |
+ return &(container->unknown_fields_); |
} |
}; |
-// We store unknown fields as a string right now, because there is currently no |
-// good interface for reading unknown fields into an ArenaString. We may want |
-// to revisit this to allow unknown fields to be parsed onto the Arena. |
-class InternalMetadataWithArenaLite |
- : public InternalMetadataWithArenaBase<string, |
- InternalMetadataWithArenaLite> { |
- public: |
- InternalMetadataWithArenaLite() {} |
- |
- explicit InternalMetadataWithArenaLite(Arena* arena) |
- : InternalMetadataWithArenaBase(arena) {} |
- |
- void DoSwap(string* other) { |
- mutable_unknown_fields()->swap(*other); |
- } |
- |
- void DoMergeFrom(const string& other) { |
- mutable_unknown_fields()->append(other); |
- } |
- |
- void DoClear() { |
- mutable_unknown_fields()->clear(); |
- } |
- |
- static const string& default_instance() { |
- return GetEmptyStringAlreadyInited(); |
- } |
-}; |
+// Temporary compatibility typedef. Remove once this is released in components |
+// and upb CL is submitted. |
+typedef InternalMetadataWithArena InternalMetadata; |
} // namespace internal |
} // namespace protobuf |