use crate::error::Result;
pub trait Rng {
fn next_u32(&mut self) -> u32;
fn next_u64(&mut self) -> u64;
fn fill_bytes(&mut self, dest: &mut [u8]);
fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<()> {
self.fill_bytes(dest);
Ok(())
}
}
pub trait CryptoRng: Rng {
}
pub trait DeterministicRng: Rng {
fn is_deterministic(&self) -> bool;
}
pub trait SeedableRng: Rng {
type Seed: AsRef<[u8]> + Clone;
fn from_seed(seed: Self::Seed) -> Self;
fn reseed(&mut self, seed: Self::Seed) -> Result<()>;
}
pub trait RngCore: Rng {
fn next_u32(&mut self) -> u32;
fn next_u64(&mut self) -> u64;
fn fill_bytes(&mut self, dest: &mut [u8]);
#[cfg(feature = "std")]
fn try_fill_bytes(&mut self, dest: &mut [u8]) -> core::result::Result<(), std::io::Error>;
}
pub trait RngExt: Rng {
#[inline]
fn gen_u8(&mut self) -> u8 {
(self.next_u32() >> 24) as u8
}
#[inline]
fn gen_u16(&mut self) -> u16 {
(self.next_u32() >> 16) as u16
}
#[inline]
fn gen_u32(&mut self) -> u32 {
self.next_u32()
}
#[inline]
fn gen_u64(&mut self) -> u64 {
self.next_u64()
}
fn gen_f32(&mut self) -> f32 {
let bits = (self.next_u32() >> 8) | 0x3f80_0000;
f32::from_bits(bits) - 1.0
}
fn gen_f64(&mut self) -> f64 {
let bits = (self.next_u64() >> 11) | 0x3ff0_0000_0000_0000;
f64::from_bits(bits) - 1.0
}
}
impl<T: Rng> RngExt for T {}
impl<T: Rng> RngCore for T {
fn next_u32(&mut self) -> u32 {
Rng::next_u32(self)
}
fn next_u64(&mut self) -> u64 {
Rng::next_u64(self)
}
fn fill_bytes(&mut self, dest: &mut [u8]) {
Rng::fill_bytes(self, dest)
}
#[cfg(feature = "std")]
fn try_fill_bytes(&mut self, dest: &mut [u8]) -> core::result::Result<(), std::io::Error> {
Rng::try_fill_bytes(self, dest).map_err(std::io::Error::other)
}
}