Index: third_party/protobuf/src/google/protobuf/extension_set.h |
=================================================================== |
--- third_party/protobuf/src/google/protobuf/extension_set.h (revision 216642) |
+++ third_party/protobuf/src/google/protobuf/extension_set.h (working copy) |
@@ -89,8 +89,8 @@ |
// Information about a registered extension. |
struct ExtensionInfo { |
inline ExtensionInfo() {} |
- inline ExtensionInfo(FieldType type, bool is_repeated, bool is_packed) |
- : type(type), is_repeated(is_repeated), is_packed(is_packed), |
+ inline ExtensionInfo(FieldType type_param, bool isrepeated, bool ispacked) |
+ : type(type_param), is_repeated(isrepeated), is_packed(ispacked), |
descriptor(NULL) {} |
FieldType type; |
@@ -214,6 +214,7 @@ |
bool Has(int number) const; |
int ExtensionSize(int number) const; // Size of a repeated extension. |
+ int NumExtensions() const; // The number of extensions |
FieldType ExtensionType(int number) const; |
void ClearExtension(int number); |
@@ -251,10 +252,21 @@ |
const MessageLite& prototype, desc); |
MessageLite* MutableMessage(const FieldDescriptor* decsriptor, |
MessageFactory* factory); |
+ // Adds the given message to the ExtensionSet, taking ownership of the |
+ // message object. Existing message with the same number will be deleted. |
+ // If "message" is NULL, this is equivalent to "ClearExtension(number)". |
+ void SetAllocatedMessage(int number, FieldType type, |
+ const FieldDescriptor* descriptor, |
+ MessageLite* message); |
+ MessageLite* ReleaseMessage(int number, const MessageLite& prototype); |
+ MessageLite* ReleaseMessage(const FieldDescriptor* descriptor, |
+ MessageFactory* factory); |
#undef desc |
// repeated fields ------------------------------------------------- |
+ void* MutableRawRepeatedField(int number); |
+ |
int32 GetRepeatedInt32 (int number, int index) const; |
int64 GetRepeatedInt64 (int number, int index) const; |
uint32 GetRepeatedUInt32(int number, int index) const; |
@@ -296,6 +308,7 @@ |
#undef desc |
void RemoveLast(int number); |
+ MessageLite* ReleaseLast(int number); |
void SwapElements(int number, int index1, int index2); |
// ----------------------------------------------------------------- |
@@ -312,18 +325,18 @@ |
void Swap(ExtensionSet* other); |
bool IsInitialized() const; |
- // Parses a single extension from the input. The input should start out |
- // positioned immediately after the tag. |containing_type| is the default |
- // instance for the containing message; it is used only to look up the |
- // extension by number. See RegisterExtension(), above. Unlike the other |
- // methods of ExtensionSet, this only works for generated message types -- |
- // it looks up extensions registered using RegisterExtension(). |
+ // Parses a single extension from the input. The input should start out |
+ // positioned immediately after the tag. |
bool ParseField(uint32 tag, io::CodedInputStream* input, |
ExtensionFinder* extension_finder, |
FieldSkipper* field_skipper); |
// Specific versions for lite or full messages (constructs the appropriate |
- // FieldSkipper automatically). |
+ // FieldSkipper automatically). |containing_type| is the default |
+ // instance for the containing message; it is used only to look up the |
+ // extension by number. See RegisterExtension(), above. Unlike the other |
+ // methods of ExtensionSet, this only works for generated message types -- |
+ // it looks up extensions registered using RegisterExtension(). |
bool ParseField(uint32 tag, io::CodedInputStream* input, |
const MessageLite* containing_type, |
UnknownFieldSet* unknown_fields); |
@@ -384,18 +397,49 @@ |
private: |
+ // Interface of a lazily parsed singular message extension. |
+ class LIBPROTOBUF_EXPORT LazyMessageExtension { |
+ public: |
+ LazyMessageExtension() {} |
+ virtual ~LazyMessageExtension() {} |
+ |
+ virtual LazyMessageExtension* New() const = 0; |
+ virtual const MessageLite& GetMessage( |
+ const MessageLite& prototype) const = 0; |
+ virtual MessageLite* MutableMessage(const MessageLite& prototype) = 0; |
+ virtual void SetAllocatedMessage(MessageLite *message) = 0; |
+ virtual MessageLite* ReleaseMessage(const MessageLite& prototype) = 0; |
+ |
+ virtual bool IsInitialized() const = 0; |
+ virtual int ByteSize() const = 0; |
+ virtual int SpaceUsed() const = 0; |
+ |
+ virtual void MergeFrom(const LazyMessageExtension& other) = 0; |
+ virtual void Clear() = 0; |
+ |
+ virtual bool ReadMessage(const MessageLite& prototype, |
+ io::CodedInputStream* input) = 0; |
+ virtual void WriteMessage(int number, |
+ io::CodedOutputStream* output) const = 0; |
+ virtual uint8* WriteMessageToArray(int number, uint8* target) const = 0; |
+ private: |
+ GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(LazyMessageExtension); |
+ }; |
struct Extension { |
+ // The order of these fields packs Extension into 24 bytes when using 8 |
+ // byte alignment. Consider this when adding or removing fields here. |
union { |
- int32 int32_value; |
- int64 int64_value; |
- uint32 uint32_value; |
- uint64 uint64_value; |
- float float_value; |
- double double_value; |
- bool bool_value; |
- int enum_value; |
- string* string_value; |
- MessageLite* message_value; |
+ int32 int32_value; |
+ int64 int64_value; |
+ uint32 uint32_value; |
+ uint64 uint64_value; |
+ float float_value; |
+ double double_value; |
+ bool bool_value; |
+ int enum_value; |
+ string* string_value; |
+ MessageLite* message_value; |
+ LazyMessageExtension* lazymessage_value; |
RepeatedField <int32 >* repeated_int32_value; |
RepeatedField <int64 >* repeated_int64_value; |
@@ -418,21 +462,28 @@ |
// removing it from the map, we just set is_cleared = true. This has no |
// meaning for repeated types; for those, the size of the RepeatedField |
// simply becomes zero when cleared. |
- bool is_cleared; |
+ bool is_cleared : 4; |
+ // For singular message types, indicates whether lazy parsing is enabled |
+ // for this extension. This field is only valid when type == TYPE_MESSAGE |
+ // and !is_repeated because we only support lazy parsing for singular |
+ // message types currently. If is_lazy = true, the extension is stored in |
+ // lazymessage_value. Otherwise, the extension will be message_value. |
+ bool is_lazy : 4; |
+ |
// For repeated types, this indicates if the [packed=true] option is set. |
bool is_packed; |
+ // For packed fields, the size of the packed data is recorded here when |
+ // ByteSize() is called then used during serialization. |
+ // TODO(kenton): Use atomic<int> when C++ supports it. |
+ mutable int cached_size; |
+ |
// The descriptor for this extension, if one exists and is known. May be |
// NULL. Must not be NULL if the descriptor for the extension does not |
// live in the same pool as the descriptor for the containing type. |
const FieldDescriptor* descriptor; |
- // For packed fields, the size of the packed data is recorded here when |
- // ByteSize() is called then used during serialization. |
- // TODO(kenton): Use atomic<int> when C++ supports it. |
- mutable int cached_size; |
- |
// Some helper methods for operations on a single Extension. |
void SerializeFieldWithCachedSizes( |
int number, |
@@ -455,6 +506,25 @@ |
}; |
+ // Returns true and fills field_number and extension if extension is found. |
+ bool FindExtensionInfoFromTag(uint32 tag, ExtensionFinder* extension_finder, |
+ int* field_number, ExtensionInfo* extension); |
+ |
+ // Parses a single extension from the input. The input should start out |
+ // positioned immediately after the wire tag. This method is called in |
+ // ParseField() after field number is extracted from the wire tag and |
+ // ExtensionInfo is found by the field number. |
+ bool ParseFieldWithExtensionInfo(int field_number, |
+ const ExtensionInfo& extension, |
+ io::CodedInputStream* input, |
+ FieldSkipper* field_skipper); |
+ |
+ // Like ParseField(), but this method may parse singular message extensions |
+ // lazily depending on the value of FLAGS_eagerly_parse_message_sets. |
+ bool ParseFieldMaybeLazily(uint32 tag, io::CodedInputStream* input, |
+ ExtensionFinder* extension_finder, |
+ FieldSkipper* field_skipper); |
+ |
// Gets the extension with the given number, creating it if it does not |
// already exist. Returns true if the extension did not already exist. |
bool MaybeNewExtension(int number, const FieldDescriptor* descriptor, |
@@ -722,6 +792,15 @@ |
return static_cast<Type*>( |
set->MutableMessage(number, field_type, Type::default_instance(), NULL)); |
} |
+ static inline void SetAllocated(int number, FieldType field_type, |
+ MutableType message, ExtensionSet* set) { |
+ set->SetAllocatedMessage(number, field_type, NULL, message); |
+ } |
+ static inline MutableType Release(int number, FieldType field_type, |
+ ExtensionSet* set) { |
+ return static_cast<Type*>(set->ReleaseMessage( |
+ number, Type::default_instance())); |
+ } |
}; |
template <typename Type> |
@@ -789,113 +868,137 @@ |
// causes problems if the class has a nested message or enum type with that |
// name and "_TypeTraits" is technically reserved for the C++ library since |
// it starts with an underscore followed by a capital letter. |
+// |
+// For similar reason, we use "_field_type" and "_is_packed" as parameter names |
+// below, so that "field_type" and "is_packed" can be used as field names. |
#define GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(CLASSNAME) \ |
/* Has, Size, Clear */ \ |
template <typename _proto_TypeTraits, \ |
- ::google::protobuf::internal::FieldType field_type, \ |
- bool is_packed> \ |
+ ::google::protobuf::internal::FieldType _field_type, \ |
+ bool _is_packed> \ |
inline bool HasExtension( \ |
const ::google::protobuf::internal::ExtensionIdentifier< \ |
- CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) const { \ |
+ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) const { \ |
return _extensions_.Has(id.number()); \ |
} \ |
\ |
template <typename _proto_TypeTraits, \ |
- ::google::protobuf::internal::FieldType field_type, \ |
- bool is_packed> \ |
+ ::google::protobuf::internal::FieldType _field_type, \ |
+ bool _is_packed> \ |
inline void ClearExtension( \ |
const ::google::protobuf::internal::ExtensionIdentifier< \ |
- CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) { \ |
+ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) { \ |
_extensions_.ClearExtension(id.number()); \ |
} \ |
\ |
template <typename _proto_TypeTraits, \ |
- ::google::protobuf::internal::FieldType field_type, \ |
- bool is_packed> \ |
+ ::google::protobuf::internal::FieldType _field_type, \ |
+ bool _is_packed> \ |
inline int ExtensionSize( \ |
const ::google::protobuf::internal::ExtensionIdentifier< \ |
- CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) const { \ |
+ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) const { \ |
return _extensions_.ExtensionSize(id.number()); \ |
} \ |
\ |
/* Singular accessors */ \ |
template <typename _proto_TypeTraits, \ |
- ::google::protobuf::internal::FieldType field_type, \ |
- bool is_packed> \ |
+ ::google::protobuf::internal::FieldType _field_type, \ |
+ bool _is_packed> \ |
inline typename _proto_TypeTraits::ConstType GetExtension( \ |
const ::google::protobuf::internal::ExtensionIdentifier< \ |
- CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) const { \ |
+ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) const { \ |
return _proto_TypeTraits::Get(id.number(), _extensions_, \ |
id.default_value()); \ |
} \ |
\ |
template <typename _proto_TypeTraits, \ |
- ::google::protobuf::internal::FieldType field_type, \ |
- bool is_packed> \ |
+ ::google::protobuf::internal::FieldType _field_type, \ |
+ bool _is_packed> \ |
inline typename _proto_TypeTraits::MutableType MutableExtension( \ |
const ::google::protobuf::internal::ExtensionIdentifier< \ |
- CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) { \ |
- return _proto_TypeTraits::Mutable(id.number(), field_type, &_extensions_);\ |
+ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) { \ |
+ return _proto_TypeTraits::Mutable(id.number(), _field_type, \ |
+ &_extensions_); \ |
} \ |
\ |
template <typename _proto_TypeTraits, \ |
- ::google::protobuf::internal::FieldType field_type, \ |
- bool is_packed> \ |
+ ::google::protobuf::internal::FieldType _field_type, \ |
+ bool _is_packed> \ |
inline void SetExtension( \ |
const ::google::protobuf::internal::ExtensionIdentifier< \ |
- CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id, \ |
+ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ |
typename _proto_TypeTraits::ConstType value) { \ |
- _proto_TypeTraits::Set(id.number(), field_type, value, &_extensions_); \ |
+ _proto_TypeTraits::Set(id.number(), _field_type, value, &_extensions_); \ |
} \ |
\ |
+ template <typename _proto_TypeTraits, \ |
+ ::google::protobuf::internal::FieldType _field_type, \ |
+ bool _is_packed> \ |
+ inline void SetAllocatedExtension( \ |
+ const ::google::protobuf::internal::ExtensionIdentifier< \ |
+ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ |
+ typename _proto_TypeTraits::MutableType value) { \ |
+ _proto_TypeTraits::SetAllocated(id.number(), _field_type, \ |
+ value, &_extensions_); \ |
+ } \ |
+ template <typename _proto_TypeTraits, \ |
+ ::google::protobuf::internal::FieldType _field_type, \ |
+ bool _is_packed> \ |
+ inline typename _proto_TypeTraits::MutableType ReleaseExtension( \ |
+ const ::google::protobuf::internal::ExtensionIdentifier< \ |
+ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) { \ |
+ return _proto_TypeTraits::Release(id.number(), _field_type, \ |
+ &_extensions_); \ |
+ } \ |
+ \ |
/* Repeated accessors */ \ |
template <typename _proto_TypeTraits, \ |
- ::google::protobuf::internal::FieldType field_type, \ |
- bool is_packed> \ |
+ ::google::protobuf::internal::FieldType _field_type, \ |
+ bool _is_packed> \ |
inline typename _proto_TypeTraits::ConstType GetExtension( \ |
const ::google::protobuf::internal::ExtensionIdentifier< \ |
- CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id, \ |
+ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ |
int index) const { \ |
return _proto_TypeTraits::Get(id.number(), _extensions_, index); \ |
} \ |
\ |
template <typename _proto_TypeTraits, \ |
- ::google::protobuf::internal::FieldType field_type, \ |
- bool is_packed> \ |
+ ::google::protobuf::internal::FieldType _field_type, \ |
+ bool _is_packed> \ |
inline typename _proto_TypeTraits::MutableType MutableExtension( \ |
const ::google::protobuf::internal::ExtensionIdentifier< \ |
- CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id, \ |
+ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ |
int index) { \ |
return _proto_TypeTraits::Mutable(id.number(), index, &_extensions_); \ |
} \ |
\ |
template <typename _proto_TypeTraits, \ |
- ::google::protobuf::internal::FieldType field_type, \ |
- bool is_packed> \ |
+ ::google::protobuf::internal::FieldType _field_type, \ |
+ bool _is_packed> \ |
inline void SetExtension( \ |
const ::google::protobuf::internal::ExtensionIdentifier< \ |
- CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id, \ |
+ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ |
int index, typename _proto_TypeTraits::ConstType value) { \ |
_proto_TypeTraits::Set(id.number(), index, value, &_extensions_); \ |
} \ |
\ |
template <typename _proto_TypeTraits, \ |
- ::google::protobuf::internal::FieldType field_type, \ |
- bool is_packed> \ |
+ ::google::protobuf::internal::FieldType _field_type, \ |
+ bool _is_packed> \ |
inline typename _proto_TypeTraits::MutableType AddExtension( \ |
const ::google::protobuf::internal::ExtensionIdentifier< \ |
- CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) { \ |
- return _proto_TypeTraits::Add(id.number(), field_type, &_extensions_); \ |
+ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id) { \ |
+ return _proto_TypeTraits::Add(id.number(), _field_type, &_extensions_); \ |
} \ |
\ |
template <typename _proto_TypeTraits, \ |
- ::google::protobuf::internal::FieldType field_type, \ |
- bool is_packed> \ |
+ ::google::protobuf::internal::FieldType _field_type, \ |
+ bool _is_packed> \ |
inline void AddExtension( \ |
const ::google::protobuf::internal::ExtensionIdentifier< \ |
- CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id, \ |
+ CLASSNAME, _proto_TypeTraits, _field_type, _is_packed>& id, \ |
typename _proto_TypeTraits::ConstType value) { \ |
- _proto_TypeTraits::Add(id.number(), field_type, is_packed, \ |
+ _proto_TypeTraits::Add(id.number(), _field_type, _is_packed, \ |
value, &_extensions_); \ |
} |