diff options
author | kenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d> | 2009-04-25 02:53:47 +0000 |
---|---|---|
committer | kenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d> | 2009-04-25 02:53:47 +0000 |
commit | d37d46dfbcedadeb439ad0367f8afcf8867dca43 (patch) | |
tree | b896df229f7c671637924c156d5a759ba50a3190 /src/google/protobuf/generated_message_reflection.cc | |
parent | 709ea28f3264aa5632e5577a4080671173fc6166 (diff) |
Integrate recent changes from Google-internal code tree. See CHANGES.txt
for details.
Diffstat (limited to 'src/google/protobuf/generated_message_reflection.cc')
-rw-r--r-- | src/google/protobuf/generated_message_reflection.cc | 67 |
1 files changed, 51 insertions, 16 deletions
diff --git a/src/google/protobuf/generated_message_reflection.cc b/src/google/protobuf/generated_message_reflection.cc index 085af8f9..ffeaf62d 100644 --- a/src/google/protobuf/generated_message_reflection.cc +++ b/src/google/protobuf/generated_message_reflection.cc @@ -58,6 +58,21 @@ int StringSpaceUsedExcludingSelf(const string& str) { } } +bool ParseNamedEnum(const EnumDescriptor* descriptor, + const string& name, + int* value) { + const EnumValueDescriptor* d = descriptor->FindValueByName(name); + if (d == NULL) return false; + *value = d->number(); + return true; +} + +const string& NameOfEnum(const EnumDescriptor* descriptor, int value) { + static string kEmptyString; + const EnumValueDescriptor* d = descriptor->FindValueByNumber(value); + return (d == NULL ? kEmptyString : d->name()); +} + // =================================================================== // Helpers for reporting usage errors (e.g. trying to use GetInt32() on // a string field). @@ -160,6 +175,7 @@ GeneratedMessageReflection::GeneratedMessageReflection( int unknown_fields_offset, int extensions_offset, const DescriptorPool* descriptor_pool, + MessageFactory* factory, int object_size) : descriptor_ (descriptor), default_instance_ (default_instance), @@ -170,7 +186,8 @@ GeneratedMessageReflection::GeneratedMessageReflection( object_size_ (object_size), descriptor_pool_ ((descriptor_pool == NULL) ? DescriptorPool::generated_pool() : - descriptor_pool) { + descriptor_pool), + message_factory_ (factory) { } GeneratedMessageReflection::~GeneratedMessageReflection() {} @@ -365,7 +382,8 @@ void GeneratedMessageReflection::ListFields( } if (extensions_offset_ != -1) { - GetExtensionSet(message).AppendToList(output); + GetExtensionSet(message).AppendToList(descriptor_, descriptor_pool_, + output); } // ListFields() must sort output by field number. @@ -380,7 +398,8 @@ void GeneratedMessageReflection::ListFields( const Message& message, const FieldDescriptor* field) const { \ USAGE_CHECK_ALL(Get##TYPENAME, SINGULAR, CPPTYPE); \ if (field->is_extension()) { \ - return GetExtensionSet(message).Get##TYPENAME(field->number()); \ + return GetExtensionSet(message).Get##TYPENAME( \ + field->number(), field->default_value_##PASSTYPE()); \ } else { \ return GetField<TYPE>(message, field); \ } \ @@ -392,7 +411,7 @@ void GeneratedMessageReflection::ListFields( USAGE_CHECK_ALL(Set##TYPENAME, SINGULAR, CPPTYPE); \ if (field->is_extension()) { \ return MutableExtensionSet(message)->Set##TYPENAME( \ - field->number(), value); \ + field->number(), field->type(), value); \ } else { \ SetField<TYPE>(message, field, value); \ } \ @@ -427,7 +446,8 @@ void GeneratedMessageReflection::ListFields( PASSTYPE value) const { \ USAGE_CHECK_ALL(Add##TYPENAME, REPEATED, CPPTYPE); \ if (field->is_extension()) { \ - MutableExtensionSet(message)->Add##TYPENAME(field->number(), value); \ + MutableExtensionSet(message)->Add##TYPENAME( \ + field->number(), field->type(), field->options().packed(), value); \ } else { \ AddField<TYPE>(message, field, value); \ } \ @@ -448,7 +468,8 @@ string GeneratedMessageReflection::GetString( const Message& message, const FieldDescriptor* field) const { USAGE_CHECK_ALL(GetString, SINGULAR, STRING); if (field->is_extension()) { - return GetExtensionSet(message).GetString(field->number()); + return GetExtensionSet(message).GetString(field->number(), + field->default_value_string()); } else { return *GetField<const string*>(message, field); } @@ -459,7 +480,8 @@ const string& GeneratedMessageReflection::GetStringReference( const FieldDescriptor* field, string* scratch) const { USAGE_CHECK_ALL(GetStringReference, SINGULAR, STRING); if (field->is_extension()) { - return GetExtensionSet(message).GetString(field->number()); + return GetExtensionSet(message).GetString(field->number(), + field->default_value_string()); } else { return *GetField<const string*>(message, field); } @@ -471,7 +493,8 @@ void GeneratedMessageReflection::SetString( const string& value) const { USAGE_CHECK_ALL(SetString, SINGULAR, STRING); if (field->is_extension()) { - return MutableExtensionSet(message)->SetString(field->number(), value); + return MutableExtensionSet(message)->SetString(field->number(), + field->type(), value); } else { string** ptr = MutableField<string*>(message, field); if (*ptr == DefaultRaw<const string*>(field)) { @@ -523,7 +546,8 @@ void GeneratedMessageReflection::AddString( const string& value) const { USAGE_CHECK_ALL(AddString, REPEATED, STRING); if (field->is_extension()) { - MutableExtensionSet(message)->AddString(field->number(), value); + MutableExtensionSet(message)->AddString(field->number(), + field->type(), value); } else { AddField<string>(message, field, value); } @@ -538,7 +562,8 @@ const EnumValueDescriptor* GeneratedMessageReflection::GetEnum( int value; if (field->is_extension()) { - value = GetExtensionSet(message).GetEnum(field->number()); + value = GetExtensionSet(message).GetEnum( + field->number(), field->default_value_enum()->number()); } else { value = GetField<int>(message, field); } @@ -555,7 +580,8 @@ void GeneratedMessageReflection::SetEnum( USAGE_CHECK_ENUM_VALUE(SetEnum); if (field->is_extension()) { - MutableExtensionSet(message)->SetEnum(field->number(), value->number()); + MutableExtensionSet(message)->SetEnum(field->number(), field->type(), + value->number()); } else { SetField<int>(message, field, value->number()); } @@ -599,7 +625,9 @@ void GeneratedMessageReflection::AddEnum( USAGE_CHECK_ENUM_VALUE(AddEnum); if (field->is_extension()) { - MutableExtensionSet(message)->AddEnum(field->number(), value->number()); + MutableExtensionSet(message)->AddEnum(field->number(), field->type(), + field->options().packed(), + value->number()); } else { AddField<int>(message, field, value->number()); } @@ -612,7 +640,9 @@ const Message& GeneratedMessageReflection::GetMessage( USAGE_CHECK_ALL(GetMessage, SINGULAR, MESSAGE); if (field->is_extension()) { - return GetExtensionSet(message).GetMessage(field->number()); + return GetExtensionSet(message).GetMessage(field->number(), + field->message_type(), + message_factory_); } else { const Message* result = GetRaw<const Message*>(message, field); if (result == NULL) { @@ -627,13 +657,15 @@ Message* GeneratedMessageReflection::MutableMessage( USAGE_CHECK_ALL(MutableMessage, SINGULAR, MESSAGE); if (field->is_extension()) { - return MutableExtensionSet(message)->MutableMessage(field->number()); + return MutableExtensionSet(message)->MutableMessage(field->number(), + field->type(), + field->message_type(), + message_factory_); } else { Message** result = MutableField<Message*>(message, field); if (*result == NULL) { const Message* default_message = DefaultRaw<const Message*>(field); *result = default_message->New(); - (*result)->CopyFrom(*default_message); } return *result; } @@ -667,7 +699,10 @@ Message* GeneratedMessageReflection::AddMessage( USAGE_CHECK_ALL(AddMessage, REPEATED, MESSAGE); if (field->is_extension()) { - return MutableExtensionSet(message)->AddMessage(field->number()); + return MutableExtensionSet(message)->AddMessage(field->number(), + field->type(), + field->message_type(), + message_factory_); } else { return AddField<Message>(message, field); } |