// Declares a type which is the larger in bit size of the two template parameters. template <typename T1, typename T2> struct select_bigger { 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> staticinline 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); returnstatic_cast<biggest_T>(Op<unsigned_biggest_T>()(val1, val2));
}
// Perform a signed add on 'a' and 'b' with defined wrapping behavior. template<typename T1, typename T2> staticinline 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> staticinline 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> staticinline select_bigger_t<T1, T2> SafeMul(T1 a, T2 b) { return SafeMath<std::multiplies>(a, b);
}
} // namespace interpreter
} // namespace art
#endif// ART_RUNTIME_INTERPRETER_SAFE_MATH_H_
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.9 Sekunden
(vorverarbeitet am 2026-06-29)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.