Adding support for enum class in RTC_CHECK and RTC_LOG.
Enum class types are by design not convertible to arithmetic types.
As a result they are currently not supported in RTC_CHECK and RTC_LOG.
The current workaround was to use something like RTC_CHECK(v1 == v2)
instead of RTC_CHECK_EQ(v1, v2).
This change adds support for any enum class type by converting it to the
underlying type.
Bug: webrtc:10418
Change-Id: I59e6608e6a97a4cc007c903f8e021a58d4c49ff8
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/128202
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Commit-Queue: Amit Hilbuch <amithi@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27166}
diff --git a/rtc_base/logging.h b/rtc_base/logging.h
index 5cd4f72..3f48eeb 100644
--- a/rtc_base/logging.h
+++ b/rtc_base/logging.h
@@ -248,6 +248,16 @@
return {x};
}
+// The enum class types are not implicitly convertible to arithmetic types.
+template <
+ typename T,
+ typename std::enable_if<std::is_enum<T>::value &&
+ !std::is_arithmetic<T>::value>::type* = nullptr>
+inline decltype(MakeVal(std::declval<typename std::underlying_type<T>::type>()))
+MakeVal(T x) {
+ return {static_cast<typename std::underlying_type<T>::type>(x)};
+}
+
#ifdef WEBRTC_ANDROID
inline Val<LogArgType::kLogMetadataTag, LogMetadataTag> MakeVal(
const LogMetadataTag& x) {
@@ -285,18 +295,18 @@
template <>
class LogStreamer<> final {
public:
- template <
- typename U,
- typename std::enable_if<std::is_arithmetic<U>::value>::type* = nullptr>
+ template <typename U,
+ typename std::enable_if<std::is_arithmetic<U>::value ||
+ std::is_enum<U>::value>::type* = nullptr>
RTC_FORCE_INLINE LogStreamer<decltype(MakeVal(std::declval<U>()))> operator<<(
U arg) const {
return LogStreamer<decltype(MakeVal(std::declval<U>()))>(MakeVal(arg),
this);
}
- template <
- typename U,
- typename std::enable_if<!std::is_arithmetic<U>::value>::type* = nullptr>
+ template <typename U,
+ typename std::enable_if<!std::is_arithmetic<U>::value &&
+ !std::is_enum<U>::value>::type* = nullptr>
RTC_FORCE_INLINE LogStreamer<decltype(MakeVal(std::declval<U>()))> operator<<(
const U& arg) const {
return LogStreamer<decltype(MakeVal(std::declval<U>()))>(MakeVal(arg),
@@ -318,18 +328,18 @@
RTC_FORCE_INLINE LogStreamer(T arg, const LogStreamer<Ts...>* prior)
: arg_(arg), prior_(prior) {}
- template <
- typename U,
- typename std::enable_if<std::is_arithmetic<U>::value>::type* = nullptr>
+ template <typename U,
+ typename std::enable_if<std::is_arithmetic<U>::value ||
+ std::is_enum<U>::value>::type* = nullptr>
RTC_FORCE_INLINE LogStreamer<decltype(MakeVal(std::declval<U>())), T, Ts...>
operator<<(U arg) const {
return LogStreamer<decltype(MakeVal(std::declval<U>())), T, Ts...>(
MakeVal(arg), this);
}
- template <
- typename U,
- typename std::enable_if<!std::is_arithmetic<U>::value>::type* = nullptr>
+ template <typename U,
+ typename std::enable_if<!std::is_arithmetic<U>::value &&
+ !std::is_enum<U>::value>::type* = nullptr>
RTC_FORCE_INLINE LogStreamer<decltype(MakeVal(std::declval<U>())), T, Ts...>
operator<<(const U& arg) const {
return LogStreamer<decltype(MakeVal(std::declval<U>())), T, Ts...>(