use nalgebra::base::Scalar;
use num::{
traits::{
ops::checked::{CheckedAdd, CheckedDiv, CheckedMul, CheckedNeg, CheckedRem, CheckedSub},
Num, NumAssign,
},
Integer, Signed,
};
use std::{fmt::Display, marker::Copy, str::FromStr};
macro_rules! checked_calc_impl {
($t:ty) => {
impl CheckedCalc for $t {}
};
}
macro_rules! checked_type_impl {
($t:ty) => {
impl CheckedType for $t {}
};
}
pub trait CheckedCalc:
CheckedAdd + CheckedSub + CheckedMul + CheckedDiv + CheckedRem + CheckedNeg
{
}
pub trait CheckedType:
Num + Copy + FromStr + Integer + Scalar + Signed + NumAssign + Display + Clone
{
}
checked_calc_impl!(u8);
checked_calc_impl!(u16);
checked_calc_impl!(u32);
checked_calc_impl!(u64);
checked_calc_impl!(u128);
checked_calc_impl!(usize);
checked_calc_impl!(i8);
checked_calc_impl!(i16);
checked_calc_impl!(i32);
checked_calc_impl!(i64);
checked_calc_impl!(i128);
checked_calc_impl!(isize);
checked_type_impl!(i8);
checked_type_impl!(i16);
checked_type_impl!(i32);
checked_type_impl!(i64);
checked_type_impl!(i128);
checked_type_impl!(isize);