diff options
Diffstat (limited to 'runtime/interpreter/safe_math.h')
-rw-r--r-- | runtime/interpreter/safe_math.h | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/runtime/interpreter/safe_math.h b/runtime/interpreter/safe_math.h index 06f046a7be..25a9353bc0 100644 --- a/runtime/interpreter/safe_math.h +++ b/runtime/interpreter/safe_math.h @@ -26,16 +26,18 @@ namespace interpreter { // Declares a type which is the larger in bit size of the two template parameters. template <typename T1, typename T2> struct select_bigger { - typedef typename std::conditional<sizeof(T1) >= sizeof(T2), T1, T2>::type type; + using type = std::conditional_t<sizeof(T1) >= sizeof(T2), T1, T2>; }; +template <typename T1, typename T2> +using select_bigger_t = typename select_bigger<T1, T2>::type; // Perform signed arithmetic Op on 'a' and 'b' with defined wrapping behavior. template<template <typename OpT> class Op, typename T1, typename T2> -static inline typename select_bigger<T1, T2>::type SafeMath(T1 a, T2 b) { - typedef typename select_bigger<T1, T2>::type biggest_T; - typedef typename std::make_unsigned<biggest_T>::type unsigned_biggest_T; - static_assert(std::is_signed<T1>::value, "Expected T1 to be signed"); - static_assert(std::is_signed<T2>::value, "Expected T2 to be signed"); +static inline select_bigger_t<T1, T2> SafeMath(T1 a, T2 b) { + using biggest_T = select_bigger_t<T1, T2>; + using unsigned_biggest_T = std::make_unsigned_t<biggest_T>; + static_assert(std::is_signed_v<T1>, "Expected T1 to be signed"); + static_assert(std::is_signed_v<T2>, "Expected T2 to be signed"); unsigned_biggest_T val1 = static_cast<unsigned_biggest_T>(static_cast<biggest_T>(a)); unsigned_biggest_T val2 = static_cast<unsigned_biggest_T>(b); return static_cast<biggest_T>(Op<unsigned_biggest_T>()(val1, val2)); @@ -43,19 +45,19 @@ static inline typename select_bigger<T1, T2>::type SafeMath(T1 a, T2 b) { // Perform a signed add on 'a' and 'b' with defined wrapping behavior. template<typename T1, typename T2> -static inline typename select_bigger<T1, T2>::type SafeAdd(T1 a, T2 b) { +static inline select_bigger_t<T1, T2> SafeAdd(T1 a, T2 b) { return SafeMath<std::plus>(a, b); } // Perform a signed substract on 'a' and 'b' with defined wrapping behavior. template<typename T1, typename T2> -static inline typename select_bigger<T1, T2>::type SafeSub(T1 a, T2 b) { +static inline select_bigger_t<T1, T2> SafeSub(T1 a, T2 b) { return SafeMath<std::minus>(a, b); } // Perform a signed multiply on 'a' and 'b' with defined wrapping behavior. template<typename T1, typename T2> -static inline typename select_bigger<T1, T2>::type SafeMul(T1 a, T2 b) { +static inline select_bigger_t<T1, T2> SafeMul(T1 a, T2 b) { return SafeMath<std::multiplies>(a, b); } |