8#include "third_party/abseil-cpp/absl/numeric/int128.h"
13 return sizeof(size_t) ==
sizeof(uint64_t) ? mul64(
x,
y) : mul32(
x,
y);
16uint32_t SafeMath::mul32(uint32_t
x, uint32_t
y) {
19 uint64_t result = big_x * big_y;
21 overflow_detected_ =
true;
23 return static_cast<uint32_t
>(result);
26uint64_t SafeMath::mul64(uint64_t
x, uint64_t
y) {
27 if (
x <= std::numeric_limits<uint32_t>::max() &&
28 y <= std::numeric_limits<uint32_t>::max()) {
32 absl::uint128 big_x =
x;
33 absl::uint128 big_y =
y;
34 absl::uint128 result = big_x * big_y;
35 if (absl::Uint128High64(result)) {
36 overflow_detected_ =
true;
38 return absl::Uint128Low64(result);
size_t mul(size_t x, size_t y)