Add helper function for unsigned saturating add
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user