use core::{
fmt::{Debug, Display},
hash::Hash,
ops::{AddAssign, SubAssign},
};
use num_traits::{AsPrimitive, Bounded, ConstOne, ConstZero, Num, SaturatingAdd, Unsigned};
pub trait TryFromUsize: TryFrom<usize> + Copy {
#[inline]
fn try_from_usize(v: usize) -> Result<Self, Self::Error> {
Self::try_from(v)
}
}
impl<T: TryFrom<usize> + Copy> TryFromUsize for T {}
pub trait PositiveInteger:
Unsigned
+ Copy
+ Eq
+ Hash
+ Debug
+ Display
+ Ord
+ AsPrimitive<usize>
+ TryFromUsize
+ Bounded
+ AddAssign
+ SubAssign
+ SaturatingAdd
+ ConstZero
+ ConstOne
{
}
impl<
T: Unsigned
+ Copy
+ Eq
+ Hash
+ Debug
+ Display
+ Ord
+ AsPrimitive<usize>
+ TryFromUsize
+ Bounded
+ AddAssign
+ SubAssign
+ SaturatingAdd
+ ConstZero
+ ConstOne,
> PositiveInteger for T
{
}
pub trait Number: Num + Copy + PartialOrd + Debug + Bounded + AddAssign + SubAssign {}
impl<T: Num + Copy + PartialOrd + Debug + Bounded + AddAssign + SubAssign> Number for T {}
pub trait Finite {
fn is_finite(&self) -> bool;
}
impl Finite for f32 {
#[inline]
fn is_finite(&self) -> bool {
f32::is_finite(*self)
}
}
impl Finite for f64 {
#[inline]
fn is_finite(&self) -> bool {
f64::is_finite(*self)
}
}
macro_rules! impl_finite_int {
($($t:ty),*) => {
$(
impl Finite for $t {
#[inline]
fn is_finite(&self) -> bool {
true
}
}
)*
};
}
impl_finite_int!(u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize);