use super::*;
#[derive(Copy, Clone, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct UniformFloat<T> {
base: T,
scale: T,
}
impl SampleUniform for f32 {
type Sampler = UniformFloat<f32>;
}
impl UniformSampler<f32> for UniformFloat<f32> {
#[inline]
fn try_new(low: f32, high: f32) -> Result<UniformFloat<f32>, UniformError> {
let scale = high - low;
let base = low - scale;
#[cfg(debug_assertions)]
if !(base.is_finite() && scale.is_finite()) {
return Err(UniformError::NonFinite);
}
Ok(UniformFloat { base, scale })
}
#[inline]
fn try_new_inclusive(low: f32, high: f32) -> Result<UniformFloat<f32>, UniformError> {
Self::try_new(low, high)
}
}
impl Distribution<f32> for UniformFloat<f32> {
#[inline]
fn sample<R: Rng + ?Sized>(&self, rand: &mut Random<R>) -> f32 {
rand.next_f32() * self.scale + self.base
}
}
impl SampleUniform for f64 {
type Sampler = UniformFloat<f64>;
}
impl UniformSampler<f64> for UniformFloat<f64> {
#[inline]
fn try_new(low: f64, high: f64) -> Result<UniformFloat<f64>, UniformError> {
let scale = high - low;
let base = low - scale;
#[cfg(debug_assertions)]
if !(base.is_finite() && scale.is_finite()) {
return Err(UniformError::NonFinite);
}
Ok(UniformFloat { base, scale })
}
#[inline]
fn try_new_inclusive(low: f64, high: f64) -> Result<UniformFloat<f64>, UniformError> {
Self::try_new(low, high)
}
}
impl Distribution<f64> for UniformFloat<f64> {
#[inline]
fn sample<R: Rng + ?Sized>(&self, rand: &mut Random<R>) -> f64 {
rand.next_f64() * self.scale + self.base
}
}