use crate::lib::*; pub use fastrand::Rng; pub trait GenRange { fn in_range>(&mut self, range: S) -> T; } impl GenRange for Rng { fn in_range>(&mut self, range: S) -> T { range.random(self) } } macro_rules! gen_range_f { ($t: ident) => { impl RngExtensions<$t> for Range<$t> { fn random(self, r: &mut Rng) -> $t { (self.start, self.end).random(r) } } }; } gen_range_f!(f16); gen_range_f!(f32); gen_range_f!(f64); macro_rules! gen_range_i { ($t: ident) => { impl RngExtensions<$t> for Range<$t> { fn random(self, r: &mut Rng) -> $t { r.$t(self.start..self.end) } } }; } gen_range_i!(i8); gen_range_i!(u8); gen_range_i!(i16); gen_range_i!(u16); gen_range_i!(i32); gen_range_i!(u32); gen_range_i!(i64); gen_range_i!(u64); gen_range_i!(i128); gen_range_i!(u128); gen_range_i!(isize); gen_range_i!(usize); pub trait RngExtensions { fn random(self, r: &mut Rng) -> T; } impl RngExtensions for hVec2 { fn random(self, r: &mut Rng) -> f16 { f16(Vec2(self).random(r)) } } impl RngExtensions for Vec2 { fn random(self, r: &mut Rng) -> f32 { r.f32() * (self.1 - self.0) - self.0 } } impl RngExtensions for dVec2 { fn random(self, r: &mut Rng) -> f64 { r.f64() * (self.1 - self.0) - self.0 } }