Fix compile for GCC 3.4.4.

This commit is contained in:
kenton@google.com 2009-08-01 00:30:11 +00:00
parent 39671e5309
commit 1900c536cd
2 changed files with 16 additions and 3 deletions

View File

@ -61,6 +61,7 @@ namespace protobuf {
}
namespace internal {
class FieldSkipper; // wire_format_lite.h
class RepeatedPtrFieldBase; // repeated_field.h
}
template <typename Element> class RepeatedField; // repeated_field.h
template <typename Element> class RepeatedPtrField; // repeated_field.h
@ -388,6 +389,15 @@ class LIBPROTOBUF_EXPORT ExtensionSet {
const MessageLite* containing_type,
FieldSkipper* field_skipper);
// Hack: RepeatedPtrFieldBase declares ExtensionSet as a friend. This
// friendship should automatically extend to ExtensionSet::Extension, but
// unfortunately some older compilers (e.g. GCC 3.4.4) do not implement this
// correctly. So, we must provide helpers for calling methods of that
// class.
// Defined in extension_set_heavy.cc.
static inline int RepeatedMessage_SpaceUsedExcludingSelf(
RepeatedPtrFieldBase* field);
// The Extension struct is small enough to be passed by value, so we use it
// directly as the value type in the map rather than use pointers. We use

View File

@ -165,6 +165,11 @@ int ExtensionSet::SpaceUsedExcludingSelf() const {
return total_size;
}
inline int ExtensionSet::RepeatedMessage_SpaceUsedExcludingSelf(
RepeatedPtrFieldBase* field) {
return field->SpaceUsedExcludingSelf<GenericTypeHandler<Message> >();
}
int ExtensionSet::Extension::SpaceUsedExcludingSelf() const {
int total_size = 0;
if (is_repeated) {
@ -191,9 +196,7 @@ int ExtensionSet::Extension::SpaceUsedExcludingSelf() const {
// RepeatedPtrFieldBase::SpaceUsedExcludingSelf() with a different type
// handler.
total_size += sizeof(*repeated_message_value) +
repeated_message_value->
RepeatedPtrFieldBase::SpaceUsedExcludingSelf<
GenericTypeHandler<Message> >();
RepeatedMessage_SpaceUsedExcludingSelf(repeated_message_value);
break;
}
} else {