OpenTTD Source  12.0-beta2
math_func.hpp
Go to the documentation of this file.
1 /*
2  * This file is part of OpenTTD.
3  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6  */
7 
10 #ifndef MATH_FUNC_HPP
11 #define MATH_FUNC_HPP
12 
20 template <typename T>
21 static inline T abs(const T a)
22 {
23  return (a < (T)0) ? -a : a;
24 }
25 
34 template <typename T>
35 static inline T Align(const T x, uint n)
36 {
37  assert((n & (n - 1)) == 0 && n != 0);
38  n--;
39  return (T)((x + n) & ~((T)n));
40 }
41 
52 template <typename T>
53 static inline T *AlignPtr(T *x, uint n)
54 {
55  static_assert(sizeof(size_t) == sizeof(void *));
56  return reinterpret_cast<T *>(Align((size_t)x, n));
57 }
58 
76 template <typename T>
77 static inline T Clamp(const T a, const T min, const T max)
78 {
79  assert(min <= max);
80  if (a <= min) return min;
81  if (a >= max) return max;
82  return a;
83 }
84 
101 static inline int Clamp(const int a, const int min, const int max)
102 {
103  return Clamp<int>(a, min, max);
104 }
105 
122 static inline uint ClampU(const uint a, const uint min, const uint max)
123 {
124  return Clamp<uint>(a, min, max);
125 }
126 
141 static inline int32 ClampToI32(const int64 a)
142 {
143  return static_cast<int32>(Clamp<int64>(a, INT32_MIN, INT32_MAX));
144 }
145 
153 static inline uint16 ClampToU16(const uint64 a)
154 {
155  /* MSVC thinks, in its infinite wisdom, that int min(int, int) is a better
156  * match for min(uint64, uint) than uint64 min(uint64, uint64). As such we
157  * need to cast the UINT16_MAX to prevent MSVC from displaying its
158  * infinite loads of warnings. */
159  return static_cast<uint16>(std::min(a, static_cast<uint64>(UINT16_MAX)));
160 }
161 
169 template <typename T>
170 static inline T Delta(const T a, const T b)
171 {
172  return (a < b) ? b - a : a - b;
173 }
174 
187 template <typename T>
188 static inline bool IsInsideBS(const T x, const size_t base, const size_t size)
189 {
190  return (size_t)(x - base) < size;
191 }
192 
203 template <typename T>
204 static inline bool IsInsideMM(const T x, const size_t min, const size_t max)
205 {
206  return (size_t)(x - min) < (max - min);
207 }
208 
214 template <typename T>
215 static inline void Swap(T &a, T &b)
216 {
217  T t = a;
218  a = b;
219  b = t;
220 }
221 
227 static inline uint ToPercent8(uint i)
228 {
229  assert(i < 256);
230  return i * 101 >> 8;
231 }
232 
238 static inline uint ToPercent16(uint i)
239 {
240  assert(i < 65536);
241  return i * 101 >> 16;
242 }
243 
244 int LeastCommonMultiple(int a, int b);
245 int GreatestCommonDivisor(int a, int b);
246 int DivideApprox(int a, int b);
247 
254 static inline uint CeilDiv(uint a, uint b)
255 {
256  return (a + b - 1) / b;
257 }
258 
265 static inline uint Ceil(uint a, uint b)
266 {
267  return CeilDiv(a, b) * b;
268 }
269 
276 static inline int RoundDivSU(int a, uint b)
277 {
278  if (a > 0) {
279  /* 0.5 is rounded to 1 */
280  return (a + static_cast<int>(b) / 2) / static_cast<int>(b);
281  } else {
282  /* -0.5 is rounded to 0 */
283  return (a - (static_cast<int>(b) - 1) / 2) / static_cast<int>(b);
284  }
285 }
286 
293 static inline int DivAwayFromZero(int a, uint b)
294 {
295  const int _b = static_cast<int>(b);
296  if (a > 0) {
297  return (a + _b - 1) / _b;
298  } else {
299  /* Note: Behaviour of negative numerator division is truncation toward zero. */
300  return (a - _b + 1) / _b;
301  }
302 }
303 
304 uint32 IntSqrt(uint32 num);
305 
306 #endif /* MATH_FUNC_HPP */
ClampToI32
static int32 ClampToI32(const int64 a)
Reduce a signed 64-bit int to a signed 32-bit one.
Definition: math_func.hpp:141
ToPercent8
static uint ToPercent8(uint i)
Converts a "fract" value 0..255 to "percent" value 0..100.
Definition: math_func.hpp:227
ClampU
static uint ClampU(const uint a, const uint min, const uint max)
Clamp an unsigned integer between an interval.
Definition: math_func.hpp:122
IsInsideMM
static bool IsInsideMM(const T x, const size_t min, const size_t max)
Checks if a value is in an interval.
Definition: math_func.hpp:204
LeastCommonMultiple
int LeastCommonMultiple(int a, int b)
Compute least common multiple (lcm) of arguments a and b, the smallest integer value that is a multip...
Definition: math_func.cpp:24
Align
static T Align(const T x, uint n)
Return the smallest multiple of n equal or greater than x.
Definition: math_func.hpp:35
IsInsideBS
static bool IsInsideBS(const T x, const size_t base, const size_t size)
Checks if a value is between a window started at some base point.
Definition: math_func.hpp:188
DivAwayFromZero
static int DivAwayFromZero(int a, uint b)
Computes (a / b) rounded away from zero.
Definition: math_func.hpp:293
RoundDivSU
static int RoundDivSU(int a, uint b)
Computes round(a / b) for signed a and unsigned b.
Definition: math_func.hpp:276
Clamp
static T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition: math_func.hpp:77
IntSqrt
uint32 IntSqrt(uint32 num)
Compute the integer square root.
Definition: math_func.cpp:77
abs
static T abs(const T a)
Returns the absolute value of (scalar) variable.
Definition: math_func.hpp:21
Ceil
static uint Ceil(uint a, uint b)
Computes ceil(a / b) * b for non-negative a and b.
Definition: math_func.hpp:265
ToPercent16
static uint ToPercent16(uint i)
Converts a "fract" value 0..65535 to "percent" value 0..100.
Definition: math_func.hpp:238
ClampToU16
static uint16 ClampToU16(const uint64 a)
Reduce an unsigned 64-bit int to an unsigned 16-bit one.
Definition: math_func.hpp:153
CeilDiv
static uint CeilDiv(uint a, uint b)
Computes ceil(a / b) for non-negative a and b.
Definition: math_func.hpp:254
GreatestCommonDivisor
int GreatestCommonDivisor(int a, int b)
Compute greatest common divisor (gcd) of a and b.
Definition: math_func.cpp:39
Swap
static void Swap(T &a, T &b)
Type safe swap operation.
Definition: math_func.hpp:215
AlignPtr
static T * AlignPtr(T *x, uint n)
Return the smallest multiple of n equal or greater than x Applies to pointers only.
Definition: math_func.hpp:53
Delta
static T Delta(const T a, const T b)
Returns the (absolute) difference between two (scalar) variables.
Definition: math_func.hpp:170
DivideApprox
int DivideApprox(int a, int b)
Deterministic approximate division.
Definition: math_func.cpp:57