#, "/api-reference/system/random.html).")
))]
#![cfg_attr(rng_trng_supported, doc = r"For more details see [`Trng`].")]
mod ll;
#[cfg(rng_trng_supported)]
mod trng;
#[cfg(rng_trng_supported)]
#[instability::unstable]
pub use trng::*;
#[cfg_attr(
rng_trng_supported,
doc = r"To generate true random numbers, see [`Trng`]."
)]
#[derive(Clone, Copy, Default, Debug)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
#[non_exhaustive]
pub struct Rng;
impl Rng {
#[inline]
pub fn new() -> Self {
Self
}
#[procmacros::doc_replace]
#[inline]
pub fn random(&self) -> u32 {
let mut n = [0; 4];
self.read(&mut n);
u32::from_le_bytes(n)
}
#[procmacros::doc_replace]
#[inline]
pub fn read(&self, buffer: &mut [u8]) {
unsafe { self.read_into_raw(buffer.as_mut_ptr(), buffer.len()) };
}
#[inline]
#[instability::unstable]
pub unsafe fn read_into_raw(&self, ptr: *mut u8, len: usize) {
ll::fill_ptr_range(ptr, len);
}
}
#[instability::unstable]
impl rand_core_06::RngCore for Rng {
fn next_u32(&mut self) -> u32 {
self.random()
}
fn next_u64(&mut self) -> u64 {
let mut bytes = [0; 8];
self.read(&mut bytes);
u64::from_le_bytes(bytes)
}
fn fill_bytes(&mut self, dest: &mut [u8]) {
self.read(dest);
}
fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), rand_core_06::Error> {
self.read(dest);
Ok(())
}
}
#[instability::unstable]
impl rand_core_09::RngCore for Rng {
fn next_u32(&mut self) -> u32 {
self.random()
}
fn next_u64(&mut self) -> u64 {
let mut bytes = [0; 8];
self.read(&mut bytes);
u64::from_le_bytes(bytes)
}
fn fill_bytes(&mut self, dest: &mut [u8]) {
self.read(dest);
}
}
#[instability::unstable]
impl rand_core_010::TryRng for Rng {
type Error = core::convert::Infallible;
fn try_next_u32(&mut self) -> Result<u32, Self::Error> {
Ok(self.random())
}
fn try_next_u64(&mut self) -> Result<u64, Self::Error> {
let mut bytes = [0; 8];
self.read(&mut bytes);
Ok(u64::from_le_bytes(bytes))
}
fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Self::Error> {
self.read(dest);
Ok(())
}
}