summaryrefslogtreecommitdiff
path: root/runtime/interpreter/safe_math.h
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/interpreter/safe_math.h')
-rw-r--r--runtime/interpreter/safe_math.h20
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);
}