use std::ops::{Add, Sub};
pub trait Numeric
where
Self: Add + Sub + Copy + Ord + Sized,
{
const MINIMUM: Self;
const STEPONE: Self;
fn from_usize(number: usize) -> Self;
fn as_usize(&self) -> usize;
}
macro_rules! numeric {
($name:ident) => {
impl Numeric for $name {
const MINIMUM: Self = 1;
const STEPONE: Self = 1;
fn from_usize(number: usize) -> Self {
number as Self
}
fn as_usize(&self) -> usize {
*self as usize
}
}
};
}
numeric!(u8);
numeric!(u16);
numeric!(u32);
numeric!(u64);
numeric!(u128);
numeric!(usize);