| Index: webrtc/base/type_traits.h
|
| diff --git a/webrtc/base/type_traits.h b/webrtc/base/type_traits.h
|
| index d6a6c37334602d21111a2fe60f1204d8f90f5e41..a57bead6c18899123814739788fc036f0bcd92d0 100644
|
| --- a/webrtc/base/type_traits.h
|
| +++ b/webrtc/base/type_traits.h
|
| @@ -72,6 +72,69 @@ static_assert(!HasDataAndSize<Test4, int>::value,
|
|
|
| } // namespace test_has_data_and_size
|
|
|
| +namespace type_traits_impl {
|
| +
|
| +// Determines if the given type is an enum that converts implicitly to
|
| +// an integral type.
|
| +template <typename T>
|
| +struct IsIntEnum {
|
| + private:
|
| + // This overload is used if the type is an enum, and unary plus
|
| + // compiles and turns it into an integral type.
|
| + template <typename X,
|
| + typename std::enable_if<
|
| + std::is_enum<X>::value &&
|
| + std::is_integral<decltype(+std::declval<X>())>::value>::type* =
|
| + nullptr>
|
| + static int Test(int);
|
| +
|
| + // Otherwise, this overload is used.
|
| + template <typename>
|
| + static char Test(...);
|
| +
|
| + public:
|
| + static constexpr bool value =
|
| + std::is_same<decltype(Test<typename std::remove_reference<T>::type>(0)),
|
| + int>::value;
|
| +};
|
| +
|
| +} // namespace type_traits_impl
|
| +
|
| +// Determines if the given type is integral, or an enum that
|
| +// converts implicitly to an integral type.
|
| +template <typename T>
|
| +struct IsIntlike {
|
| + private:
|
| + using X = typename std::remove_reference<T>::type;
|
| +
|
| + public:
|
| + static constexpr bool value =
|
| + std::is_integral<X>::value || type_traits_impl::IsIntEnum<X>::value;
|
| +};
|
| +
|
| +namespace test_enum_intlike {
|
| +
|
| +enum E1 { e1 };
|
| +enum { e2 };
|
| +enum class E3 { e3 };
|
| +struct S {};
|
| +
|
| +static_assert(type_traits_impl::IsIntEnum<E1>::value, "");
|
| +static_assert(type_traits_impl::IsIntEnum<decltype(e2)>::value, "");
|
| +static_assert(!type_traits_impl::IsIntEnum<E3>::value, "");
|
| +static_assert(!type_traits_impl::IsIntEnum<int>::value, "");
|
| +static_assert(!type_traits_impl::IsIntEnum<float>::value, "");
|
| +static_assert(!type_traits_impl::IsIntEnum<S>::value, "");
|
| +
|
| +static_assert(IsIntlike<E1>::value, "");
|
| +static_assert(IsIntlike<decltype(e2)>::value, "");
|
| +static_assert(!IsIntlike<E3>::value, "");
|
| +static_assert(IsIntlike<int>::value, "");
|
| +static_assert(!IsIntlike<float>::value, "");
|
| +static_assert(!IsIntlike<S>::value, "");
|
| +
|
| +} // test_enum_intlike
|
| +
|
| } // namespace rtc
|
|
|
| #endif // WEBRTC_BASE_TYPE_TRAITS_H_
|
|
|