diff --git a/src/openrct2/common.h b/src/openrct2/common.h index 1af006ac29..71e0267300 100644 --- a/src/openrct2/common.h +++ b/src/openrct2/common.h @@ -25,6 +25,7 @@ #include #include #include +#include using namespace Numerics; @@ -50,11 +51,26 @@ const constexpr auto ror32 = ror; const constexpr auto rol64 = rol; const constexpr auto ror64 = ror; +constexpr bool is_power_of_2(int v) +{ + return v && ((v & (v - 1)) == 0); +} + // Rounds an integer down to the given power of 2. y must be a power of 2. -#define floor2(x, y) ((x) & (~((y)-1))) +constexpr int floor2(const int x, const int y) +{ + if (!is_power_of_2(y)) + throw std::logic_error("floor2 should only operate on power of 2"); + return x & ~(y - 1); +} // Rounds an integer up to the given power of 2. y must be a power of 2. -#define ceil2(x, y) (((x) + (y)-1) & (~((y)-1))) +constexpr int ceil2(const int x, const int y) +{ + if (!is_power_of_2(y)) + throw std::logic_error("ceil2 should only operate on power of 2"); + return (x + y - 1) & ~(y - 1); +} // Gets the name of a symbol as a C string #define nameof(symbol) #symbol