ソースを参照

Fix compile for GCC 3.4.4.

kenton@google.com 16 年 前
コミット
1900c536cd

+ 10 - 0
src/google/protobuf/extension_set.h

@@ -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

+ 6 - 3
src/google/protobuf/extension_set_heavy.cc

@@ -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 {