21#include <llvm/ADT/APSInt.h>
24#include <initializer_list>
35llvm::APSInt
expandingAdd(
const llvm::APSInt &lhs,
const llvm::APSInt &rhs);
44llvm::APSInt
expandingSub(
const llvm::APSInt &lhs,
const llvm::APSInt &rhs);
52llvm::APSInt
expandingMul(
const llvm::APSInt &lhs,
const llvm::APSInt &rhs);
56std::strong_ordering
safeCmp(
const llvm::APSInt &lhs,
const llvm::APSInt &rhs);
58inline bool safeLt(
const llvm::APSInt &lhs,
const llvm::APSInt &rhs) {
59 return std::is_lt(
safeCmp(lhs, rhs));
62inline bool safeLe(
const llvm::APSInt &lhs,
const llvm::APSInt &rhs) {
63 return std::is_lteq(
safeCmp(lhs, rhs));
66inline bool safeEq(
const llvm::APSInt &lhs,
const llvm::APSInt &rhs) {
67 return std::is_eq(
safeCmp(lhs, rhs));
70inline bool safeNe(
const llvm::APSInt &lhs,
const llvm::APSInt &rhs) {
71 return std::is_neq(
safeCmp(lhs, rhs));
74inline bool safeGt(
const llvm::APSInt &lhs,
const llvm::APSInt &rhs) {
75 return std::is_gt(
safeCmp(lhs, rhs));
78inline bool safeGe(
const llvm::APSInt &lhs,
const llvm::APSInt &rhs) {
79 return std::is_gteq(
safeCmp(lhs, rhs));
82inline llvm::APSInt
safeMin(
const llvm::APSInt &lhs,
const llvm::APSInt &rhs) {
83 return std::min(lhs, rhs,
safeLt);
86inline llvm::APSInt
safeMin(std::initializer_list<llvm::APSInt> ilist) {
87 return std::min(ilist,
safeLt);
90inline llvm::APSInt
safeMax(
const llvm::APSInt &lhs,
const llvm::APSInt &rhs) {
91 return std::max(lhs, rhs,
safeLt);
94inline llvm::APSInt
safeMax(std::initializer_list<llvm::APSInt> ilist) {
95 return std::max(ilist,
safeLt);
llvm::APSInt expandingSub(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Safely subtract lhs and rhs, expanding the width of the result as necessary.
std::strong_ordering safeCmp(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Compares lhs and rhs, regardless of the bitwidth of lhs and rhs.
llvm::APSInt expandingAdd(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Safely add lhs and rhs, expanding the width of the result as necessary.
llvm::APSInt safeMax(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
llvm::APSInt expandingMul(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
Safely multiple lhs and rhs, expanding the width of the result as necessary.
bool safeGt(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
bool safeEq(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
bool safeLt(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
bool safeLe(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
bool safeNe(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
bool safeGe(const llvm::APSInt &lhs, const llvm::APSInt &rhs)
llvm::APSInt safeMin(const llvm::APSInt &lhs, const llvm::APSInt &rhs)