OpenTTD Source: src/core/math_func.hpp Source File

OpenTTD Source 13.1

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 constexpr inline bool IsInsideMM(const T x, const size_t min, const size_t max) noexcept
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 */
IsInsideMM
static constexpr bool IsInsideMM(const T x, const size_t min, const size_t max) noexcept
Checks if a value is in an interval.
Definition: math_func.hpp:204
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
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