16inline std::uint64_t
checked_add(std::uint64_t a, std::uint64_t b,
const char* what =
"add") {
17 if (a > UINT64_MAX - b) {
19 std::string(
"size arithmetic overflow (") + what +
")");
24inline std::uint64_t
checked_mul(std::uint64_t a, std::uint64_t b,
const char* what =
"mul") {
25 if (a != 0 && b > UINT64_MAX / a) {
27 std::string(
"size arithmetic overflow (") + what +
")");
34inline std::uint64_t
ceil_div(std::uint64_t a, std::uint64_t b) {
38 return a / b + (a % b != 0 ? 1 : 0);
Every failure the library reports is one of these.
std::uint64_t checked_mul(std::uint64_t a, std::uint64_t b, const char *what="mul")
std::uint64_t range_end(std::uint64_t offset, std::uint64_t length)
End of a range, checked.
void require_within(std::uint64_t offset, std::uint64_t length, std::uint64_t limit, const char *what)
Throws unless [offset, offset+length) lies wholly within limit.
std::uint64_t checked_add(std::uint64_t a, std::uint64_t b, const char *what="add")
std::uint64_t ceil_div(std::uint64_t a, std::uint64_t b)
ceil(a / b) without the (a + b - 1) overflow hazard.