rand_functors/
random_variable_ranges.rs

1use core::ops::{Range, RangeInclusive};
2
3use crate::RandomVariableRange;
4
5// A generic implementation of RandomVariableRange<T> for Range<T> is impossible
6// until std::iter::Step is stabilized.
7macro_rules! impl_random_variable_range_for_range {
8    ($t:ty) => {
9        impl RandomVariableRange<$t> for Range<$t> {
10            #[inline]
11            fn sample_space(&self) -> impl Iterator<Item = $t> {
12                self.clone()
13            }
14        }
15    };
16}
17
18// A generic implementation of RandomVariableRange<T> for RangeInclusive<T> is
19// impossible until std::iter::Step is stabilized.
20macro_rules! impl_random_variable_range_for_range_inclusive {
21    ($t:ty) => {
22        impl RandomVariableRange<$t> for RangeInclusive<$t> {
23            #[inline]
24            fn sample_space(&self) -> impl Iterator<Item = $t> {
25                self.clone()
26            }
27        }
28    };
29}
30
31impl_random_variable_range_for_range!(u8);
32impl_random_variable_range_for_range!(u16);
33impl_random_variable_range_for_range!(u32);
34impl_random_variable_range_for_range!(u64);
35impl_random_variable_range_for_range!(u128);
36
37impl_random_variable_range_for_range!(i8);
38impl_random_variable_range_for_range!(i16);
39impl_random_variable_range_for_range!(i32);
40impl_random_variable_range_for_range!(i64);
41impl_random_variable_range_for_range!(i128);
42
43impl_random_variable_range_for_range_inclusive!(u8);
44impl_random_variable_range_for_range_inclusive!(u16);
45impl_random_variable_range_for_range_inclusive!(u32);
46impl_random_variable_range_for_range_inclusive!(u64);
47impl_random_variable_range_for_range_inclusive!(u128);
48
49impl_random_variable_range_for_range_inclusive!(i8);
50impl_random_variable_range_for_range_inclusive!(i16);
51impl_random_variable_range_for_range_inclusive!(i32);
52impl_random_variable_range_for_range_inclusive!(i64);
53impl_random_variable_range_for_range_inclusive!(i128);