22 inline size_t mul(
size_t a,
size_t b)
26 if (SUCCEEDED(SIZETMult(a, b, &result)))
28#elif defined(_MSC_VER)
31 if (b <= SIZE_MAX / a)
35 if (!__builtin_mul_overflow(a, b, &result))
38 throw std::invalid_argument(
"multiply overflow");
49 inline size_t add(
size_t a,
size_t b)
53 if (SUCCEEDED(SIZETAdd(a, b, &result)))
55#elif defined(_MSC_VER)
56 if (a <= SIZE_MAX - b)
60 if (!__builtin_add_overflow(a, b, &result))
63 throw std::invalid_argument(
"add overflow");
75 inline uint32_t rol(_In_ uint32_t value, _In_
int bits)
78 return _rotl(value, bits);
80 return (value << bits) | (value >> (32 - bits));