| Index: webrtc/base/safe_compare.h
|
| diff --git a/webrtc/base/safe_compare.h b/webrtc/base/safe_compare.h
|
| index 494a0c14043a20845dc8818615d7088969bfd9e7..0350d5df81785084f2fad4b06f3543d6bc4f8867 100644
|
| --- a/webrtc/base/safe_compare.h
|
| +++ b/webrtc/base/safe_compare.h
|
| @@ -8,7 +8,7 @@
|
| * be found in the AUTHORS file in the root of the source tree.
|
| */
|
|
|
| -// This file defines six functions:
|
| +// This file defines six constexpr functions:
|
| //
|
| // rtc::safe_cmp::Eq // ==
|
| // rtc::safe_cmp::Ne // !=
|
| @@ -70,7 +70,7 @@ struct LargerInt
|
| : 0> {};
|
|
|
| template <typename T>
|
| -inline typename std::make_unsigned<T>::type MakeUnsigned(T a) {
|
| +constexpr typename std::make_unsigned<T>::type MakeUnsigned(T a) {
|
| return static_cast<typename std::make_unsigned<T>::type>(a);
|
| }
|
|
|
| @@ -80,7 +80,7 @@ template <typename Op,
|
| typename T2,
|
| typename std::enable_if<std::is_signed<T1>::value ==
|
| std::is_signed<T2>::value>::type* = nullptr>
|
| -inline bool Cmp(T1 a, T2 b) {
|
| +constexpr bool Cmp(T1 a, T2 b) {
|
| return Op::Op(a, b);
|
| }
|
|
|
| @@ -92,7 +92,7 @@ template <typename Op,
|
| typename std::enable_if<std::is_signed<T1>::value &&
|
| std::is_unsigned<T2>::value &&
|
| LargerInt<T2, T1>::value>::type* = nullptr>
|
| -inline bool Cmp(T1 a, T2 b) {
|
| +constexpr bool Cmp(T1 a, T2 b) {
|
| return Op::Op(a, static_cast<typename LargerInt<T2, T1>::type>(b));
|
| }
|
|
|
| @@ -104,7 +104,7 @@ template <typename Op,
|
| typename std::enable_if<std::is_unsigned<T1>::value &&
|
| std::is_signed<T2>::value &&
|
| LargerInt<T1, T2>::value>::type* = nullptr>
|
| -inline bool Cmp(T1 a, T2 b) {
|
| +constexpr bool Cmp(T1 a, T2 b) {
|
| return Op::Op(static_cast<typename LargerInt<T1, T2>::type>(a), b);
|
| }
|
|
|
| @@ -116,7 +116,7 @@ template <typename Op,
|
| typename std::enable_if<std::is_signed<T1>::value &&
|
| std::is_unsigned<T2>::value &&
|
| !LargerInt<T2, T1>::value>::type* = nullptr>
|
| -inline bool Cmp(T1 a, T2 b) {
|
| +constexpr bool Cmp(T1 a, T2 b) {
|
| return a < 0 ? Op::Op(-1, 0) : Op::Op(safe_cmp_impl::MakeUnsigned(a), b);
|
| }
|
|
|
| @@ -128,7 +128,7 @@ template <typename Op,
|
| typename std::enable_if<std::is_unsigned<T1>::value &&
|
| std::is_signed<T2>::value &&
|
| !LargerInt<T1, T2>::value>::type* = nullptr>
|
| -inline bool Cmp(T1 a, T2 b) {
|
| +constexpr bool Cmp(T1 a, T2 b) {
|
| return b < 0 ? Op::Op(0, -1) : Op::Op(a, safe_cmp_impl::MakeUnsigned(b));
|
| }
|
|
|
| @@ -149,19 +149,21 @@ RTC_SAFECMP_MAKE_OP(GeOp, >=)
|
|
|
| } // namespace safe_cmp_impl
|
|
|
| -#define RTC_SAFECMP_MAKE_FUN(name) \
|
| - template <typename T1, typename T2, \
|
| - typename std::enable_if<IsIntlike<T1>::value && \
|
| - IsIntlike<T2>::value>::type* = nullptr> \
|
| - inline bool name(T1 a, T2 b) { \
|
| - /* Unary plus here turns enums into real integral types. */ \
|
| - return safe_cmp_impl::Cmp<safe_cmp_impl::name##Op>(+a, +b); \
|
| - } \
|
| - template <typename T1, typename T2, \
|
| - typename std::enable_if<!IsIntlike<T1>::value || \
|
| - !IsIntlike<T2>::value>::type* = nullptr> \
|
| - inline bool name(T1&& a, T2&& b) { \
|
| - return safe_cmp_impl::name##Op::Op(a, b); \
|
| +#define RTC_SAFECMP_MAKE_FUN(name) \
|
| + template <typename T1, typename T2> \
|
| + constexpr \
|
| + typename std::enable_if<IsIntlike<T1>::value && IsIntlike<T2>::value, \
|
| + bool>::type \
|
| + name(T1 a, T2 b) { \
|
| + /* Unary plus here turns enums into real integral types. */ \
|
| + return safe_cmp_impl::Cmp<safe_cmp_impl::name##Op>(+a, +b); \
|
| + } \
|
| + template <typename T1, typename T2> \
|
| + constexpr \
|
| + typename std::enable_if<!IsIntlike<T1>::value || !IsIntlike<T2>::value, \
|
| + bool>::type \
|
| + name(const T1& a, const T2& b) { \
|
| + return safe_cmp_impl::name##Op::Op(a, b); \
|
| }
|
| RTC_SAFECMP_MAKE_FUN(Eq)
|
| RTC_SAFECMP_MAKE_FUN(Ne)
|
|
|