#pragma once #include #include inline constexpr uint32_t next_pow_2(uint32_t const num) { if (num <= 1) return num; return 1 << (CHAR_BIT * sizeof(num) - __builtin_clz(num - 1)); } template static inline constexpr auto div_ceil(A a, B b) { return (a + b - 1) / b; } // Round a down to the next multiple of b. The caller is responsible for making // sure that b is non-zero template inline constexpr T round_to_previous_multiple_of(T a, T b) { return a % b == 0 ? a : (a / b) * b; } // Round a up to the next multiple of b. The caller is responsible for making // sure that b is non-zero template inline constexpr T round_to_next_multiple_of(T a, T b) { return a % b == 0 ? a : ((a / b) + 1) * b; }