use num::Num;
pub trait Unit: Copy + Num {
fn unit_radius() -> (Self, Self);
fn unit_width() -> (Self, Self);
}
macro_rules! unit {
(integer => $($t:ty),*) => {$(
impl Unit for $t {
fn unit_radius() -> (Self, Self) {
use num::{One, Zero};
(Self::zero(), Self::one() + Self::one())
}
fn unit_width() -> (Self, Self) {
use num::{One, Zero};
(Self::zero(), Self::one())
}
}
)*};
(real => $($t:ty),*) => {$(
impl Unit for $t {
fn unit_radius() -> (Self, Self) {
use num::One;
(-Self::one(), Self::one())
}
fn unit_width() -> (Self, Self) {
use num::One;
let half = Self::one() / (Self::one() + Self::one());
(-half, half)
}
}
)*};
}
unit!(integer => i8, i16, i32, i64, u8, u16, u32, u64);
unit!(real => f32, f64);