aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/google/protobuf/extension_set.h
diff options
context:
space:
mode:
authorGravatar Peter Kasting <pkasting@google.com>2015-08-27 20:16:33 -0700
committerGravatar Peter Kasting <pkasting@google.com>2015-08-27 20:16:33 -0700
commit4f3bead5373decc3750f65ff35ca8785fa97ba38 (patch)
tree02fd60c302a79cec83caa5b2e93b88c2d75b2623 /src/google/protobuf/extension_set.h
parent47210ccd77c88becb9097d59b7765c2d2b41d68e (diff)
Remove a static initializer by removing a global of non-POD type.
These are banned by the Google style guide, and Chromium has a hard no-new-static-initializers policy preventing updating to a new version of libprotobuf unless this is resolved. This is the first such change, I'll need to make at least one more in the future. Luckily, the protobuf source tree already has an alternative to static initializers in once.h; use that machinery instead. I defined everything in the .cc file in a blob to replace the old implementation rather than matching the .h layout precisely; let me know if a different ordering is preferred. I also eliminated the macro that used to be used here as spelling everything out only takes one additional line, and the macro didn't actually handle all details of using a particular member variable, just the declaration, so it felt a bit error-prone.
Diffstat (limited to 'src/google/protobuf/extension_set.h')
-rw-r--r--src/google/protobuf/extension_set.h32
1 files changed, 23 insertions, 9 deletions
diff --git a/src/google/protobuf/extension_set.h b/src/google/protobuf/extension_set.h
index c371e011..35f14b9c 100644
--- a/src/google/protobuf/extension_set.h
+++ b/src/google/protobuf/extension_set.h
@@ -45,6 +45,7 @@
#include <google/protobuf/stubs/common.h>
+#include <google/protobuf/stubs/once.h>
#include <google/protobuf/repeated_field.h>
@@ -716,15 +717,14 @@ class RepeatedPrimitiveTypeTraits {
static const RepeatedFieldType* GetDefaultRepeatedField();
};
-// Declared here so that this can be friended below.
-void InitializeDefaultRepeatedFields();
-void DestroyDefaultRepeatedFields();
+LIBPROTOBUF_EXPORT extern ProtobufOnceType
+repeated_primitive_generic_type_traits_once_init_;
class LIBPROTOBUF_EXPORT RepeatedPrimitiveGenericTypeTraits {
private:
template<typename Type> friend class RepeatedPrimitiveTypeTraits;
- friend void InitializeDefaultRepeatedFields();
- friend void DestroyDefaultRepeatedFields();
+ static void InitializeDefaultRepeatedFields();
+ static void DestroyDefaultRepeatedFields();
static const RepeatedField<int32>* default_repeated_field_int32_;
static const RepeatedField<int64>* default_repeated_field_int64_;
static const RepeatedField<uint32>* default_repeated_field_uint32_;
@@ -759,6 +759,9 @@ template<> inline void RepeatedPrimitiveTypeTraits<TYPE>::Add( \
} \
template<> inline const RepeatedField<TYPE>* \
RepeatedPrimitiveTypeTraits<TYPE>::GetDefaultRepeatedField() { \
+ GoogleOnceInit( \
+ &repeated_primitive_generic_type_traits_once_init_, \
+ &RepeatedPrimitiveGenericTypeTraits::InitializeDefaultRepeatedFields); \
return RepeatedPrimitiveGenericTypeTraits:: \
default_repeated_field_##TYPE##_; \
} \
@@ -812,6 +815,9 @@ class LIBPROTOBUF_EXPORT StringTypeTraits {
}
};
+LIBPROTOBUF_EXPORT extern ProtobufOnceType
+repeated_string_type_traits_once_init_;
+
class LIBPROTOBUF_EXPORT RepeatedStringTypeTraits {
public:
typedef const string& ConstType;
@@ -855,12 +861,14 @@ class LIBPROTOBUF_EXPORT RepeatedStringTypeTraits {
}
static const RepeatedFieldType* GetDefaultRepeatedField() {
+ GoogleOnceInit(&repeated_string_type_traits_once_init_,
+ &InitializeDefaultRepeatedFields);
return default_repeated_field_;
}
private:
- friend void InitializeDefaultRepeatedFields();
- friend void DestroyDefaultRepeatedFields();
+ static void InitializeDefaultRepeatedFields();
+ static void DestroyDefaultRepeatedFields();
static const RepeatedFieldType *default_repeated_field_;
};
@@ -1019,6 +1027,9 @@ class RepeatedMessageTypeTraits {
static const RepeatedFieldType* GetDefaultRepeatedField();
};
+LIBPROTOBUF_EXPORT extern ProtobufOnceType
+repeated_message_generic_type_traits_once_init_;
+
// This class exists only to hold a generic default empty repeated field for all
// message-type repeated field extensions.
class LIBPROTOBUF_EXPORT RepeatedMessageGenericTypeTraits {
@@ -1026,14 +1037,17 @@ class LIBPROTOBUF_EXPORT RepeatedMessageGenericTypeTraits {
typedef RepeatedPtrField< ::google::protobuf::MessageLite*> RepeatedFieldType;
private:
template<typename Type> friend class RepeatedMessageTypeTraits;
- friend void InitializeDefaultRepeatedFields();
- friend void DestroyDefaultRepeatedFields();
+ static void InitializeDefaultRepeatedFields();
+ static void DestroyDefaultRepeatedFields();
static const RepeatedFieldType* default_repeated_field_;
};
template<typename Type> inline
const typename RepeatedMessageTypeTraits<Type>::RepeatedFieldType*
RepeatedMessageTypeTraits<Type>::GetDefaultRepeatedField() {
+ GoogleOnceInit(
+ &repeated_message_generic_type_traits_once_init_,
+ &RepeatedMessageGenericTypeTraits::InitializeDefaultRepeatedFields);
return reinterpret_cast<const RepeatedFieldType*>(
RepeatedMessageGenericTypeTraits::default_repeated_field_);
}