/* * Copyright 2005 The WebRTC Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #ifndef RTC_BASE_NUMERICS_MATHUTILS_H_ #define RTC_BASE_NUMERICS_MATHUTILS_H_ #include #include #include "rtc_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 std::make_unsigned::type unsigned_difference(T x, T y) { static_assert( std::is_signed::value, "Function unsigned_difference is only meaningful for signed types."); RTC_DCHECK_GE(x, y); typedef typename std::make_unsigned::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(x) - static_cast(y); } #endif // RTC_BASE_NUMERICS_MATHUTILS_H_