Index: third_party/protobuf/src/google/protobuf/unknown_field_set.h |
diff --git a/third_party/protobuf/src/google/protobuf/unknown_field_set.h b/third_party/protobuf/src/google/protobuf/unknown_field_set.h |
index cde1f85c646600410c9a201588cd6c47cfc4d5ac..612a942a771d84da2392bc5c8d47877b7447a2d2 100644 |
--- a/third_party/protobuf/src/google/protobuf/unknown_field_set.h |
+++ b/third_party/protobuf/src/google/protobuf/unknown_field_set.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 |
@@ -42,7 +42,7 @@ |
#include <string> |
#include <vector> |
#include <google/protobuf/stubs/common.h> |
-// TODO(jasonh): some people seem to rely on protobufs to include this for them! |
+#include <google/protobuf/stubs/logging.h> |
namespace google { |
namespace protobuf { |
@@ -53,7 +53,7 @@ namespace protobuf { |
} |
namespace internal { |
class WireFormat; // wire_format.h |
- class UnknownFieldSetFieldSkipperUsingCord; |
+ class MessageSetFieldSkipperUsingCord; |
// extension_set_heavy.cc |
} |
@@ -89,6 +89,9 @@ class LIBPROTOBUF_EXPORT UnknownFieldSet { |
// Merge the contents of some other UnknownFieldSet with this one. |
void MergeFrom(const UnknownFieldSet& other); |
+ // Similar to above, but this function will destroy the contents of other. |
+ void MergeFromAndDestroy(UnknownFieldSet* other); |
+ |
// Swaps the contents of some other UnknownFieldSet with this one. |
inline void Swap(UnknownFieldSet* x); |
@@ -139,15 +142,25 @@ class LIBPROTOBUF_EXPORT UnknownFieldSet { |
bool ParseFromZeroCopyStream(io::ZeroCopyInputStream* input); |
bool ParseFromArray(const void* data, int size); |
inline bool ParseFromString(const string& data) { |
- return ParseFromArray(data.data(), data.size()); |
+ return ParseFromArray(data.data(), static_cast<int>(data.size())); |
} |
+ static const UnknownFieldSet* default_instance(); |
private: |
- |
+ // For InternalMergeFrom |
+ friend class UnknownField; |
+ // Merges from other UnknownFieldSet. This method assumes, that this object |
+ // is newly created and has fields_ == NULL; |
+ void InternalMergeFrom(const UnknownFieldSet& other); |
void ClearFallback(); |
+ // fields_ is either NULL, or a pointer to a vector that is *non-empty*. We |
+ // never hold the empty vector because we want the 'do we have any unknown |
+ // fields' check to be fast, and avoid a cache miss: the UFS instance gets |
+ // embedded in the message object, so 'fields_ != NULL' tests a member |
+ // variable hot in the cache, without the need to go touch a vector somewhere |
+ // else in memory. |
std::vector<UnknownField>* fields_; |
- |
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(UnknownFieldSet); |
}; |
@@ -199,19 +212,28 @@ class LIBPROTOBUF_EXPORT UnknownField { |
// If this UnknownField contains a pointer, delete it. |
void Delete(); |
+ // Reset all the underlying pointers to NULL. A special function to be only |
+ // used while merging from a temporary UFS. |
+ void Reset(); |
+ |
// Make a deep copy of any pointers in this UnknownField. |
- void DeepCopy(); |
+ void DeepCopy(const UnknownField& other); |
+ // Set the wire type of this UnknownField. Should only be used when this |
+ // UnknownField is being created. |
+ inline void SetType(Type type); |
- unsigned int number_ : 29; |
- unsigned int type_ : 3; |
+ union LengthDelimited { |
+ string* string_value_; |
+ }; |
+ |
+ uint32 number_; |
+ uint32 type_; |
union { |
uint64 varint_; |
uint32 fixed32_; |
uint64 fixed64_; |
- mutable union { |
- string* string_value_; |
- } length_delimited_; |
+ mutable union LengthDelimited length_delimited_; |
UnknownFieldSet* group_; |
}; |
}; |
@@ -220,13 +242,14 @@ class LIBPROTOBUF_EXPORT UnknownField { |
// inline implementations |
inline void UnknownFieldSet::Clear() { |
- if (fields_ != NULL) { |
+ if (fields_) { |
ClearFallback(); |
} |
} |
inline bool UnknownFieldSet::empty() const { |
- return fields_ == NULL || fields_->empty(); |
+ // Invariant: fields_ is never empty if present. |
+ return !fields_; |
} |
inline void UnknownFieldSet::Swap(UnknownFieldSet* x) { |
@@ -234,9 +257,10 @@ inline void UnknownFieldSet::Swap(UnknownFieldSet* x) { |
} |
inline int UnknownFieldSet::field_count() const { |
- return (fields_ == NULL) ? 0 : fields_->size(); |
+ return fields_ ? static_cast<int>(fields_->size()) : 0; |
} |
inline const UnknownField& UnknownFieldSet::field(int index) const { |
+ GOOGLE_DCHECK(fields_ != NULL); |
return (*fields_)[index]; |
} |
inline UnknownField* UnknownFieldSet::mutable_field(int index) { |
@@ -254,57 +278,62 @@ inline UnknownField::Type UnknownField::type() const { |
return static_cast<Type>(type_); |
} |
-inline uint64 UnknownField::varint () const { |
- assert(type_ == TYPE_VARINT); |
+inline uint64 UnknownField::varint() const { |
+ assert(type() == TYPE_VARINT); |
return varint_; |
} |
inline uint32 UnknownField::fixed32() const { |
- assert(type_ == TYPE_FIXED32); |
+ assert(type() == TYPE_FIXED32); |
return fixed32_; |
} |
inline uint64 UnknownField::fixed64() const { |
- assert(type_ == TYPE_FIXED64); |
+ assert(type() == TYPE_FIXED64); |
return fixed64_; |
} |
inline const string& UnknownField::length_delimited() const { |
- assert(type_ == TYPE_LENGTH_DELIMITED); |
+ assert(type() == TYPE_LENGTH_DELIMITED); |
return *length_delimited_.string_value_; |
} |
inline const UnknownFieldSet& UnknownField::group() const { |
- assert(type_ == TYPE_GROUP); |
+ assert(type() == TYPE_GROUP); |
return *group_; |
} |
inline void UnknownField::set_varint(uint64 value) { |
- assert(type_ == TYPE_VARINT); |
+ assert(type() == TYPE_VARINT); |
varint_ = value; |
} |
inline void UnknownField::set_fixed32(uint32 value) { |
- assert(type_ == TYPE_FIXED32); |
+ assert(type() == TYPE_FIXED32); |
fixed32_ = value; |
} |
inline void UnknownField::set_fixed64(uint64 value) { |
- assert(type_ == TYPE_FIXED64); |
+ assert(type() == TYPE_FIXED64); |
fixed64_ = value; |
} |
inline void UnknownField::set_length_delimited(const string& value) { |
- assert(type_ == TYPE_LENGTH_DELIMITED); |
+ assert(type() == TYPE_LENGTH_DELIMITED); |
length_delimited_.string_value_->assign(value); |
} |
inline string* UnknownField::mutable_length_delimited() { |
- assert(type_ == TYPE_LENGTH_DELIMITED); |
+ assert(type() == TYPE_LENGTH_DELIMITED); |
return length_delimited_.string_value_; |
} |
inline UnknownFieldSet* UnknownField::mutable_group() { |
- assert(type_ == TYPE_GROUP); |
+ assert(type() == TYPE_GROUP); |
return group_; |
} |
inline int UnknownField::GetLengthDelimitedSize() const { |
- GOOGLE_DCHECK_EQ(TYPE_LENGTH_DELIMITED, type_); |
- return length_delimited_.string_value_->size(); |
+ GOOGLE_DCHECK_EQ(TYPE_LENGTH_DELIMITED, type()); |
+ return static_cast<int>(length_delimited_.string_value_->size()); |
+} |
+ |
+inline void UnknownField::SetType(Type type) { |
+ type_ = type; |
} |
+ |
} // namespace protobuf |
} // namespace google |