Index: third_party/protobuf/src/google/protobuf/message.h |
diff --git a/third_party/protobuf/src/google/protobuf/message.h b/third_party/protobuf/src/google/protobuf/message.h |
index 0f90bc1a15bd6d0001129796dd09de4f30641d2f..7c27afd9996d1c67c1f9abd9b97e54bc93c3a698 100644 |
--- a/third_party/protobuf/src/google/protobuf/message.h |
+++ b/third_party/protobuf/src/google/protobuf/message.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 |
@@ -98,11 +98,11 @@ |
// |
// // Use the reflection interface to examine the contents. |
// const Reflection* reflection = foo->GetReflection(); |
-// assert(reflection->GetString(foo, text_field) == "Hello World!"); |
-// assert(reflection->FieldSize(foo, numbers_field) == 3); |
-// assert(reflection->GetRepeatedInt32(foo, numbers_field, 0) == 1); |
-// assert(reflection->GetRepeatedInt32(foo, numbers_field, 1) == 5); |
-// assert(reflection->GetRepeatedInt32(foo, numbers_field, 2) == 42); |
+// assert(reflection->GetString(*foo, text_field) == "Hello World!"); |
+// assert(reflection->FieldSize(*foo, numbers_field) == 3); |
+// assert(reflection->GetRepeatedInt32(*foo, numbers_field, 0) == 1); |
+// assert(reflection->GetRepeatedInt32(*foo, numbers_field, 1) == 5); |
+// assert(reflection->GetRepeatedInt32(*foo, numbers_field, 2) == 42); |
// |
// delete foo; |
// } |
@@ -110,22 +110,21 @@ |
#ifndef GOOGLE_PROTOBUF_MESSAGE_H__ |
#define GOOGLE_PROTOBUF_MESSAGE_H__ |
-#include <vector> |
-#include <string> |
- |
-#ifdef __DECCXX |
-// HP C++'s iosfwd doesn't work. |
-#include <iostream> |
-#else |
#include <iosfwd> |
-#endif |
+#include <string> |
+#include <google/protobuf/stubs/type_traits.h> |
+#include <vector> |
+#include <google/protobuf/arena.h> |
#include <google/protobuf/message_lite.h> |
#include <google/protobuf/stubs/common.h> |
#include <google/protobuf/descriptor.h> |
+#define GOOGLE_PROTOBUF_HAS_ONEOF |
+#define GOOGLE_PROTOBUF_HAS_ARENAS |
+ |
namespace google { |
namespace protobuf { |
@@ -135,12 +134,23 @@ class Reflection; |
class MessageFactory; |
// Defined in other files. |
+class MapKey; |
+class MapValueRef; |
+class MapIterator; |
+class MapReflectionTester; |
+ |
+namespace internal { |
+class MapFieldBase; |
+} |
class UnknownFieldSet; // unknown_field_set.h |
namespace io { |
- class ZeroCopyInputStream; // zero_copy_stream.h |
- class ZeroCopyOutputStream; // zero_copy_stream.h |
- class CodedInputStream; // coded_stream.h |
- class CodedOutputStream; // coded_stream.h |
+class ZeroCopyInputStream; // zero_copy_stream.h |
+class ZeroCopyOutputStream; // zero_copy_stream.h |
+class CodedInputStream; // coded_stream.h |
+class CodedOutputStream; // coded_stream.h |
+} |
+namespace python { |
+class MapReflectionFriend; // scalar_map_container.h |
} |
@@ -178,15 +188,27 @@ class LIBPROTOBUF_EXPORT Message : public MessageLite { |
// for return-type covariance.) |
virtual Message* New() const = 0; |
+ // Construct a new instance on the arena. Ownership is passed to the caller |
+ // if arena is a NULL. Default implementation allows for API compatibility |
+ // during the Arena transition. |
+ virtual Message* New(::google::protobuf::Arena* arena) const { |
+ Message* message = New(); |
+ if (arena != NULL) { |
+ arena->Own(message); |
+ } |
+ return message; |
+ } |
+ |
// Make this message into a copy of the given message. The given message |
// must have the same descriptor, but need not necessarily be the same class. |
// By default this is just implemented as "Clear(); MergeFrom(from);". |
virtual void CopyFrom(const Message& from); |
// Merge the fields from the given message into this message. Singular |
- // fields will be overwritten, except for embedded messages which will |
- // be merged. Repeated fields will be concatenated. The given message |
- // must be of the same type as this message (i.e. the exact same class). |
+ // fields will be overwritten, if specified in from, except for embedded |
+ // messages which will be merged. Repeated fields will be concatenated. |
+ // The given message must be of the same type as this message (i.e. the |
+ // exact same class). |
virtual void MergeFrom(const Message& from); |
// Verifies that IsInitialized() returns true. GOOGLE_CHECK-fails otherwise, with |
@@ -197,7 +219,7 @@ class LIBPROTOBUF_EXPORT Message : public MessageLite { |
// This is much, much slower than IsInitialized() as it is implemented |
// purely via reflection. Generally, you should not call this unless you |
// have already determined that an error exists by calling IsInitialized(). |
- void FindInitializationErrors(vector<string>* errors) const; |
+ void FindInitializationErrors(std::vector<string>* errors) const; |
// Like FindInitializationErrors, but joins all the strings, delimited by |
// commas, and returns them. |
@@ -218,6 +240,11 @@ class LIBPROTOBUF_EXPORT Message : public MessageLite { |
// Computes (an estimate of) the total number of bytes currently used for |
// storing the message in memory. The default implementation calls the |
// Reflection object's SpaceUsed() method. |
+ // |
+ // SpaceUsed() is noticeably slower than ByteSize(), as it is implemented |
+ // using reflection (rather than the generated code implementation for |
+ // ByteSize()). Like ByteSize(), its CPU time is linear in the number of |
+ // fields defined for the proto. |
virtual int SpaceUsed() const; |
// Debugging & Testing---------------------------------------------- |
@@ -316,6 +343,20 @@ class LIBPROTOBUF_EXPORT Message : public MessageLite { |
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Message); |
}; |
+namespace internal { |
+// Forward-declare interfaces used to implement RepeatedFieldRef. |
+// These are protobuf internals that users shouldn't care about. |
+class RepeatedFieldAccessor; |
+} // namespace internal |
+ |
+// Forward-declare RepeatedFieldRef templates. The second type parameter is |
+// used for SFINAE tricks. Users should ignore it. |
+template<typename T, typename Enable = void> |
+class RepeatedFieldRef; |
+ |
+template<typename T, typename Enable = void> |
+class MutableRepeatedFieldRef; |
+ |
// This interface contains methods that can be used to dynamically access |
// and modify the fields of a protocol message. Their semantics are |
// similar to the accessors the protocol compiler generates. |
@@ -364,12 +405,15 @@ class LIBPROTOBUF_EXPORT Reflection { |
// Get the UnknownFieldSet for the message. This contains fields which |
// were seen when the Message was parsed but were not recognized according |
- // to the Message's definition. |
+ // to the Message's definition. For proto3 protos, this method will always |
+ // return an empty UnknownFieldSet. |
virtual const UnknownFieldSet& GetUnknownFields( |
const Message& message) const = 0; |
// Get a mutable pointer to the UnknownFieldSet for the message. This |
// contains fields which were seen when the Message was parsed but were not |
- // recognized according to the Message's definition. |
+ // recognized according to the Message's definition. For proto3 protos, this |
+ // method will return a valid mutable UnknownFieldSet pointer but modifying |
+ // it won't affect the serialized bytes of the message. |
virtual UnknownFieldSet* MutableUnknownFields(Message* message) const = 0; |
// Estimate the amount of memory used by the message object. |
@@ -388,6 +432,26 @@ class LIBPROTOBUF_EXPORT Reflection { |
virtual void ClearField(Message* message, |
const FieldDescriptor* field) const = 0; |
+ // Check if the oneof is set. Returns true if any field in oneof |
+ // is set, false otherwise. |
+ // TODO(jieluo) - make it pure virtual after updating all |
+ // the subclasses. |
+ virtual bool HasOneof(const Message& /*message*/, |
+ const OneofDescriptor* /*oneof_descriptor*/) const { |
+ return false; |
+ } |
+ |
+ virtual void ClearOneof(Message* /*message*/, |
+ const OneofDescriptor* /*oneof_descriptor*/) const {} |
+ |
+ // Returns the field descriptor if the oneof is set. NULL otherwise. |
+ // TODO(jieluo) - make it pure virtual. |
+ virtual const FieldDescriptor* GetOneofFieldDescriptor( |
+ const Message& /*message*/, |
+ const OneofDescriptor* /*oneof_descriptor*/) const { |
+ return NULL; |
+ } |
+ |
// Removes the last element of a repeated field. |
// We don't provide a way to remove any element other than the last |
// because it invites inefficient use, such as O(n^2) filtering loops |
@@ -405,19 +469,26 @@ class LIBPROTOBUF_EXPORT Reflection { |
// Swap the complete contents of two messages. |
virtual void Swap(Message* message1, Message* message2) const = 0; |
+ // Swap fields listed in fields vector of two messages. |
+ virtual void SwapFields(Message* message1, |
+ Message* message2, |
+ const std::vector<const FieldDescriptor*>& fields) |
+ const = 0; |
+ |
// Swap two elements of a repeated field. |
virtual void SwapElements(Message* message, |
- const FieldDescriptor* field, |
- int index1, |
- int index2) const = 0; |
+ const FieldDescriptor* field, |
+ int index1, |
+ int index2) const = 0; |
// List all fields of the message which are currently set. This includes |
// extensions. Singular fields will only be listed if HasField(field) would |
// return true and repeated fields will only be listed if FieldSize(field) |
// would return non-zero. Fields (both normal fields and extension fields) |
// will be listed ordered by field number. |
- virtual void ListFields(const Message& message, |
- vector<const FieldDescriptor*>* output) const = 0; |
+ virtual void ListFields( |
+ const Message& message, |
+ std::vector<const FieldDescriptor*>* output) const = 0; |
// Singular field getters ------------------------------------------ |
// These get the value of a non-repeated field. They return the default |
@@ -441,6 +512,15 @@ class LIBPROTOBUF_EXPORT Reflection { |
const FieldDescriptor* field) const = 0; |
virtual const EnumValueDescriptor* GetEnum( |
const Message& message, const FieldDescriptor* field) const = 0; |
+ |
+ // GetEnumValue() returns an enum field's value as an integer rather than |
+ // an EnumValueDescriptor*. If the integer value does not correspond to a |
+ // known value descriptor, a new value descriptor is created. (Such a value |
+ // will only be present when the new unknown-enum-value semantics are enabled |
+ // for a message.) |
+ virtual int GetEnumValue( |
+ const Message& message, const FieldDescriptor* field) const; |
+ |
// See MutableMessage() for the meaning of the "factory" parameter. |
virtual const Message& GetMessage(const Message& message, |
const FieldDescriptor* field, |
@@ -460,7 +540,7 @@ class LIBPROTOBUF_EXPORT Reflection { |
// regardless of the field's underlying representation. When initializing |
// a newly-constructed string, though, it's just as fast and more readable |
// to use code like: |
- // string str = reflection->GetString(field); |
+ // string str = reflection->GetString(message, field); |
virtual const string& GetStringReference(const Message& message, |
const FieldDescriptor* field, |
string* scratch) const = 0; |
@@ -489,6 +569,14 @@ class LIBPROTOBUF_EXPORT Reflection { |
virtual void SetEnum (Message* message, |
const FieldDescriptor* field, |
const EnumValueDescriptor* value) const = 0; |
+ // Set an enum field's value with an integer rather than EnumValueDescriptor. |
+ // If the value does not correspond to a known enum value, either behavior is |
+ // undefined (for proto2 messages), or the value is accepted silently for |
+ // messages with new unknown-enum-value semantics. |
+ virtual void SetEnumValue(Message* message, |
+ const FieldDescriptor* field, |
+ int value) const; |
+ |
// Get a mutable pointer to a field with a message type. If a MessageFactory |
// is provided, it will be used to construct instances of the sub-message; |
// otherwise, the default factory is used. If the field is an extension that |
@@ -502,6 +590,13 @@ class LIBPROTOBUF_EXPORT Reflection { |
virtual Message* MutableMessage(Message* message, |
const FieldDescriptor* field, |
MessageFactory* factory = NULL) const = 0; |
+ // Replaces the message specified by 'field' with the already-allocated object |
+ // sub_message, passing ownership to the message. If the field contained a |
+ // message, that message is deleted. If sub_message is NULL, the field is |
+ // cleared. |
+ virtual void SetAllocatedMessage(Message* message, |
+ Message* sub_message, |
+ const FieldDescriptor* field) const = 0; |
// Releases the message specified by 'field' and returns the pointer, |
// ReleaseMessage() will return the message the message object if it exists. |
// Otherwise, it may or may not return NULL. In any case, if the return value |
@@ -544,6 +639,14 @@ class LIBPROTOBUF_EXPORT Reflection { |
virtual const EnumValueDescriptor* GetRepeatedEnum( |
const Message& message, |
const FieldDescriptor* field, int index) const = 0; |
+ // GetRepeatedEnumValue() returns an enum field's value as an integer rather |
+ // than an EnumValueDescriptor*. If the integer value does not correspond to a |
+ // known value descriptor, a new value descriptor is created. (Such a value |
+ // will only be present when the new unknown-enum-value semantics are enabled |
+ // for a message.) |
+ virtual int GetRepeatedEnumValue( |
+ const Message& message, |
+ const FieldDescriptor* field, int index) const; |
virtual const Message& GetRepeatedMessage( |
const Message& message, |
const FieldDescriptor* field, int index) const = 0; |
@@ -584,6 +687,13 @@ class LIBPROTOBUF_EXPORT Reflection { |
virtual void SetRepeatedEnum(Message* message, |
const FieldDescriptor* field, int index, |
const EnumValueDescriptor* value) const = 0; |
+ // Set an enum field's value with an integer rather than EnumValueDescriptor. |
+ // If the value does not correspond to a known enum value, either behavior is |
+ // undefined (for proto2 messages), or the value is accepted silently for |
+ // messages with new unknown-enum-value semantics. |
+ virtual void SetRepeatedEnumValue(Message* message, |
+ const FieldDescriptor* field, int index, |
+ int value) const; |
// Get a mutable pointer to an element of a repeated field with a message |
// type. |
virtual Message* MutableRepeatedMessage( |
@@ -613,12 +723,65 @@ class LIBPROTOBUF_EXPORT Reflection { |
virtual void AddEnum (Message* message, |
const FieldDescriptor* field, |
const EnumValueDescriptor* value) const = 0; |
+ // Set an enum field's value with an integer rather than EnumValueDescriptor. |
+ // If the value does not correspond to a known enum value, either behavior is |
+ // undefined (for proto2 messages), or the value is accepted silently for |
+ // messages with new unknown-enum-value semantics. |
+ virtual void AddEnumValue(Message* message, |
+ const FieldDescriptor* field, |
+ int value) const; |
// See MutableMessage() for comments on the "factory" parameter. |
virtual Message* AddMessage(Message* message, |
const FieldDescriptor* field, |
MessageFactory* factory = NULL) const = 0; |
+ // Appends an already-allocated object 'new_entry' to the repeated field |
+ // specifyed by 'field' passing ownership to the message. |
+ // TODO(tmarek): Make virtual after all subclasses have been |
+ // updated. |
+ virtual void AddAllocatedMessage(Message* message, |
+ const FieldDescriptor* field, |
+ Message* new_entry) const {} |
+ |
+ // Get a RepeatedFieldRef object that can be used to read the underlying |
+ // repeated field. The type parameter T must be set according to the |
+ // field's cpp type. The following table shows the mapping from cpp type |
+ // to acceptable T. |
+ // |
+ // field->cpp_type() T |
+ // CPPTYPE_INT32 int32 |
+ // CPPTYPE_UINT32 uint32 |
+ // CPPTYPE_INT64 int64 |
+ // CPPTYPE_UINT64 uint64 |
+ // CPPTYPE_DOUBLE double |
+ // CPPTYPE_FLOAT float |
+ // CPPTYPE_BOOL bool |
+ // CPPTYPE_ENUM generated enum type or int32 |
+ // CPPTYPE_STRING string |
+ // CPPTYPE_MESSAGE generated message type or google::protobuf::Message |
+ // |
+ // A RepeatedFieldRef object can be copied and the resulted object will point |
+ // to the same repeated field in the same message. The object can be used as |
+ // long as the message is not destroyed. |
+ // |
+ // Note that to use this method users need to include the header file |
+ // "google/protobuf/reflection.h" (which defines the RepeatedFieldRef |
+ // class templates). |
+ template<typename T> |
+ RepeatedFieldRef<T> GetRepeatedFieldRef( |
+ const Message& message, const FieldDescriptor* field) const; |
+ |
+ // Like GetRepeatedFieldRef() but return an object that can also be used |
+ // manipulate the underlying repeated field. |
+ template<typename T> |
+ MutableRepeatedFieldRef<T> GetMutableRepeatedFieldRef( |
+ Message* message, const FieldDescriptor* field) const; |
+ |
+ // DEPRECATED. Please use Get(Mutable)RepeatedFieldRef() for repeated field |
+ // access. The following repeated field accesors will be removed in the |
+ // future. |
+ // |
// Repeated field accessors ------------------------------------------------- |
// The methods above, e.g. GetRepeatedInt32(msg, fd, index), provide singular |
// access to the data in a RepeatedField. The methods below provide aggregate |
@@ -629,22 +792,30 @@ class LIBPROTOBUF_EXPORT Reflection { |
// |
// Usage example: my_doubs = refl->GetRepeatedField<double>(msg, fd); |
+ // DEPRECATED. Please use GetRepeatedFieldRef(). |
+ // |
// for T = Cord and all protobuf scalar types except enums. |
template<typename T> |
const RepeatedField<T>& GetRepeatedField( |
const Message&, const FieldDescriptor*) const; |
+ // DEPRECATED. Please use GetMutableRepeatedFieldRef(). |
+ // |
// for T = Cord and all protobuf scalar types except enums. |
template<typename T> |
RepeatedField<T>* MutableRepeatedField( |
Message*, const FieldDescriptor*) const; |
+ // DEPRECATED. Please use GetRepeatedFieldRef(). |
+ // |
// for T = string, google::protobuf::internal::StringPieceField |
// google::protobuf::Message & descendants. |
template<typename T> |
const RepeatedPtrField<T>& GetRepeatedPtrField( |
const Message&, const FieldDescriptor*) const; |
+ // DEPRECATED. Please use GetMutableRepeatedFieldRef(). |
+ // |
// for T = string, google::protobuf::internal::StringPieceField |
// google::protobuf::Message & descendants. |
template<typename T> |
@@ -663,6 +834,52 @@ class LIBPROTOBUF_EXPORT Reflection { |
virtual const FieldDescriptor* FindKnownExtensionByNumber( |
int number) const = 0; |
+ // Feature Flags ------------------------------------------------------------- |
+ |
+ // Does this message support storing arbitrary integer values in enum fields? |
+ // If |true|, GetEnumValue/SetEnumValue and associated repeated-field versions |
+ // take arbitrary integer values, and the legacy GetEnum() getter will |
+ // dynamically create an EnumValueDescriptor for any integer value without |
+ // one. If |false|, setting an unknown enum value via the integer-based |
+ // setters results in undefined behavior (in practice, GOOGLE_DCHECK-fails). |
+ // |
+ // Generic code that uses reflection to handle messages with enum fields |
+ // should check this flag before using the integer-based setter, and either |
+ // downgrade to a compatible value or use the UnknownFieldSet if not. For |
+ // example: |
+ // |
+ // int new_value = GetValueFromApplicationLogic(); |
+ // if (reflection->SupportsUnknownEnumValues()) { |
+ // reflection->SetEnumValue(message, field, new_value); |
+ // } else { |
+ // if (field_descriptor->enum_type()-> |
+ // FindValueByNumver(new_value) != NULL) { |
+ // reflection->SetEnumValue(message, field, new_value); |
+ // } else if (emit_unknown_enum_values) { |
+ // reflection->MutableUnknownFields(message)->AddVarint( |
+ // field->number(), |
+ // new_value); |
+ // } else { |
+ // // convert value to a compatible/default value. |
+ // new_value = CompatibleDowngrade(new_value); |
+ // reflection->SetEnumValue(message, field, new_value); |
+ // } |
+ // } |
+ virtual bool SupportsUnknownEnumValues() const { return false; } |
+ |
+ // Returns the MessageFactory associated with this message. This can be |
+ // useful for determining if a message is a generated message or not, for |
+ // example: |
+ // |
+ // if (message->GetReflection()->GetMessageFactory() == |
+ // google::protobuf::MessageFactory::generated_factory()) { |
+ // // This is a generated message. |
+ // } |
+ // |
+ // It can also be used to create more messages of this type, though |
+ // Message::New() is an easier way to accomplish this. |
+ virtual MessageFactory* GetMessageFactory() const; |
+ |
// --------------------------------------------------------------------------- |
protected: |
@@ -670,19 +887,118 @@ class LIBPROTOBUF_EXPORT Reflection { |
// on field->cpp_type(), |
// on field->field_option().ctype() (if ctype >= 0) |
// of field->message_type() (if message_type != NULL). |
- // We use 1 routine rather than 4 (const vs mutable) x (scalar vs pointer). |
+ // We use 2 routine rather than 4 (const vs mutable) x (scalar vs pointer). |
virtual void* MutableRawRepeatedField( |
Message* message, const FieldDescriptor* field, FieldDescriptor::CppType, |
int ctype, const Descriptor* message_type) const = 0; |
+ // TODO(jieluo) - make it pure virtual after updating all the subclasses. |
+ virtual const void* GetRawRepeatedField( |
+ const Message& message, const FieldDescriptor* field, |
+ FieldDescriptor::CppType cpptype, int ctype, |
+ const Descriptor* message_type) const { |
+ return MutableRawRepeatedField( |
+ const_cast<Message*>(&message), field, cpptype, ctype, message_type); |
+ } |
+ |
+ // The following methods are used to implement (Mutable)RepeatedFieldRef. |
+ // A Ref object will store a raw pointer to the repeated field data (obtained |
+ // from RepeatedFieldData()) and a pointer to a Accessor (obtained from |
+ // RepeatedFieldAccessor) which will be used to access the raw data. |
+ // |
+ // TODO(xiaofeng): Make these methods pure-virtual. |
+ |
+ // Returns a raw pointer to the repeated field |
+ // |
+ // "cpp_type" and "message_type" are decuded from the type parameter T passed |
+ // to Get(Mutable)RepeatedFieldRef. If T is a generated message type, |
+ // "message_type" should be set to its descriptor. Otherwise "message_type" |
+ // should be set to NULL. Implementations of this method should check whether |
+ // "cpp_type"/"message_type" is consistent with the actual type of the field. |
+ // We use 1 routine rather than 2 (const vs mutable) because it is protected |
+ // and it doesn't change the message. |
+ virtual void* RepeatedFieldData( |
+ Message* message, const FieldDescriptor* field, |
+ FieldDescriptor::CppType cpp_type, |
+ const Descriptor* message_type) const; |
+ |
+ // The returned pointer should point to a singleton instance which implements |
+ // the RepeatedFieldAccessor interface. |
+ virtual const internal::RepeatedFieldAccessor* RepeatedFieldAccessor( |
+ const FieldDescriptor* field) const; |
+ |
private: |
+ template<typename T, typename Enable> |
+ friend class RepeatedFieldRef; |
+ template<typename T, typename Enable> |
+ friend class MutableRepeatedFieldRef; |
+ friend class ::google::protobuf::python::MapReflectionFriend; |
+ |
// Special version for specialized implementations of string. We can't call |
// MutableRawRepeatedField directly here because we don't have access to |
// FieldOptions::* which are defined in descriptor.pb.h. Including that |
// file here is not possible because it would cause a circular include cycle. |
+ // We use 1 routine rather than 2 (const vs mutable) because it is private |
+ // and mutable a repeated string field doesn't change the message. |
void* MutableRawRepeatedString( |
Message* message, const FieldDescriptor* field, bool is_string) const; |
+ friend class MapReflectionTester; |
+ // TODO(jieluo) - make the map APIs pure virtual after updating |
+ // all the subclasses. |
+ // Returns true if key is in map. Returns false if key is not in map field. |
+ virtual bool ContainsMapKey(const Message& message, |
+ const FieldDescriptor* field, |
+ const MapKey& key) const { |
+ return false; |
+ } |
+ |
+ // If key is in map field: Saves the value pointer to val and returns |
+ // false. If key in not in map field: Insert the key into map, saves |
+ // value pointer to val and retuns true. |
+ virtual bool InsertOrLookupMapValue(Message* message, |
+ const FieldDescriptor* field, |
+ const MapKey& key, |
+ MapValueRef* val) const { |
+ return false; |
+ } |
+ |
+ // Delete and returns true if key is in the map field. Returns false |
+ // otherwise. |
+ virtual bool DeleteMapValue(Message* message, |
+ const FieldDescriptor* field, |
+ const MapKey& key) const { |
+ return false; |
+ } |
+ |
+ // Returns a MapIterator referring to the first element in the map field. |
+ // If the map field is empty, this function returns the same as |
+ // reflection::MapEnd. Mutation to the field may invalidate the iterator. |
+ virtual MapIterator MapBegin( |
+ Message* message, |
+ const FieldDescriptor* field) const; |
+ |
+ // Returns a MapIterator referring to the theoretical element that would |
+ // follow the last element in the map field. It does not point to any |
+ // real element. Mutation to the field may invalidate the iterator. |
+ virtual MapIterator MapEnd( |
+ Message* message, |
+ const FieldDescriptor* field) const; |
+ |
+ // Get the number of <key, value> pair of a map field. The result may be |
+ // different from FieldSize which can have duplicate keys. |
+ virtual int MapSize(const Message& message, |
+ const FieldDescriptor* field) const { |
+ return 0; |
+ } |
+ |
+ // Help method for MapIterator. |
+ friend class MapIterator; |
+ virtual internal::MapFieldBase* MapData( |
+ Message* message, const FieldDescriptor* field) const { |
+ return NULL; |
+ } |
+ |
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Reflection); |
}; |
@@ -699,7 +1015,7 @@ class LIBPROTOBUF_EXPORT MessageFactory { |
// Calling this method twice with the same Descriptor returns the same |
// object. The returned object remains property of the factory. Also, any |
// objects created by calling the prototype's New() method share some data |
- // with the prototype, so these must be destoyed before the MessageFactory |
+ // with the prototype, so these must be destroyed before the MessageFactory |
// is destroyed. |
// |
// The given descriptor must outlive the returned message, and hence must |
@@ -798,10 +1114,9 @@ inline RepeatedPtrField<string>* Reflection::MutableRepeatedPtrField<string>( |
template<> |
inline const RepeatedPtrField<Message>& Reflection::GetRepeatedPtrField( |
const Message& message, const FieldDescriptor* field) const { |
- return *static_cast<RepeatedPtrField<Message>* >( |
- MutableRawRepeatedField(const_cast<Message*>(&message), field, |
- FieldDescriptor::CPPTYPE_MESSAGE, -1, |
- NULL)); |
+ return *static_cast<const RepeatedPtrField<Message>* >( |
+ GetRawRepeatedField(message, field, FieldDescriptor::CPPTYPE_MESSAGE, |
+ -1, NULL)); |
} |
template<> |
@@ -816,10 +1131,9 @@ inline RepeatedPtrField<Message>* Reflection::MutableRepeatedPtrField( |
template<typename PB> |
inline const RepeatedPtrField<PB>& Reflection::GetRepeatedPtrField( |
const Message& message, const FieldDescriptor* field) const { |
- return *static_cast<RepeatedPtrField<PB>* >( |
- MutableRawRepeatedField(const_cast<Message*>(&message), field, |
- FieldDescriptor::CPPTYPE_MESSAGE, -1, |
- PB::default_instance().GetDescriptor())); |
+ return *static_cast<const RepeatedPtrField<PB>* >( |
+ GetRawRepeatedField(message, field, FieldDescriptor::CPPTYPE_MESSAGE, |
+ -1, PB::default_instance().GetDescriptor())); |
} |
template<typename PB> |
@@ -830,7 +1144,6 @@ inline RepeatedPtrField<PB>* Reflection::MutableRepeatedPtrField( |
FieldDescriptor::CPPTYPE_MESSAGE, -1, |
PB::default_instance().GetDescriptor())); |
} |
- |
} // namespace protobuf |
} // namespace google |