Make {add,sub,mul}_will_overflow more compiler-independent
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
26b44e651d
commit
1fa99f4f64
@ -1,21 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <luna/Result.h>
|
#include <luna/Result.h>
|
||||||
|
|
||||||
template <typename T> constexpr bool add_will_overflow(T a, T b)
|
|
||||||
{
|
|
||||||
return __builtin_add_overflow_p(a, b, (T)0);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T> constexpr bool sub_will_overflow(T a, T b)
|
|
||||||
{
|
|
||||||
return __builtin_sub_overflow_p(a, b, (T)0);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T> constexpr bool mul_will_overflow(T a, T b)
|
|
||||||
{
|
|
||||||
return __builtin_mul_overflow_p(a, b, (T)0);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T> Result<T> safe_add(T a, T b)
|
template <typename T> Result<T> safe_add(T a, T b)
|
||||||
{
|
{
|
||||||
T result;
|
T result;
|
||||||
@ -41,4 +26,31 @@ template <typename T> Result<T> safe_mul(T a, T b)
|
|||||||
if (__builtin_mul_overflow(a, b, &result)) return err(EOVERFLOW);
|
if (__builtin_mul_overflow(a, b, &result)) return err(EOVERFLOW);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T> bool add_will_overflow(T a, T b)
|
||||||
|
{
|
||||||
|
#ifdef __GNUC__
|
||||||
|
return __builtin_add_overflow_p(a, b, (T)0);
|
||||||
|
#else
|
||||||
|
return safe_add(a, b).has_error();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T> bool sub_will_overflow(T a, T b)
|
||||||
|
{
|
||||||
|
#ifdef __GNUC__
|
||||||
|
return __builtin_sub_overflow_p(a, b, (T)0);
|
||||||
|
#else
|
||||||
|
return safe_sub(a, b).has_error();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T> bool mul_will_overflow(T a, T b)
|
||||||
|
{
|
||||||
|
#ifdef __GNUC__
|
||||||
|
return __builtin_mul_overflow_p(a, b, (T)0);
|
||||||
|
#else
|
||||||
|
return safe_mul(a, b).has_error();
|
||||||
|
#endif
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user