Add helper function for unsigned saturating add

pull/678/head
Jonathan G Rennison 2 months ago
parent fe730bce31
commit cc2521ddf5

@ -414,6 +414,26 @@ constexpr uint64_t PowerOfTen(int power)
return result;
}
/**
* Unsigned saturating add.
*/
template<typename T, std::enable_if_t<std::is_unsigned_v<T>, int> = 0>
constexpr inline T SaturatingAdd(T a, T b)
{
#ifdef WITH_OVERFLOW_BUILTINS
T c;
if (unlikely(__builtin_add_overflow(a, b, &c))) {
return std::numeric_limits<T>::max();
}
return c;
#else
T c = a + b;
if (c < a) return std::numeric_limits<T>::max();
return c;
#endif
}
uint32_t IntSqrt(uint32_t num);
uint32_t IntSqrt64(uint64_t num);
uint32_t IntCbrt(uint64_t num);

@ -95,3 +95,13 @@ TEST_CASE("SoftClamp")
CHECK(1250 * million == SoftClamp(0, 1500 * million, 1000 * million));
CHECK(0 == SoftClamp(0, 1500 * million, -1500 * million));
}
TEST_CASE("SaturatingAdd")
{
CHECK(SaturatingAdd<uint8_t>(2, 3) == 5);
CHECK(SaturatingAdd<uint8_t>(200, 200) == 255);
CHECK(SaturatingAdd<uint8_t>(255, 255) == 255);
CHECK(SaturatingAdd<uint8_t>(1, 255) == 255);
CHECK(SaturatingAdd<uint8_t>(255, 1) == 255);
CHECK(SaturatingAdd<uint8_t>(0, 254) == 254);
}

Loading…
Cancel
Save