diff options
author | MarcoFalke <falke.marco@gmail.com> | 2022-02-01 13:43:42 +0100 |
---|---|---|
committer | MarcoFalke <falke.marco@gmail.com> | 2022-02-21 14:32:53 +0100 |
commit | faa7d8a3f7cba02eca7e247108a6b98ea9daf373 (patch) | |
tree | 8826fb85e35da9fb2bee74a5da27cbf39b0c1b2a /src/util/overflow.h | |
parent | 1337b93f50d9874fa3bce7c0b5bb141aad9b1c49 (diff) | |
download | bitcoin-faa7d8a3f7cba02eca7e247108a6b98ea9daf373.tar.xz |
util: Add SaturatingAdd helper
Diffstat (limited to 'src/util/overflow.h')
-rw-r--r-- | src/util/overflow.h | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/util/overflow.h b/src/util/overflow.h index c70a8b663e..6b7dd1e8fd 100644 --- a/src/util/overflow.h +++ b/src/util/overflow.h @@ -13,7 +13,7 @@ template <class T> [[nodiscard]] bool AdditionOverflow(const T i, const T j) noexcept { static_assert(std::is_integral<T>::value, "Integral required."); - if (std::numeric_limits<T>::is_signed) { + if constexpr (std::numeric_limits<T>::is_signed) { return (i > 0 && j > std::numeric_limits<T>::max() - i) || (i < 0 && j < std::numeric_limits<T>::min() - i); } @@ -29,4 +29,22 @@ template <class T> return i + j; } +template <class T> +[[nodiscard]] T SaturatingAdd(const T i, const T j) noexcept +{ + if constexpr (std::numeric_limits<T>::is_signed) { + if (i > 0 && j > std::numeric_limits<T>::max() - i) { + return std::numeric_limits<T>::max(); + } + if (i < 0 && j < std::numeric_limits<T>::min() - i) { + return std::numeric_limits<T>::min(); + } + } else { + if (std::numeric_limits<T>::max() - i < j) { + return std::numeric_limits<T>::max(); + } + } + return i + j; +} + #endif // BITCOIN_UTIL_OVERFLOW_H |