diff --git a/webrtc/base/safe_minmax.h b/webrtc/base/safe_minmax.h index 8d1fc8776f..16638efc61 100644 --- a/webrtc/base/safe_minmax.h +++ b/webrtc/base/safe_minmax.h @@ -153,13 +153,15 @@ struct TypeOr { } // namespace safe_minmax_impl -template ::min_t>::type>::type> +template < + typename R = safe_minmax_impl::DefaultType, + typename T1 = safe_minmax_impl::DefaultType, + typename T2 = safe_minmax_impl::DefaultType, + typename R2 = typename safe_minmax_impl::TypeOr< + R, + typename safe_minmax_impl::MType< + typename safe_minmax_impl::UnderlyingType::type, + typename safe_minmax_impl::UnderlyingType::type>::min_t>::type> constexpr R2 SafeMin(T1 a, T2 b) { static_assert(IsIntlike::value || std::is_floating_point::value, "The first argument must be integral or floating-point"); @@ -168,13 +170,15 @@ constexpr R2 SafeMin(T1 a, T2 b) { return safe_cmp::Lt(a, b) ? static_cast(a) : static_cast(b); } -template ::max_t>::type>::type> +template < + typename R = safe_minmax_impl::DefaultType, + typename T1 = safe_minmax_impl::DefaultType, + typename T2 = safe_minmax_impl::DefaultType, + typename R2 = typename safe_minmax_impl::TypeOr< + R, + typename safe_minmax_impl::MType< + typename safe_minmax_impl::UnderlyingType::type, + typename safe_minmax_impl::UnderlyingType::type>::max_t>::type> constexpr R2 SafeMax(T1 a, T2 b) { static_assert(IsIntlike::value || std::is_floating_point::value, "The first argument must be integral or floating-point"); diff --git a/webrtc/base/safe_minmax_unittest.cc b/webrtc/base/safe_minmax_unittest.cc index 6fcbf00332..519158b6ed 100644 --- a/webrtc/base/safe_minmax_unittest.cc +++ b/webrtc/base/safe_minmax_unittest.cc @@ -62,12 +62,19 @@ static_assert(TypeCheckMinMax(), ""); static_assert(TypeCheckMinMax(), ""); static_assert(TypeCheckMinMax(), ""); -// SafeMin/SafeMax: Check that we can use enum types. enum DefaultE { kFoo = -17 }; enum UInt8E : uint8_t { kBar = 17 }; -static_assert(TypeCheckMinMax(), ""); -static_assert(TypeCheckMinMax(), ""); -static_assert(TypeCheckMinMax(), ""); + +// SafeMin/SafeMax: Check that we can use enum types. +static_assert(TypeCheckMinMax(), ""); +static_assert(TypeCheckMinMax(), ""); +static_assert(TypeCheckMinMax(), ""); +static_assert(TypeCheckMinMax(), ""); +static_assert(TypeCheckMinMax(), ""); +static_assert(TypeCheckMinMax(), ""); +static_assert(TypeCheckMinMax< UInt8E, unsigned, uint8_t, unsigned>(), ""); +static_assert(TypeCheckMinMax< UInt8E, DefaultE, int, int>(), ""); +static_assert(TypeCheckMinMax< UInt8E, UInt8E, uint8_t, uint8_t>(), ""); using ld = long double;