aboutsummaryrefslogtreecommitdiffstats
path: root/src/google/protobuf/generated_message_reflection.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/google/protobuf/generated_message_reflection.cc')
-rw-r--r--src/google/protobuf/generated_message_reflection.cc636
1 files changed, 92 insertions, 544 deletions
diff --git a/src/google/protobuf/generated_message_reflection.cc b/src/google/protobuf/generated_message_reflection.cc
index 536de7d..0f065ff 100644
--- a/src/google/protobuf/generated_message_reflection.cc
+++ b/src/google/protobuf/generated_message_reflection.cc
@@ -1,6 +1,6 @@
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
-// https://developers.google.com/protocol-buffers/
+// http://code.google.com/p/protobuf/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
@@ -33,26 +33,25 @@
// Sanjay Ghemawat, Jeff Dean, and others.
#include <algorithm>
-#include <set>
-#include <google/protobuf/descriptor.pb.h>
#include <google/protobuf/generated_message_reflection.h>
#include <google/protobuf/descriptor.h>
+#include <google/protobuf/descriptor.pb.h>
#include <google/protobuf/repeated_field.h>
#include <google/protobuf/extension_set.h>
#include <google/protobuf/generated_message_util.h>
#include <google/protobuf/stubs/common.h>
-#define GOOGLE_PROTOBUF_HAS_ONEOF
-
namespace google {
namespace protobuf {
namespace internal {
+namespace { const string kEmptyString; }
+
int StringSpaceUsedExcludingSelf(const string& str) {
const void* start = &str;
const void* end = &str + 1;
- if (start <= str.data() && str.data() < end) {
+ if (start <= str.data() && str.data() <= end) {
// The string's data is stored inside the string object itself.
return 0;
} else {
@@ -70,8 +69,9 @@ bool ParseNamedEnum(const EnumDescriptor* descriptor,
}
const string& NameOfEnum(const EnumDescriptor* descriptor, int value) {
+ static string kEmptyString;
const EnumValueDescriptor* d = descriptor->FindValueByNumber(value);
- return (d == NULL ? GetEmptyString() : d->name());
+ return (d == NULL ? kEmptyString : d->name());
}
// ===================================================================
@@ -191,33 +191,6 @@ GeneratedMessageReflection::GeneratedMessageReflection(
message_factory_ (factory) {
}
-GeneratedMessageReflection::GeneratedMessageReflection(
- const Descriptor* descriptor,
- const Message* default_instance,
- const int offsets[],
- int has_bits_offset,
- int unknown_fields_offset,
- int extensions_offset,
- const void* default_oneof_instance,
- int oneof_case_offset,
- const DescriptorPool* descriptor_pool,
- MessageFactory* factory,
- int object_size)
- : descriptor_ (descriptor),
- default_instance_ (default_instance),
- default_oneof_instance_ (default_oneof_instance),
- offsets_ (offsets),
- has_bits_offset_ (has_bits_offset),
- oneof_case_offset_(oneof_case_offset),
- unknown_fields_offset_(unknown_fields_offset),
- extensions_offset_(extensions_offset),
- object_size_ (object_size),
- descriptor_pool_ ((descriptor_pool == NULL) ?
- DescriptorPool::generated_pool() :
- descriptor_pool),
- message_factory_ (factory) {
-}
-
GeneratedMessageReflection::~GeneratedMessageReflection() {}
const UnknownFieldSet& GeneratedMessageReflection::GetUnknownFields(
@@ -284,9 +257,6 @@ int GeneratedMessageReflection::SpaceUsed(const Message& message) const {
break;
}
} else {
- if (field->containing_oneof() && !HasOneofField(message, field)) {
- continue;
- }
switch (field->cpp_type()) {
case FieldDescriptor::CPPTYPE_INT32 :
case FieldDescriptor::CPPTYPE_INT64 :
@@ -339,195 +309,6 @@ int GeneratedMessageReflection::SpaceUsed(const Message& message) const {
return total_size;
}
-void GeneratedMessageReflection::SwapField(
- Message* message1,
- Message* message2,
- const FieldDescriptor* field) const {
- if (field->is_repeated()) {
- switch (field->cpp_type()) {
-#define SWAP_ARRAYS(CPPTYPE, TYPE) \
- case FieldDescriptor::CPPTYPE_##CPPTYPE: \
- MutableRaw<RepeatedField<TYPE> >(message1, field)->Swap( \
- MutableRaw<RepeatedField<TYPE> >(message2, field)); \
- break;
-
- SWAP_ARRAYS(INT32 , int32 );
- SWAP_ARRAYS(INT64 , int64 );
- SWAP_ARRAYS(UINT32, uint32);
- SWAP_ARRAYS(UINT64, uint64);
- SWAP_ARRAYS(FLOAT , float );
- SWAP_ARRAYS(DOUBLE, double);
- SWAP_ARRAYS(BOOL , bool );
- SWAP_ARRAYS(ENUM , int );
-#undef SWAP_ARRAYS
-
- case FieldDescriptor::CPPTYPE_STRING:
- case FieldDescriptor::CPPTYPE_MESSAGE:
- MutableRaw<RepeatedPtrFieldBase>(message1, field)->Swap(
- MutableRaw<RepeatedPtrFieldBase>(message2, field));
- break;
-
- default:
- GOOGLE_LOG(FATAL) << "Unimplemented type: " << field->cpp_type();
- }
- } else {
- switch (field->cpp_type()) {
-#define SWAP_VALUES(CPPTYPE, TYPE) \
- case FieldDescriptor::CPPTYPE_##CPPTYPE: \
- std::swap(*MutableRaw<TYPE>(message1, field), \
- *MutableRaw<TYPE>(message2, field)); \
- break;
-
- SWAP_VALUES(INT32 , int32 );
- SWAP_VALUES(INT64 , int64 );
- SWAP_VALUES(UINT32, uint32);
- SWAP_VALUES(UINT64, uint64);
- SWAP_VALUES(FLOAT , float );
- SWAP_VALUES(DOUBLE, double);
- SWAP_VALUES(BOOL , bool );
- SWAP_VALUES(ENUM , int );
-#undef SWAP_VALUES
- case FieldDescriptor::CPPTYPE_MESSAGE:
- std::swap(*MutableRaw<Message*>(message1, field),
- *MutableRaw<Message*>(message2, field));
- break;
-
- case FieldDescriptor::CPPTYPE_STRING:
- switch (field->options().ctype()) {
- default: // TODO(kenton): Support other string reps.
- case FieldOptions::STRING:
- std::swap(*MutableRaw<string*>(message1, field),
- *MutableRaw<string*>(message2, field));
- break;
- }
- break;
-
- default:
- GOOGLE_LOG(FATAL) << "Unimplemented type: " << field->cpp_type();
- }
- }
-}
-
-void GeneratedMessageReflection::SwapOneofField(
- Message* message1,
- Message* message2,
- const OneofDescriptor* oneof_descriptor) const {
- uint32 oneof_case1 = GetOneofCase(*message1, oneof_descriptor);
- uint32 oneof_case2 = GetOneofCase(*message2, oneof_descriptor);
-
- int32 temp_int32;
- int64 temp_int64;
- uint32 temp_uint32;
- uint64 temp_uint64;
- float temp_float;
- double temp_double;
- bool temp_bool;
- int temp_int;
- Message* temp_message;
- string temp_string;
-
- // Stores message1's oneof field to a temp variable.
- const FieldDescriptor* field1;
- if (oneof_case1 > 0) {
- field1 = descriptor_->FindFieldByNumber(oneof_case1);
- //oneof_descriptor->field(oneof_case1);
- switch (field1->cpp_type()) {
-#define GET_TEMP_VALUE(CPPTYPE, TYPE) \
- case FieldDescriptor::CPPTYPE_##CPPTYPE: \
- temp_##TYPE = GetField<TYPE>(*message1, field1); \
- break;
-
- GET_TEMP_VALUE(INT32 , int32 );
- GET_TEMP_VALUE(INT64 , int64 );
- GET_TEMP_VALUE(UINT32, uint32);
- GET_TEMP_VALUE(UINT64, uint64);
- GET_TEMP_VALUE(FLOAT , float );
- GET_TEMP_VALUE(DOUBLE, double);
- GET_TEMP_VALUE(BOOL , bool );
- GET_TEMP_VALUE(ENUM , int );
-#undef GET_TEMP_VALUE
- case FieldDescriptor::CPPTYPE_MESSAGE:
- temp_message = ReleaseMessage(message1, field1);
- break;
-
- case FieldDescriptor::CPPTYPE_STRING:
- temp_string = GetString(*message1, field1);
- break;
-
- default:
- GOOGLE_LOG(FATAL) << "Unimplemented type: " << field1->cpp_type();
- }
- }
-
- // Sets message1's oneof field from the message2's oneof field.
- if (oneof_case2 > 0) {
- const FieldDescriptor* field2 =
- descriptor_->FindFieldByNumber(oneof_case2);
- switch (field2->cpp_type()) {
-#define SET_ONEOF_VALUE1(CPPTYPE, TYPE) \
- case FieldDescriptor::CPPTYPE_##CPPTYPE: \
- SetField<TYPE>(message1, field2, GetField<TYPE>(*message2, field2)); \
- break;
-
- SET_ONEOF_VALUE1(INT32 , int32 );
- SET_ONEOF_VALUE1(INT64 , int64 );
- SET_ONEOF_VALUE1(UINT32, uint32);
- SET_ONEOF_VALUE1(UINT64, uint64);
- SET_ONEOF_VALUE1(FLOAT , float );
- SET_ONEOF_VALUE1(DOUBLE, double);
- SET_ONEOF_VALUE1(BOOL , bool );
- SET_ONEOF_VALUE1(ENUM , int );
-#undef SET_ONEOF_VALUE1
- case FieldDescriptor::CPPTYPE_MESSAGE:
- SetAllocatedMessage(message1,
- ReleaseMessage(message2, field2),
- field2);
- break;
-
- case FieldDescriptor::CPPTYPE_STRING:
- SetString(message1, field2, GetString(*message2, field2));
- break;
-
- default:
- GOOGLE_LOG(FATAL) << "Unimplemented type: " << field2->cpp_type();
- }
- } else {
- ClearOneof(message1, oneof_descriptor);
- }
-
- // Sets message2's oneof field from the temp variable.
- if (oneof_case1 > 0) {
- switch (field1->cpp_type()) {
-#define SET_ONEOF_VALUE2(CPPTYPE, TYPE) \
- case FieldDescriptor::CPPTYPE_##CPPTYPE: \
- SetField<TYPE>(message2, field1, temp_##TYPE); \
- break;
-
- SET_ONEOF_VALUE2(INT32 , int32 );
- SET_ONEOF_VALUE2(INT64 , int64 );
- SET_ONEOF_VALUE2(UINT32, uint32);
- SET_ONEOF_VALUE2(UINT64, uint64);
- SET_ONEOF_VALUE2(FLOAT , float );
- SET_ONEOF_VALUE2(DOUBLE, double);
- SET_ONEOF_VALUE2(BOOL , bool );
- SET_ONEOF_VALUE2(ENUM , int );
-#undef SET_ONEOF_VALUE2
- case FieldDescriptor::CPPTYPE_MESSAGE:
- SetAllocatedMessage(message2, temp_message, field1);
- break;
-
- case FieldDescriptor::CPPTYPE_STRING:
- SetString(message2, field1, temp_string);
- break;
-
- default:
- GOOGLE_LOG(FATAL) << "Unimplemented type: " << field1->cpp_type();
- }
- } else {
- ClearOneof(message2, oneof_descriptor);
- }
-}
-
void GeneratedMessageReflection::Swap(
Message* message1,
Message* message2) const {
@@ -543,7 +324,7 @@ void GeneratedMessageReflection::Swap(
"descriptor.";
GOOGLE_CHECK_EQ(message2->GetReflection(), this)
<< "Second argument to Swap() (of type \""
- << message2->GetDescriptor()->full_name()
+ << message1->GetDescriptor()->full_name()
<< "\") is not compatible with this reflection object (which is for type \""
<< descriptor_->full_name()
<< "\"). Note that the exact same class is required; not just the same "
@@ -559,69 +340,73 @@ void GeneratedMessageReflection::Swap(
for (int i = 0; i < descriptor_->field_count(); i++) {
const FieldDescriptor* field = descriptor_->field(i);
- if (!field->containing_oneof()) {
- SwapField(message1, message2, field);
- }
- }
-
- for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
- SwapOneofField(message1, message2, descriptor_->oneof_decl(i));
- }
+ if (field->is_repeated()) {
+ switch (field->cpp_type()) {
+#define SWAP_ARRAYS(CPPTYPE, TYPE) \
+ case FieldDescriptor::CPPTYPE_##CPPTYPE: \
+ MutableRaw<RepeatedField<TYPE> >(message1, field)->Swap( \
+ MutableRaw<RepeatedField<TYPE> >(message2, field)); \
+ break;
- if (extensions_offset_ != -1) {
- MutableExtensionSet(message1)->Swap(MutableExtensionSet(message2));
- }
+ SWAP_ARRAYS(INT32 , int32 );
+ SWAP_ARRAYS(INT64 , int64 );
+ SWAP_ARRAYS(UINT32, uint32);
+ SWAP_ARRAYS(UINT64, uint64);
+ SWAP_ARRAYS(FLOAT , float );
+ SWAP_ARRAYS(DOUBLE, double);
+ SWAP_ARRAYS(BOOL , bool );
+ SWAP_ARRAYS(ENUM , int );
+#undef SWAP_ARRAYS
- MutableUnknownFields(message1)->Swap(MutableUnknownFields(message2));
-}
+ case FieldDescriptor::CPPTYPE_STRING:
+ case FieldDescriptor::CPPTYPE_MESSAGE:
+ MutableRaw<RepeatedPtrFieldBase>(message1, field)->Swap(
+ MutableRaw<RepeatedPtrFieldBase>(message2, field));
+ break;
-void GeneratedMessageReflection::SwapFields(
- Message* message1,
- Message* message2,
- const vector<const FieldDescriptor*>& fields) const {
- if (message1 == message2) return;
+ default:
+ GOOGLE_LOG(FATAL) << "Unimplemented type: " << field->cpp_type();
+ }
+ } else {
+ switch (field->cpp_type()) {
+#define SWAP_VALUES(CPPTYPE, TYPE) \
+ case FieldDescriptor::CPPTYPE_##CPPTYPE: \
+ std::swap(*MutableRaw<TYPE>(message1, field), \
+ *MutableRaw<TYPE>(message2, field)); \
+ break;
- // TODO(kenton): Other Reflection methods should probably check this too.
- GOOGLE_CHECK_EQ(message1->GetReflection(), this)
- << "First argument to SwapFields() (of type \""
- << message1->GetDescriptor()->full_name()
- << "\") is not compatible with this reflection object (which is for type \""
- << descriptor_->full_name()
- << "\"). Note that the exact same class is required; not just the same "
- "descriptor.";
- GOOGLE_CHECK_EQ(message2->GetReflection(), this)
- << "Second argument to SwapFields() (of type \""
- << message2->GetDescriptor()->full_name()
- << "\") is not compatible with this reflection object (which is for type \""
- << descriptor_->full_name()
- << "\"). Note that the exact same class is required; not just the same "
- "descriptor.";
+ SWAP_VALUES(INT32 , int32 );
+ SWAP_VALUES(INT64 , int64 );
+ SWAP_VALUES(UINT32, uint32);
+ SWAP_VALUES(UINT64, uint64);
+ SWAP_VALUES(FLOAT , float );
+ SWAP_VALUES(DOUBLE, double);
+ SWAP_VALUES(BOOL , bool );
+ SWAP_VALUES(ENUM , int );
+ SWAP_VALUES(MESSAGE, Message*);
+#undef SWAP_VALUES
- std::set<int> swapped_oneof;
+ case FieldDescriptor::CPPTYPE_STRING:
+ switch (field->options().ctype()) {
+ default: // TODO(kenton): Support other string reps.
+ case FieldOptions::STRING:
+ std::swap(*MutableRaw<string*>(message1, field),
+ *MutableRaw<string*>(message2, field));
+ break;
+ }
+ break;
- for (int i = 0; i < fields.size(); i++) {
- const FieldDescriptor* field = fields[i];
- if (field->is_extension()) {
- MutableExtensionSet(message1)->SwapExtension(
- MutableExtensionSet(message2),
- field->number());
- } else {
- if (field->containing_oneof()) {
- int oneof_index = field->containing_oneof()->index();
- // Only swap the oneof field once.
- if (swapped_oneof.find(oneof_index) != swapped_oneof.end()) {
- continue;
- }
- swapped_oneof.insert(oneof_index);
- SwapOneofField(message1, message2, field->containing_oneof());
- } else {
- // Swap has bit.
- SwapBit(message1, message2, field);
- // Swap field.
- SwapField(message1, message2, field);
+ default:
+ GOOGLE_LOG(FATAL) << "Unimplemented type: " << field->cpp_type();
}
}
}
+
+ if (extensions_offset_ != -1) {
+ MutableExtensionSet(message1)->Swap(MutableExtensionSet(message2));
+ }
+
+ MutableUnknownFields(message1)->Swap(MutableUnknownFields(message2));
}
// -------------------------------------------------------------------
@@ -634,11 +419,7 @@ bool GeneratedMessageReflection::HasField(const Message& message,
if (field->is_extension()) {
return GetExtensionSet(message).Has(field->number());
} else {
- if (field->containing_oneof()) {
- return HasOneofField(message, field);
- } else {
- return HasBit(message, field);
- }
+ return HasBit(message, field);
}
}
@@ -682,11 +463,6 @@ void GeneratedMessageReflection::ClearField(
if (field->is_extension()) {
MutableExtensionSet(message)->ClearExtension(field->number());
} else if (!field->is_repeated()) {
- if (field->containing_oneof()) {
- ClearOneofField(message, field);
- return;
- }
-
if (HasBit(*message, field)) {
ClearBit(message, field);
@@ -815,20 +591,6 @@ void GeneratedMessageReflection::RemoveLast(
}
}
-Message* GeneratedMessageReflection::ReleaseLast(
- Message* message,
- const FieldDescriptor* field) const {
- USAGE_CHECK_ALL(ReleaseLast, REPEATED, MESSAGE);
-
- if (field->is_extension()) {
- return static_cast<Message*>(
- MutableExtensionSet(message)->ReleaseLast(field->number()));
- } else {
- return MutableRaw<RepeatedPtrFieldBase>(message, field)
- ->ReleaseLast<GenericTypeHandler<Message> >();
- }
-}
-
void GeneratedMessageReflection::SwapElements(
Message* message,
const FieldDescriptor* field,
@@ -891,11 +653,7 @@ void GeneratedMessageReflection::ListFields(
output->push_back(field);
}
} else {
- if (field->containing_oneof()) {
- if (HasOneofField(message, field)) {
- output->push_back(field);
- }
- } else if (HasBit(message, field)) {
+ if (HasBit(message, field)) {
output->push_back(field);
}
}
@@ -999,7 +757,7 @@ string GeneratedMessageReflection::GetString(
}
GOOGLE_LOG(FATAL) << "Can't get here.";
- return GetEmptyString(); // Make compiler happy.
+ return kEmptyString; // Make compiler happy.
}
}
@@ -1018,7 +776,7 @@ const string& GeneratedMessageReflection::GetStringReference(
}
GOOGLE_LOG(FATAL) << "Can't get here.";
- return GetEmptyString(); // Make compiler happy.
+ return kEmptyString; // Make compiler happy.
}
}
@@ -1034,10 +792,6 @@ void GeneratedMessageReflection::SetString(
switch (field->options().ctype()) {
default: // TODO(kenton): Support other string reps.
case FieldOptions::STRING: {
- if (field->containing_oneof() && !HasOneofField(*message, field)) {
- ClearOneof(message, field->containing_oneof());
- *MutableField<string*>(message, field) = new string;
- }
string** ptr = MutableField<string*>(message, field);
if (*ptr == DefaultRaw<const string*>(field)) {
*ptr = new string(value);
@@ -1064,7 +818,7 @@ string GeneratedMessageReflection::GetRepeatedString(
}
GOOGLE_LOG(FATAL) << "Can't get here.";
- return GetEmptyString(); // Make compiler happy.
+ return kEmptyString; // Make compiler happy.
}
}
@@ -1082,7 +836,7 @@ const string& GeneratedMessageReflection::GetRepeatedStringReference(
}
GOOGLE_LOG(FATAL) << "Can't get here.";
- return GetEmptyString(); // Make compiler happy.
+ return kEmptyString; // Make compiler happy.
}
}
@@ -1138,9 +892,7 @@ const EnumValueDescriptor* GeneratedMessageReflection::GetEnum(
}
const EnumValueDescriptor* result =
field->enum_type()->FindValueByNumber(value);
- GOOGLE_CHECK(result != NULL) << "Value " << value << " is not valid for field "
- << field->full_name() << " of type "
- << field->enum_type()->full_name() << ".";
+ GOOGLE_CHECK(result != NULL);
return result;
}
@@ -1170,9 +922,7 @@ const EnumValueDescriptor* GeneratedMessageReflection::GetRepeatedEnum(
}
const EnumValueDescriptor* result =
field->enum_type()->FindValueByNumber(value);
- GOOGLE_CHECK(result != NULL) << "Value " << value << " is not valid for field "
- << field->full_name() << " of type "
- << field->enum_type()->full_name() << ".";
+ GOOGLE_CHECK(result != NULL);
return result;
}
@@ -1213,15 +963,13 @@ const Message& GeneratedMessageReflection::GetMessage(
MessageFactory* factory) const {
USAGE_CHECK_ALL(GetMessage, SINGULAR, MESSAGE);
- if (factory == NULL) factory = message_factory_;
-
if (field->is_extension()) {
return static_cast<const Message&>(
GetExtensionSet(message).GetMessage(
- field->number(), field->message_type(), factory));
+ field->number(), field->message_type(),
+ factory == NULL ? message_factory_ : factory));
} else {
- const Message* result;
- result = GetRaw<const Message*>(message, field);
+ const Message* result = GetRaw<const Message*>(message, field);
if (result == NULL) {
result = DefaultRaw<const Message*>(field);
}
@@ -1232,91 +980,19 @@ const Message& GeneratedMessageReflection::GetMessage(
Message* GeneratedMessageReflection::MutableMessage(
Message* message, const FieldDescriptor* field,
MessageFactory* factory) const {
- if (factory == NULL) factory = message_factory_;
+ USAGE_CHECK_ALL(MutableMessage, SINGULAR, MESSAGE);
if (field->is_extension()) {
return static_cast<Message*>(
- MutableExtensionSet(message)->MutableMessage(field, factory));
+ MutableExtensionSet(message)->MutableMessage(field,
+ factory == NULL ? message_factory_ : factory));
} else {
- Message* result;
- Message** result_holder = MutableRaw<Message*>(message, field);
-
- if (field->containing_oneof()) {
- if (!HasOneofField(*message, field)) {
- ClearOneof(message, field->containing_oneof());
- result_holder = MutableField<Message*>(message, field);
- const Message* default_message = DefaultRaw<const Message*>(field);
- *result_holder = default_message->New();
- }
- } else {
- SetBit(message, field);
- }
-
- if (*result_holder == NULL) {
+ Message** result = MutableField<Message*>(message, field);
+ if (*result == NULL) {
const Message* default_message = DefaultRaw<const Message*>(field);
- *result_holder = default_message->New();
- }
- result = *result_holder;
- return result;
- }
-}
-
-void GeneratedMessageReflection::SetAllocatedMessage(
- Message* message,
- Message* sub_message,
- const FieldDescriptor* field) const {
- USAGE_CHECK_ALL(SetAllocatedMessage, SINGULAR, MESSAGE);
-
- if (field->is_extension()) {
- MutableExtensionSet(message)->SetAllocatedMessage(
- field->number(), field->type(), field, sub_message);
- } else {
- if (field->containing_oneof()) {
- if (sub_message == NULL) {
- ClearOneof(message, field->containing_oneof());
- return;
- }
- ClearOneof(message, field->containing_oneof());
- *MutableRaw<Message*>(message, field) = sub_message;
- SetOneofCase(message, field);
- return;
- }
-
- if (sub_message == NULL) {
- ClearBit(message, field);
- } else {
- SetBit(message, field);
- }
- Message** sub_message_holder = MutableRaw<Message*>(message, field);
- delete *sub_message_holder;
- *sub_message_holder = sub_message;
- }
-}
-
-Message* GeneratedMessageReflection::ReleaseMessage(
- Message* message,
- const FieldDescriptor* field,
- MessageFactory* factory) const {
- USAGE_CHECK_ALL(ReleaseMessage, SINGULAR, MESSAGE);
-
- if (factory == NULL) factory = message_factory_;
-
- if (field->is_extension()) {
- return static_cast<Message*>(
- MutableExtensionSet(message)->ReleaseMessage(field, factory));
- } else {
- ClearBit(message, field);
- if (field->containing_oneof()) {
- if (HasOneofField(*message, field)) {
- *MutableOneofCase(message, field->containing_oneof()) = 0;
- } else {
- return NULL;
- }
+ *result = default_message->New();
}
- Message** result = MutableRaw<Message*>(message, field);
- Message* ret = *result;
- *result = NULL;
- return ret;
+ return *result;
}
}
@@ -1361,7 +1037,7 @@ Message* GeneratedMessageReflection::AddMessage(
// We can't use AddField<Message>() because RepeatedPtrFieldBase doesn't
// know how to allocate one.
RepeatedPtrFieldBase* repeated =
- MutableRaw<RepeatedPtrFieldBase>(message, field);
+ MutableRaw<RepeatedPtrFieldBase>(message, field);
Message* result = repeated->AddFromCleared<GenericTypeHandler<Message> >();
if (result == NULL) {
// We must allocate a new object.
@@ -1378,36 +1054,7 @@ Message* GeneratedMessageReflection::AddMessage(
}
}
-void* GeneratedMessageReflection::MutableRawRepeatedField(
- Message* message, const FieldDescriptor* field,
- FieldDescriptor::CppType cpptype,
- int ctype, const Descriptor* desc) const {
- USAGE_CHECK_REPEATED("MutableRawRepeatedField");
- if (field->cpp_type() != cpptype)
- ReportReflectionUsageTypeError(descriptor_,
- field, "MutableRawRepeatedField", cpptype);
- if (ctype >= 0)
- GOOGLE_CHECK_EQ(field->options().ctype(), ctype) << "subtype mismatch";
- if (desc != NULL)
- GOOGLE_CHECK_EQ(field->message_type(), desc) << "wrong submessage type";
- if (field->is_extension())
- return MutableExtensionSet(message)->MutableRawRepeatedField(
- field->number(), field->type(), field->is_packed(), field);
- else
- return reinterpret_cast<uint8*>(message) + offsets_[field->index()];
-}
-
-const FieldDescriptor* GeneratedMessageReflection::GetOneofFieldDescriptor(
- const Message& message,
- const OneofDescriptor* oneof_descriptor) const {
- uint32 field_number = GetOneofCase(message, oneof_descriptor);
- if (field_number == 0) {
- return NULL;
- }
- return descriptor_->FindFieldByNumber(field_number);
-}
-
-// -----------------------------------------------------------------------------
+// -------------------------------------------------------------------
const FieldDescriptor* GeneratedMessageReflection::FindKnownExtensionByName(
const string& name) const {
@@ -1453,35 +1100,23 @@ const FieldDescriptor* GeneratedMessageReflection::FindKnownExtensionByNumber(
template <typename Type>
inline const Type& GeneratedMessageReflection::GetRaw(
const Message& message, const FieldDescriptor* field) const {
- if (field->containing_oneof() && !HasOneofField(message, field)) {
- return DefaultRaw<Type>(field);
- }
- int index = field->containing_oneof() ?
- descriptor_->field_count() + field->containing_oneof()->index() :
- field->index();
const void* ptr = reinterpret_cast<const uint8*>(&message) +
- offsets_[index];
+ offsets_[field->index()];
return *reinterpret_cast<const Type*>(ptr);
}
template <typename Type>
inline Type* GeneratedMessageReflection::MutableRaw(
Message* message, const FieldDescriptor* field) const {
- int index = field->containing_oneof() ?
- descriptor_->field_count() + field->containing_oneof()->index() :
- field->index();
- void* ptr = reinterpret_cast<uint8*>(message) + offsets_[index];
+ void* ptr = reinterpret_cast<uint8*>(message) + offsets_[field->index()];
return reinterpret_cast<Type*>(ptr);
}
template <typename Type>
inline const Type& GeneratedMessageReflection::DefaultRaw(
const FieldDescriptor* field) const {
- const void* ptr = field->containing_oneof() ?
- reinterpret_cast<const uint8*>(default_oneof_instance_) +
- offsets_[field->index()] :
- reinterpret_cast<const uint8*>(default_instance_) +
- offsets_[field->index()];
+ const void* ptr = reinterpret_cast<const uint8*>(default_instance_) +
+ offsets_[field->index()];
return *reinterpret_cast<const Type*>(ptr);
}
@@ -1496,21 +1131,6 @@ inline uint32* GeneratedMessageReflection::MutableHasBits(
return reinterpret_cast<uint32*>(ptr);
}
-inline uint32 GeneratedMessageReflection::GetOneofCase(
- const Message& message,
- const OneofDescriptor* oneof_descriptor) const {
- const void* ptr = reinterpret_cast<const uint8*>(&message)
- + oneof_case_offset_;
- return reinterpret_cast<const uint32*>(ptr)[oneof_descriptor->index()];
-}
-
-inline uint32* GeneratedMessageReflection::MutableOneofCase(
- Message* message,
- const OneofDescriptor* oneof_descriptor) const {
- void* ptr = reinterpret_cast<uint8*>(message) + oneof_case_offset_;
- return &(reinterpret_cast<uint32*>(ptr)[oneof_descriptor->index()]);
-}
-
inline const ExtensionSet& GeneratedMessageReflection::GetExtensionSet(
const Message& message) const {
GOOGLE_DCHECK_NE(extensions_offset_, -1);
@@ -1542,73 +1162,6 @@ inline void GeneratedMessageReflection::ClearBit(
MutableHasBits(message)[field->index() / 32] &= ~(1 << (field->index() % 32));
}
-inline void GeneratedMessageReflection::SwapBit(
- Message* message1, Message* message2, const FieldDescriptor* field) const {
- bool temp_has_bit = HasBit(*message1, field);
- if (HasBit(*message2, field)) {
- SetBit(message1, field);
- } else {
- ClearBit(message1, field);
- }
- if (temp_has_bit) {
- SetBit(message2, field);
- } else {
- ClearBit(message2, field);
- }
-}
-
-inline bool GeneratedMessageReflection::HasOneof(
- const Message& message, const OneofDescriptor* oneof_descriptor) const {
- return (GetOneofCase(message, oneof_descriptor) > 0);
-}
-
-inline bool GeneratedMessageReflection::HasOneofField(
- const Message& message, const FieldDescriptor* field) const {
- return (GetOneofCase(message, field->containing_oneof()) == field->number());
-}
-
-inline void GeneratedMessageReflection::SetOneofCase(
- Message* message, const FieldDescriptor* field) const {
- *MutableOneofCase(message, field->containing_oneof()) = field->number();
-}
-
-inline void GeneratedMessageReflection::ClearOneofField(
- Message* message, const FieldDescriptor* field) const {
- if (HasOneofField(*message, field)) {
- ClearOneof(message, field->containing_oneof());
- }
-}
-
-inline void GeneratedMessageReflection::ClearOneof(
- Message* message, const OneofDescriptor* oneof_descriptor) const {
- // TODO(jieluo): Consider to cache the unused object instead of deleting
- // it. It will be much faster if an aplication switches a lot from
- // a few oneof fields. Time/space tradeoff
- uint32 oneof_case = GetOneofCase(*message, oneof_descriptor);
- if (oneof_case > 0) {
- const FieldDescriptor* field = descriptor_->FindFieldByNumber(oneof_case);
- switch (field->cpp_type()) {
- case FieldDescriptor::CPPTYPE_STRING: {
- switch (field->options().ctype()) {
- default: // TODO(kenton): Support other string reps.
- case FieldOptions::STRING:
- delete *MutableRaw<string*>(message, field);
- break;
- }
- break;
- }
-
- case FieldDescriptor::CPPTYPE_MESSAGE:
- delete *MutableRaw<Message*>(message, field);
- break;
- default:
- break;
- }
-
- *MutableOneofCase(message, oneof_descriptor) = 0;
- }
-}
-
// Template implementations of basic accessors. Inline because each
// template instance is only called from one location. These are
// used for all types except messages.
@@ -1621,19 +1174,14 @@ inline const Type& GeneratedMessageReflection::GetField(
template <typename Type>
inline void GeneratedMessageReflection::SetField(
Message* message, const FieldDescriptor* field, const Type& value) const {
- if (field->containing_oneof() && !HasOneofField(*message, field)) {
- ClearOneof(message, field->containing_oneof());
- }
*MutableRaw<Type>(message, field) = value;
- field->containing_oneof() ?
- SetOneofCase(message, field) : SetBit(message, field);
+ SetBit(message, field);
}
template <typename Type>
inline Type* GeneratedMessageReflection::MutableField(
Message* message, const FieldDescriptor* field) const {
- field->containing_oneof() ?
- SetOneofCase(message, field) : SetBit(message, field);
+ SetBit(message, field);
return MutableRaw<Type>(message, field);
}