1mod rand_error;
74pub use rand_error::{RandError, RandErrKind};
75pub type Result<T> = std::result::Result<T, RandError>;
76
77pub trait PrimitiveType {
78 fn bits_len() -> Self;
79 fn mask(&self) -> Self;
80}
81
82impl PrimitiveType for u32 {
83 fn bits_len() -> Self {
84 (std::mem::size_of::<u32>() << 3) as u32
85 }
86
87 fn mask(&self) -> Self {
88 if self == &32 {core::u32::MAX} else {(1 << (self & 31)) - 1}
89 }
90}
91
92impl PrimitiveType for usize {
93 fn bits_len() -> Self {
94 (std::mem::size_of::<usize>() << 3) as usize
95 }
96
97 fn mask(&self) -> Self {
98 if self == &Self::bits_len() {core::usize::MAX} else {(1 << (self & (Self::bits_len() - 1))) - 1}
99 }
100}
101impl PrimitiveType for u64 {
102 fn bits_len() -> Self {
103 (std::mem::size_of::<u64>() << 3) as u64
104 }
105
106 fn mask(&self) -> Self {
107 if self == &64 {core::u64::MAX} else {(1 << (self & 63)) - 1}
108 }
109}
110
111pub trait Seed<T: PrimitiveType> {
112 fn seed(&self) -> Result<T>;
113}
114
115pub trait Source<T: PrimitiveType> {
116 fn gen(& mut self) -> Result<T>;
117
118 fn reset<Sd: Seed<T>>(&mut self, sd: &Sd) -> Result<()>;
119}
120
121pub trait IterSource<T: PrimitiveType>: Source<T> {
122 fn iter_mut(&mut self) -> crate::rand::iter::Iter<'_, Self, T>
123 where Self: std::marker::Sized;
124}
125
126#[macro_use]
127mod iter;
128pub use iter::Iter;
129
130#[macro_use]
131mod linear_congruential_rand;
132pub use linear_congruential_rand::LinearCongruentialRand;
133iter_impl!(LinearCongruentialRand, u32, usize, u64);
134
135#[macro_use]
136mod mersenne_twister_rand;
137pub use mersenne_twister_rand::MersenneTwisterRand;
138iter_impl!(MersenneTwisterRand, u32, usize, u64);
139
140#[macro_use]
141mod lagged_fibonacci_rand;
142pub use lagged_fibonacci_rand::LaggedFibonacciRand;
143iter_impl!(LaggedFibonacciRand, u32, usize, u64);
144
145#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
146mod default_seed;
147#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
148pub use default_seed::DefaultSeed;
149#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
150mod default_seed_amd64;
151#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
152pub use default_seed_amd64::DefaultSeed;
153
154
155#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
156mod default_rand;
157#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
158pub use default_rand::DefaultRand;
159#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
160mod default_rand_amd64;
161#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
162pub use default_rand_amd64::DefaultRand;
163iter_impl!(DefaultRand, u32, usize, u64);
164
165
166#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
167mod crypto_rand;
168#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
169pub use crypto_rand::CryptoRand;
170
171#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
172mod crypto_rand_amd64;
173#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
174pub use crypto_rand_amd64::CryptoRand;
175iter_impl!(CryptoRand, u32, usize, u64);