Struct RngBuffer

Source
pub(crate) struct RngBuffer<'a, T: RngCore> {
    inner: &'a mut T,
    u8_vec: ArrayVec<u8, 7>,
    u32_opt: Option<u32>,
}
Expand description

Wrap a RngCore implementation for fast u8 and u32 output.

This maintains small queues for each data type: up to one u32 and up to 7 bytes. The queueing behavior matches convenions required by HashX: The underlying u64 values are always generated lazily, and component values are extracted in big endian order.

Fields§

§inner: &'a mut T

Inner RngCore implementation

§u8_vec: ArrayVec<u8, 7>

Buffer of remaining u8 values from breaking up a u64

§u32_opt: Option<u32>

Up to one buffered u32 value

Implementations§

Source§

impl<'a, T: RngCore> RngBuffer<'a, T>

Source

pub(crate) fn new(rng: &'a mut T) -> Self

Construct a new empty buffer around a RngCore implementation.

No actual random numbers will be generated until the first call to Self::next_u8 or Self::next_u32.

Source

pub(crate) fn next_u32(&mut self) -> u32

Request 32 bits from the buffered random number generator.

If we have buffered data stored, returns that. If not, requests 64 bits from the RngCore and saves half for later.

Source

pub(crate) fn next_u8(&mut self) -> u8

Request 8 bits from the buffered random number generator.

If we have buffered data stored, returns that. If not, requests 64 bits from the RngCore and saves 7 bytes for later.

Trait Implementations§

Source§

impl<'a, T: Debug + RngCore> Debug for RngBuffer<'a, T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a, T> Freeze for RngBuffer<'a, T>

§

impl<'a, T> RefUnwindSafe for RngBuffer<'a, T>
where T: RefUnwindSafe,

§

impl<'a, T> Send for RngBuffer<'a, T>
where T: Send,

§

impl<'a, T> Sync for RngBuffer<'a, T>
where T: Sync,

§

impl<'a, T> Unpin for RngBuffer<'a, T>

§

impl<'a, T> !UnwindSafe for RngBuffer<'a, T>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.