Use template instantiation declaration/definition for RTCStatsMember<T>.
This CL works around an "Explicit specialization after instantiation
error" when building with clang-cl and is_component_build=true (see
crbug.com/1018579). On top of that it uses "template instantiation
declarations/declarations" in order to avoid to instantiate the
template in clients code.
TBR: hbos@webrtc.org
Bug: webrtc:9419, chromium:1018579
Change-Id: I1b2862de678586afc81e8f7a407947322f8a06c4
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/158795
Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Yves Gerey <yvesg@google.com>
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29683}
diff --git a/stats/rtc_stats.cc b/stats/rtc_stats.cc
index f5139a7..92f64e4 100644
--- a/stats/rtc_stats.cc
+++ b/stats/rtc_stats.cc
@@ -128,8 +128,9 @@
#define WEBRTC_DEFINE_RTCSTATSMEMBER(T, type, is_seq, is_str, to_str, to_json) \
template <> \
- const RTCStatsMemberInterface::Type RTCStatsMember<T>::kType = \
- RTCStatsMemberInterface::type; \
+ RTCStatsMemberInterface::Type RTCStatsMember<T>::StaticType() { \
+ return type; \
+ } \
template <> \
bool RTCStatsMember<T>::is_sequence() const { \
return is_seq; \
@@ -147,86 +148,87 @@
std::string RTCStatsMember<T>::ValueToJson() const { \
RTC_DCHECK(is_defined_); \
return to_json; \
- }
+ } \
+ template class RTC_EXPORT_TEMPLATE_DEFINE(RTC_EXPORT) RTCStatsMember<T>
WEBRTC_DEFINE_RTCSTATSMEMBER(bool,
kBool,
false,
false,
rtc::ToString(value_),
- rtc::ToString(value_))
+ rtc::ToString(value_));
WEBRTC_DEFINE_RTCSTATSMEMBER(int32_t,
kInt32,
false,
false,
rtc::ToString(value_),
- rtc::ToString(value_))
+ rtc::ToString(value_));
WEBRTC_DEFINE_RTCSTATSMEMBER(uint32_t,
kUint32,
false,
false,
rtc::ToString(value_),
- rtc::ToString(value_))
+ rtc::ToString(value_));
WEBRTC_DEFINE_RTCSTATSMEMBER(int64_t,
kInt64,
false,
false,
rtc::ToString(value_),
- ToStringAsDouble(value_))
+ ToStringAsDouble(value_));
WEBRTC_DEFINE_RTCSTATSMEMBER(uint64_t,
kUint64,
false,
false,
rtc::ToString(value_),
- ToStringAsDouble(value_))
+ ToStringAsDouble(value_));
WEBRTC_DEFINE_RTCSTATSMEMBER(double,
kDouble,
false,
false,
rtc::ToString(value_),
- ToStringAsDouble(value_))
-WEBRTC_DEFINE_RTCSTATSMEMBER(std::string, kString, false, true, value_, value_)
+ ToStringAsDouble(value_));
+WEBRTC_DEFINE_RTCSTATSMEMBER(std::string, kString, false, true, value_, value_);
WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<bool>,
kSequenceBool,
true,
false,
VectorToString(value_),
- VectorToString(value_))
+ VectorToString(value_));
WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<int32_t>,
kSequenceInt32,
true,
false,
VectorToString(value_),
- VectorToString(value_))
+ VectorToString(value_));
WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<uint32_t>,
kSequenceUint32,
true,
false,
VectorToString(value_),
- VectorToString(value_))
+ VectorToString(value_));
WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<int64_t>,
kSequenceInt64,
true,
false,
VectorToString(value_),
- VectorToStringAsDouble(value_))
+ VectorToStringAsDouble(value_));
WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<uint64_t>,
kSequenceUint64,
true,
false,
VectorToString(value_),
- VectorToStringAsDouble(value_))
+ VectorToStringAsDouble(value_));
WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<double>,
kSequenceDouble,
true,
false,
VectorToString(value_),
- VectorToStringAsDouble(value_))
+ VectorToStringAsDouble(value_));
WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<std::string>,
kSequenceString,
true,
false,
VectorOfStringsToString(value_),
- VectorOfStringsToString(value_))
+ VectorOfStringsToString(value_));
} // namespace webrtc