#pragma once
#include <cstddef>
#include <stdexcept>
#define REQUIRE(x) \
do { \
if (!(x)) { \
throw std::runtime_error(#x); \
} \
} while (0)
namespace risc0 {
inline size_t constexpr ceilDiv(size_t a, size_t b) {
return (a + (b - 1)) / b;
}
inline size_t constexpr roundUp(size_t a, size_t b) {
return ceilDiv(a, b) * b;
}
inline size_t constexpr nearestPoX(size_t in, size_t x) {
size_t r = 1;
while (r < in) {
r *= x;
}
return r;
}
inline size_t constexpr nearestPo2(size_t in) {
size_t r = 1;
while (r < in) {
r *= 2;
}
return r;
}
inline size_t constexpr logXCeil(size_t in, size_t x) {
size_t r = 0;
size_t c = 1;
while (c < in) {
r++;
c *= x;
}
return r;
}
inline size_t constexpr log2Ceil(size_t in) {
size_t r = 0;
while ((size_t(1) << r) < in) {
r++;
}
return r;
}
inline bool constexpr isPo2(size_t in) {
return (size_t(1) << log2Ceil(in)) == in;
}
}