#[derive(Debug, Clone, Copy)]
pub struct Panic;
#[derive(Debug, Clone, Copy)]
pub struct Clamp;
#[derive(Debug, Clone, Copy)]
pub struct Wrap;
pub trait OpModeExt:
BringInRange<u8>
+ BringInRange<u16>
+ BringInRange<u32>
+ BringInRange<u64>
+ BringInRange<i8>
+ BringInRange<i16>
+ BringInRange<i32>
+ BringInRange<i64>
+ Clone
+ Copy
{
}
impl OpModeExt for Panic {}
impl OpModeExt for Clamp {}
impl OpModeExt for Wrap {}
pub trait BringInRange<N>
{
fn bring_in_range(v: N, min: N, max: N) -> N;
}
macro_rules! bring_in_range_impl {
($i:ty) => {
impl BringInRange<$i> for Panic
{
fn bring_in_range(v: $i, min: $i, max: $i) -> $i
{
assert!(v >= min);
assert!(v <= max);
v
}
}
impl BringInRange<$i> for Clamp
{
fn bring_in_range(v: $i, min: $i, max: $i) -> $i
{
v.clamp(min, max)
}
}
};
}
bring_in_range_impl!(u8);
bring_in_range_impl!(u16);
bring_in_range_impl!(u32);
bring_in_range_impl!(u64);
bring_in_range_impl!(i8);
bring_in_range_impl!(i16);
bring_in_range_impl!(i32);
bring_in_range_impl!(i64);