pub struct BlockRng<R>where
R: BlockRngCore + ?Sized,{
pub core: R,
/* private fields */
}
dep_rand_core
only.Expand description
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 thrown 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.
Implementations§
Source§impl<R> BlockRng<R>where
R: BlockRngCore,
impl<R> BlockRng<R>where
R: BlockRngCore,
Sourcepub fn new(core: R) -> BlockRng<R>
pub fn new(core: R) -> BlockRng<R>
Create a new BlockRng
from an existing RNG implementing
BlockRngCore
. Results will be generated on first use.
Sourcepub fn index(&self) -> usize ⓘ
pub fn index(&self) -> usize ⓘ
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.
Sourcepub fn reset(&mut self)
pub fn reset(&mut self)
Reset the number of available results. This will force a new set of results to be generated on next use.
Sourcepub fn generate_and_set(&mut self, index: usize)
pub fn generate_and_set(&mut self, index: usize)
Generate a new set of results immediately, setting the index to the given value.
Trait Implementations§
Source§impl<R> RngCore for BlockRng<R>
impl<R> RngCore for BlockRng<R>
Source§fn fill_bytes(&mut self, dest: &mut [u8])
fn fill_bytes(&mut self, dest: &mut [u8])
dest
with random data. Read moreSource§impl<R> SeedableRng for BlockRng<R>where
R: BlockRngCore + SeedableRng,
impl<R> SeedableRng for BlockRng<R>where
R: BlockRngCore + SeedableRng,
Source§type Seed = <R as SeedableRng>::Seed
type Seed = <R as SeedableRng>::Seed
u8
arrays (we recommend [u8; N]
for some N
). Read moreSource§fn from_seed(seed: <BlockRng<R> as SeedableRng>::Seed) -> BlockRng<R>
fn from_seed(seed: <BlockRng<R> as SeedableRng>::Seed) -> BlockRng<R>
Source§fn from_rng<S>(rng: S) -> Result<BlockRng<R>, Error> ⓘwhere
S: RngCore,
fn from_rng<S>(rng: S) -> Result<BlockRng<R>, Error> ⓘwhere
S: RngCore,
Rng
. Read moreSource§fn from_entropy() -> Self
fn from_entropy() -> Self
impl<R> CryptoRng for BlockRng<R>where
R: BlockRngCore + CryptoRng,
Auto Trait Implementations§
impl<R> Freeze for BlockRng<R>
impl<R> RefUnwindSafe for BlockRng<R>
impl<R> Send for BlockRng<R>
impl<R> Sync for BlockRng<R>
impl<R> Unpin for BlockRng<R>
impl<R> UnwindSafe for BlockRng<R>
Blanket Implementations§
§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
§type ArchivedMetadata = ()
type ArchivedMetadata = ()
§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> ByteSized for T
impl<T> ByteSized for T
Source§const BYTE_ALIGN: usize = _
const BYTE_ALIGN: usize = _
Source§fn byte_align(&self) -> usize ⓘ
fn byte_align(&self) -> usize ⓘ
Source§fn ptr_size_ratio(&self) -> [usize; 2]
fn ptr_size_ratio(&self) -> [usize; 2]
Source§impl<T, R> Chain<R> for Twhere
T: ?Sized,
impl<T, R> Chain<R> for Twhere
T: ?Sized,
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> CryptoRngCore for T
impl<T> CryptoRngCore for T
Source§impl<T> ExtAny for T
impl<T> ExtAny for T
Source§fn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
fn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
Source§impl<T> ExtMem for Twhere
T: ?Sized,
impl<T> ExtMem for Twhere
T: ?Sized,
Source§const NEEDS_DROP: bool = _
const NEEDS_DROP: bool = _
Source§fn mem_align_of_val(&self) -> usize ⓘ
fn mem_align_of_val(&self) -> usize ⓘ
Source§fn mem_size_of_val(&self) -> usize ⓘ
fn mem_size_of_val(&self) -> usize ⓘ
Source§fn mem_needs_drop(&self) -> bool
fn mem_needs_drop(&self) -> bool
true
if dropping values of this type matters. Read moreSource§fn mem_forget(self)where
Self: Sized,
fn mem_forget(self)where
Self: Sized,
self
without running its destructor. Read moreSource§fn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
fn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
Source§unsafe fn mem_zeroed<T>() -> T
unsafe fn mem_zeroed<T>() -> T
unsafe_layout
only.T
represented by the all-zero byte-pattern. Read moreSource§unsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst
unsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst
unsafe_layout
only.T
represented by the all-zero byte-pattern. Read moreSource§fn mem_as_bytes(&self) -> &[u8] ⓘ
fn mem_as_bytes(&self) -> &[u8] ⓘ
unsafe_slice
only.§impl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
Source§impl<T> Hook for T
impl<T> Hook for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more§impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError> ⓘ
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError> ⓘ
§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out
indicating that a T
is niched.