Index: webrtc/base/mathutils.h |
diff --git a/webrtc/base/mathutils.h b/webrtc/base/mathutils.h |
index e2b21261ddbac63452134b6d16beff74cdc65120..3c70e765e1f8d0578ef8175049f6f92639df402c 100644 |
--- a/webrtc/base/mathutils.h |
+++ b/webrtc/base/mathutils.h |
@@ -12,9 +12,28 @@ |
#define WEBRTC_BASE_MATHUTILS_H_ |
#include <math.h> |
+#include <type_traits> |
+ |
+#include "webrtc/base/checks.h" |
#ifndef M_PI |
#define M_PI 3.14159265359f |
#endif |
+// Given two numbers |x| and |y| such that x >= y, computes the difference |
+// x - y without causing undefined behavior due to signed overflow. |
+template <typename T> |
+typename std::make_unsigned<T>::type unsigned_difference(T x, T y) { |
+ static_assert( |
+ std::is_signed<T>::value, |
+ "Function unsigned_difference is only meaningful for signed types."); |
+ RTC_DCHECK_GE(x, y); |
+ typedef typename std::make_unsigned<T>::type unsigned_type; |
+ // int -> unsigned conversion repeatedly adds UINT_MAX + 1 until the number |
+ // can be represented as an unsigned. Since we know that the actual |
+ // difference x - y can be represented as an unsigned, it is sufficient to |
+ // compute the difference modulo UINT_MAX + 1, i.e using unsigned arithmetic. |
+ return static_cast<unsigned_type>(x) - static_cast<unsigned_type>(y); |
+} |
+ |
#endif // WEBRTC_BASE_MATHUTILS_H_ |