@@ -184,8 +184,9 @@ pub fn next_u64_via_fill<R: RngCore + ?Sized>(rng: &mut R) -> u64 {
184
184
/// [`RngCore`]: ../RngCore.t.html
185
185
/// [`SeedableRng`]: ../SeedableRng.t.html
186
186
#[ derive( Clone ) ]
187
- #[ cfg_attr( feature="serde-1" , derive( Serialize , Deserialize ) ) ]
187
+ #[ cfg_attr( feature="serde-1" , derive( Serialize ) ) ]
188
188
pub struct BlockRng < R : BlockRngCore + ?Sized > {
189
+ #[ cfg_attr( feature="serde-1" , serde( with="serde_asref" ) ) ]
189
190
pub results : R :: Results ,
190
191
pub index : usize ,
191
192
pub core : R ,
@@ -203,7 +204,7 @@ impl<R: BlockRngCore + fmt::Debug> fmt::Debug for BlockRng<R> {
203
204
}
204
205
205
206
impl < R : BlockRngCore < Item =u32 > > RngCore for BlockRng < R >
206
- where <R as BlockRngCore >:: Results : AsRef < [ u32 ] >
207
+ where <R as BlockRngCore >:: Results : AsRef < [ u32 ] > + AsMut < [ u32 ] > + Default
207
208
{
208
209
#[ inline( always) ]
209
210
fn next_u32 ( & mut self ) -> u32 {
@@ -349,7 +350,7 @@ impl<R: BlockRngCore + SeedableRng> SeedableRng for BlockRng<R> {
349
350
/// [`RngCore`]: ../RngCore.t.html
350
351
/// [`BlockRng`]: .BlockRng.s.html
351
352
#[ derive( Clone ) ]
352
- #[ cfg_attr( feature="serde-1" , derive( Serialize , Deserialize ) ) ]
353
+ // #[cfg_attr(feature="serde-1", derive(Serialize,Deserialize))]
353
354
pub struct BlockRng64 < R : BlockRngCore + ?Sized > {
354
355
pub results : R :: Results ,
355
356
pub index : usize ,
@@ -370,7 +371,7 @@ impl<R: BlockRngCore + fmt::Debug> fmt::Debug for BlockRng64<R> {
370
371
}
371
372
372
373
impl < R : BlockRngCore < Item =u64 > > RngCore for BlockRng64 < R >
373
- where <R as BlockRngCore >:: Results : AsRef < [ u64 ] >
374
+ where <R as BlockRngCore >:: Results : AsRef < [ u64 ] > + AsMut < [ u64 ] > + Default
374
375
{
375
376
#[ inline( always) ]
376
377
fn next_u32 ( & mut self ) -> u32 {
@@ -501,4 +502,74 @@ impl<R: BlockRngCore + SeedableRng> SeedableRng for BlockRng64<R> {
501
502
502
503
impl < R : BlockRngCore + CryptoRng > CryptoRng for BlockRng < R > { }
503
504
505
+ #[ cfg( feature="serde-1" ) ]
506
+ mod serde_asref {
507
+ use serde:: { Deserialize , Deserializer , Serialize , Serializer } ;
508
+ use serde:: de:: { Visitor , SeqAccess } ;
509
+ use serde:: de;
510
+
511
+ use core:: fmt;
512
+ use core:: convert:: AsRef ;
513
+ use BlockRngCore ;
514
+
515
+ pub fn serialize < R , S , T > ( arr : R , ser : S ) -> Result < S :: Ok , S :: Error >
516
+ where
517
+ R : AsRef < [ T ] > ,
518
+ S : Serializer ,
519
+ T : Serialize ,
520
+ {
521
+ use serde:: ser:: SerializeTuple ;
522
+
523
+ let mut seq = ser. serialize_tuple ( arr. as_ref ( ) . len ( ) ) ?;
524
+
525
+ for e in arr. as_ref ( ) . iter ( ) {
526
+ seq. serialize_element ( & e) ?;
527
+ }
528
+
529
+ seq. end ( )
530
+ }
531
+
532
+ #[ inline]
533
+ pub fn deserialize < ' de , R , T , D > ( de : D ) -> Result < [ T ; RAND_SIZE ] , D :: Error >
534
+ where
535
+ R : AsMut < [ T ] > ,
536
+ T : Deserialize < ' de > + Default ,
537
+ D : Deserializer < ' de > ,
538
+ {
539
+ use core:: marker:: PhantomData ;
540
+ struct ArrayVisitor < T > {
541
+ _pd : PhantomData < T > ,
542
+ } ;
543
+ impl < ' de , T > Visitor < ' de > for ArrayVisitor < T >
544
+ where
545
+ T : Deserialize < ' de > +Default +Copy
546
+ {
547
+ type Value = [ T ; RAND_SIZE ] ;
548
+
549
+ fn expecting ( & self , formatter : & mut fmt:: Formatter ) -> fmt:: Result {
550
+ formatter. write_str ( "Isaac state array" )
551
+ }
552
+
553
+ #[ inline]
554
+ fn visit_seq < A > ( self , mut seq : A ) -> Result < [ T ; RAND_SIZE ] , A :: Error >
555
+ where
556
+ A : SeqAccess < ' de > ,
557
+ {
558
+ let mut out = [ Default :: default ( ) ; RAND_SIZE ] ;
559
+
560
+ for i in 0 ..RAND_SIZE {
561
+ match seq. next_element ( ) ? {
562
+ Some ( val) => out[ i] = val,
563
+ None => return Err ( de:: Error :: invalid_length ( i, & self ) ) ,
564
+ } ;
565
+ }
566
+
567
+ Ok ( out)
568
+ }
569
+ }
570
+
571
+ de. deserialize_tuple ( RAND_SIZE , ArrayVisitor { _pd : PhantomData } )
572
+ }
573
+ }
574
+
504
575
// TODO: implement tests for the above
0 commit comments