3030//! #[derive(Eq, PartialEq, Default)]
3131//! pub struct Results([u64; 8]);
3232//!
33- //! // implement `AsRef<[u8]>`, `AsRef<[u32]>`, and `AsRef<[u64]>` for `Results`
33+ //! impl AsRef<[u64]> for Results {
34+ //! #[inline(always)]
35+ //! fn as_ref(&self) -> &[u64] {
36+ //! &self.0
37+ //! }
38+ //! }
3439//!
3540//! impl BlockRngCore for MyRngCore {
3641//! type Results = Results;
6065
6166use crate :: { CryptoRng , Error , RngCore , SeedableRng } ;
6267use core:: convert:: AsRef ;
63- use core:: fmt;
68+ use core:: { fmt, slice } ;
6469#[ cfg( feature = "serde1" ) ]
6570use serde:: { Deserialize , Serialize } ;
6671
@@ -72,7 +77,7 @@ use serde::{Deserialize, Serialize};
7277pub trait BlockRngCore {
7378 /// Results type. This is the 'block' an RNG implementing `BlockRngCore`
7479 /// generates, which will usually be an array like `[u8; 64]`.
75- type Results : AsRef < [ u8 ] > + AsRef < [ u32 ] > + AsRef < [ u64 ] > + Default + Sized ;
80+ type Results : AsRef < [ u64 ] > + Default + Sized ;
7681
7782 /// Generate a new block of results.
7883 fn generate ( & mut self , results : & mut Self :: Results ) ;
@@ -86,6 +91,7 @@ pub trait BlockRngCore {
8691}
8792
8893#[ derive( Copy , Clone , Debug , Eq , PartialEq ) ]
94+ #[ cfg_attr( feature = "serde1" , derive( Serialize , Deserialize ) ) ]
8995enum IndexLevel {
9096 U1 ,
9197 U8 ,
@@ -180,29 +186,40 @@ impl<R: BlockRngCore> BlockRng<R> {
180186 #[ inline]
181187 pub fn new ( core : R ) -> BlockRng < R > {
182188 let results = R :: Results :: default ( ) ;
183- let index = AsRef :: < [ u8 ] > :: as_ref ( & results ) . len ( ) ;
189+ let index = 8 * results . as_ref ( ) . len ( ) ;
184190 BlockRng { core, results, index, level : IndexLevel :: U8 }
185191 }
186192
193+ #[ inline( always) ]
194+ fn results_to_u8 ( results : & R :: Results ) -> & [ u8 ] {
195+ let buf = results. as_ref ( ) ;
196+ unsafe {
197+ slice:: from_raw_parts ( buf. as_ptr ( ) as * const u8 , 8 * buf. len ( ) )
198+ }
199+ }
200+
187201 #[ inline( always) ]
188202 fn get_results_u8 ( & self ) -> & [ u8 ] {
189- AsRef :: < [ u8 ] > :: as_ref ( & self . results )
203+ Self :: results_to_u8 ( & self . results )
190204 }
191205
192206 #[ inline( always) ]
193207 fn get_results_u32 ( & self ) -> & [ u32 ] {
194- AsRef :: < [ u32 ] > :: as_ref ( & self . results )
208+ let buf = self . results . as_ref ( ) ;
209+ unsafe {
210+ slice:: from_raw_parts ( buf. as_ptr ( ) as * const u32 , 2 * buf. len ( ) )
211+ }
195212 }
196213
197214 #[ inline( always) ]
198215 fn get_results_u64 ( & self ) -> & [ u64 ] {
199- AsRef :: < [ u64 ] > :: as_ref ( & self . results )
216+ self . results . as_ref ( )
200217 }
201218}
202219
203220impl < R : BlockRngCore > RngCore for BlockRng < R >
204221where
205- <R as BlockRngCore >:: Results : AsRef < [ u8 ] > + AsRef < [ u32 ] > + AsRef < [ u64 ] > + Default + Sized ,
222+ <R as BlockRngCore >:: Results : AsRef < [ u64 ] > + Default + Sized ,
206223{
207224 #[ inline]
208225 fn next_bool ( & mut self ) -> bool {
@@ -233,7 +250,7 @@ where
233250 self . index = 1 ;
234251 self . get_results_u32 ( ) [ 0 ]
235252 }
236- }
253+ } . to_le ( )
237254 }
238255
239256 #[ inline]
@@ -249,7 +266,7 @@ where
249266 self . index = 1 ;
250267 self . get_results_u64 ( ) [ 0 ]
251268 }
252- }
269+ } . to_le ( )
253270 }
254271
255272 #[ inline]
@@ -276,11 +293,11 @@ where
276293 }
277294 }
278295
296+ let mut buf = R :: Results :: default ( ) ;
279297 let mut chunks = dest. chunks_exact_mut ( rlen) ;
280298 for chunk in & mut chunks {
281- let mut buf = R :: Results :: default ( ) ;
282299 self . core . try_generate ( & mut buf) ?;
283- chunk. copy_from_slice ( buf . as_ref ( ) ) ;
300+ chunk. copy_from_slice ( Self :: results_to_u8 ( & buf ) ) ;
284301 }
285302
286303 let rem = chunks. into_remainder ( ) ;
0 commit comments