diff options
author | liamwhite <liamwhite@users.noreply.github.com> | 2024-01-26 09:55:25 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-26 09:55:25 -0500 |
commit | 55482ab5dce463d5014498b006c18a90d0d004e6 (patch) | |
tree | b343faa9cadc692265efb4b6b88e157c97ef76d2 /src/common/overflow.h | |
parent | 4526fdaf642d092ce1a6f5b1da4adf5eb4793005 (diff) | |
parent | 975deb7528cd98460528553f6a9162bfbcd6cab1 (diff) |
Merge pull request #12707 from FearlessTobi/fs-housekeeping
fs: Various cleanups & add path class for later use
Diffstat (limited to 'src/common/overflow.h')
-rw-r--r-- | src/common/overflow.h | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/common/overflow.h b/src/common/overflow.h index 44d8e7e73..e184ead95 100644 --- a/src/common/overflow.h +++ b/src/common/overflow.h @@ -3,6 +3,7 @@ #pragma once +#include <algorithm> #include <type_traits> #include "bit_cast.h" @@ -19,4 +20,21 @@ inline T WrappingAdd(T lhs, T rhs) { return BitCast<T>(lhs_u + rhs_u); } +template <typename T> + requires(std::is_integral_v<T> && std::is_signed_v<T>) +inline bool CanAddWithoutOverflow(T lhs, T rhs) { +#ifdef _MSC_VER + if (lhs >= 0 && rhs >= 0) { + return WrappingAdd(lhs, rhs) >= std::max(lhs, rhs); + } else if (lhs < 0 && rhs < 0) { + return WrappingAdd(lhs, rhs) <= std::min(lhs, rhs); + } else { + return true; + } +#else + T res; + return !__builtin_add_overflow(lhs, rhs, &res); +#endif +} + } // namespace Common |