Add helper function for unsigned saturating add
This commit is contained in:
@@ -414,6 +414,26 @@ constexpr uint64_t PowerOfTen(int power)
|
|||||||
return result;
|
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 IntSqrt(uint32_t num);
|
||||||
uint32_t IntSqrt64(uint64_t num);
|
uint32_t IntSqrt64(uint64_t num);
|
||||||
uint32_t IntCbrt(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(1250 * million == SoftClamp(0, 1500 * million, 1000 * million));
|
||||||
CHECK(0 == SoftClamp(0, 1500 * million, -1500 * 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