From 64af289356237ece811d3f437a615b5a1df88e35 Mon Sep 17 00:00:00 2001 From: Benjamin Saunders Date: Mon, 1 Jul 2019 11:00:19 -0700 Subject: [PATCH] Implement Distribution for RangeTo(Inclusive) for unsigned ints --- src/distributions/uniform.rs | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/src/distributions/uniform.rs b/src/distributions/uniform.rs index 400c8442c9f..20526c5ca64 100644 --- a/src/distributions/uniform.rs +++ b/src/distributions/uniform.rs @@ -111,7 +111,7 @@ use std::time::Duration; #[cfg(not(feature = "std"))] use core::time::Duration; -use core::ops::{Range, RangeInclusive}; +use core::ops::{Range, RangeInclusive, RangeTo, RangeToInclusive}; use crate::Rng; use crate::distributions::Distribution; @@ -306,6 +306,28 @@ impl Distribution for RangeInclusive { } } +macro_rules! impl_distrib_range_to { + ($($ty:ty),*) => { + $( + impl Distribution<$ty> for RangeTo<$ty> { + fn sample(&self, rng: &mut R) -> $ty { + <$ty as SampleUniform>::Sampler::sample_single(0, self.end, rng) + } + } + impl Distribution<$ty> for RangeToInclusive<$ty> { + fn sample(&self, rng: &mut R) -> $ty { + <$ty as SampleUniform>::Sampler::sample_single_inclusive(0, self.end, rng) + } + } + )* + } +} + +impl_distrib_range_to!(usize, u8, u16, u32, u64); +#[cfg(not(target_os = "emscripten"))] +impl_distrib_range_to!(u128); + + /// Helper trait similar to [`Borrow`] but implemented /// only for SampleUniform and references to SampleUniform in /// order to resolve ambiguity issues. @@ -1294,10 +1316,14 @@ mod tests { fn test_std_range_distribution() { let mut rng = crate::test::rng(474); for _ in 0..100 { - let x = rng.sample(0..10); - assert!(x >= 0 && x < 10); - let x = rng.sample(0..=10); - assert!(x >= 0 && x <= 10); + let x = rng.sample(-5..5); + assert!(x >= -5 && x < 5); + let x = rng.sample(-5..=5); + assert!(x >= -5 && x <= 5); + let x = rng.sample(..10u8); + assert!(x < 10); + let x = rng.sample(..=10u8); + assert!(x <= 10); } }