[−][src]Struct rand_core::block::BlockRng
A wrapper type implementing [RngCore
] for some type implementing
[BlockRngCore
] with u32
array buffer; i.e. this can be used to implement
a full RNG from just a generate
function.
The core
field may be accessed directly but the results buffer may not.
PRNG implementations can simply use a type alias
(pub type MyRng = BlockRng<MyRngCore>;
) but might prefer to use a
wrapper type (pub struct MyRng(BlockRng<MyRngCore>);
); the latter must
re-implement RngCore
but hides the implementation details and allows
extra functionality to be defined on the RNG
(e.g. impl MyRng { fn set_stream(...){...} }
).
BlockRng
has heavily optimized implementations of the [RngCore
] methods
reading values from the results buffer, as well as
calling [BlockRngCore::generate
] directly on the output array when
fill_bytes
/ try_fill_bytes
is called on a large array. These methods
also handle the bookkeeping of when to generate a new batch of values.
No whole generated u32
values are thown away and all values are consumed
in-order. next_u32
simply takes the next available u32
value.
next_u64
is implemented by combining two u32
values, least
significant first. fill_bytes
and try_fill_bytes
consume a whole
number of u32
values, converting each u32
to a byte slice in
little-endian order. If the requested byte length is not a multiple of 4,
some bytes will be discarded.
See also [BlockRng64
] which uses u64
array buffers. Currently there is
no direct support for other buffer types.
For easy initialization BlockRng
also implements [SeedableRng
].
Fields
core: R
The core part of the RNG, implementing the generate
function.
Methods
impl<R> BlockRng<R> where
R: BlockRngCore,
[src]
R: BlockRngCore,
pub fn new(core: R) -> BlockRng<R>
[src]
Create a new BlockRng
from an existing RNG implementing
BlockRngCore
. Results will be generated on first use.
pub fn index(&self) -> usize
[src]
Get the index into the result buffer.
If this is equal to or larger than the size of the result buffer then
the buffer is "empty" and generate()
must be called to produce new
results.
pub fn reset(&mut self)
[src]
Reset the number of available results. This will force a new set of results to be generated on next use.
pub fn generate_and_set(&mut self, index: usize)
[src]
Generate a new set of results immediately, setting the index to the given value.
Trait Implementations
impl<R> Debug for BlockRng<R> where
R: BlockRngCore + Debug,
[src]
R: BlockRngCore + Debug,
impl<R> CryptoRng for BlockRng<R> where
R: BlockRngCore + CryptoRng,
[src]
R: BlockRngCore + CryptoRng,
impl<R> Clone for BlockRng<R> where
R: BlockRngCore + Clone + ?Sized,
<R as BlockRngCore>::Results: Clone,
[src]
R: BlockRngCore + Clone + ?Sized,
<R as BlockRngCore>::Results: Clone,
impl<R> RngCore for BlockRng<R> where
R: BlockRngCore<Item = u32>,
<R as BlockRngCore>::Results: AsRef<[u32]>,
<R as BlockRngCore>::Results: AsMut<[u32]>,
[src]
R: BlockRngCore<Item = u32>,
<R as BlockRngCore>::Results: AsRef<[u32]>,
<R as BlockRngCore>::Results: AsMut<[u32]>,
fn next_u32(&mut self) -> u32
[src]
fn next_u64(&mut self) -> u64
[src]
fn fill_bytes(&mut self, dest: &mut [u8])
[src]
fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error>
[src]
impl<R> SeedableRng for BlockRng<R> where
R: BlockRngCore + SeedableRng,
[src]
R: BlockRngCore + SeedableRng,
type Seed = <R as SeedableRng>::Seed
Seed type, which is restricted to types mutably-dereferencable as u8
arrays (we recommend [u8; N]
for some N
). Read more
fn from_seed(seed: <BlockRng<R> as SeedableRng>::Seed) -> BlockRng<R>
[src]
fn seed_from_u64(seed: u64) -> BlockRng<R>
[src]
fn from_rng<S>(rng: S) -> Result<BlockRng<R>, Error> where
S: RngCore,
[src]
S: RngCore,
Auto Trait Implementations
impl<R: ?Sized> Unpin for BlockRng<R> where
R: Unpin,
<R as BlockRngCore>::Results: Unpin,
R: Unpin,
<R as BlockRngCore>::Results: Unpin,
impl<R: ?Sized> Send for BlockRng<R> where
R: Send,
<R as BlockRngCore>::Results: Send,
R: Send,
<R as BlockRngCore>::Results: Send,
impl<R: ?Sized> Sync for BlockRng<R> where
R: Sync,
<R as BlockRngCore>::Results: Sync,
R: Sync,
<R as BlockRngCore>::Results: Sync,
impl<R: ?Sized> UnwindSafe for BlockRng<R> where
R: UnwindSafe,
<R as BlockRngCore>::Results: UnwindSafe,
R: UnwindSafe,
<R as BlockRngCore>::Results: UnwindSafe,
impl<R: ?Sized> RefUnwindSafe for BlockRng<R> where
R: RefUnwindSafe,
<R as BlockRngCore>::Results: RefUnwindSafe,
R: RefUnwindSafe,
<R as BlockRngCore>::Results: RefUnwindSafe,
Blanket Implementations
impl<T> From<T> for T
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
[src]
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,