Skip to content

Commit c48e4cc

Browse files
committed
WIP
1 parent acc9c5f commit c48e4cc

File tree

2 files changed

+81
-6
lines changed

2 files changed

+81
-6
lines changed

rand_core/src/impls.rs

Lines changed: 75 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,9 @@ pub fn next_u64_via_fill<R: RngCore + ?Sized>(rng: &mut R) -> u64 {
184184
/// [`RngCore`]: ../RngCore.t.html
185185
/// [`SeedableRng`]: ../SeedableRng.t.html
186186
#[derive(Clone)]
187-
#[cfg_attr(feature="serde-1", derive(Serialize,Deserialize))]
187+
#[cfg_attr(feature="serde-1", derive(Serialize))]
188188
pub struct BlockRng<R: BlockRngCore + ?Sized> {
189+
#[cfg_attr(feature="serde-1", serde(with="serde_asref"))]
189190
pub results: R::Results,
190191
pub index: usize,
191192
pub core: R,
@@ -203,7 +204,7 @@ impl<R: BlockRngCore + fmt::Debug> fmt::Debug for BlockRng<R> {
203204
}
204205

205206
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
207208
{
208209
#[inline(always)]
209210
fn next_u32(&mut self) -> u32 {
@@ -349,7 +350,7 @@ impl<R: BlockRngCore + SeedableRng> SeedableRng for BlockRng<R> {
349350
/// [`RngCore`]: ../RngCore.t.html
350351
/// [`BlockRng`]: .BlockRng.s.html
351352
#[derive(Clone)]
352-
#[cfg_attr(feature="serde-1", derive(Serialize,Deserialize))]
353+
//#[cfg_attr(feature="serde-1", derive(Serialize,Deserialize))]
353354
pub struct BlockRng64<R: BlockRngCore + ?Sized> {
354355
pub results: R::Results,
355356
pub index: usize,
@@ -370,7 +371,7 @@ impl<R: BlockRngCore + fmt::Debug> fmt::Debug for BlockRng64<R> {
370371
}
371372

372373
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
374375
{
375376
#[inline(always)]
376377
fn next_u32(&mut self) -> u32 {
@@ -501,4 +502,74 @@ impl<R: BlockRngCore + SeedableRng> SeedableRng for BlockRng64<R> {
501502

502503
impl<R: BlockRngCore + CryptoRng> CryptoRng for BlockRng<R> {}
503504

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+
504575
// TODO: implement tests for the above

rand_core/src/lib.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ use core::default::Default;
5252
use core::convert::AsMut;
5353

5454
#[cfg(all(feature="alloc", not(feature="std")))] use alloc::boxed::Box;
55+
#[cfg(feature="serde-1")] use serde::{Serialize, Deserialize};
5556

5657
pub use error::{ErrorKind, Error};
5758

@@ -231,11 +232,14 @@ pub trait RngCore {
231232
/// [`fill_bytes`]: trait.RngCore.html#tymethod.fill_bytes
232233
pub trait BlockRngCore {
233234
/// Results element type, e.g. `u32`.
235+
#[cfg(not(feature="serde-1"))]
234236
type Item;
235-
237+
#[cfg(feature="serde-1")]
238+
type Item: Serialize;
239+
236240
/// Results type. This is the 'block' an RNG implementing `BlockRngCore`
237241
/// generates, which will usually be an array like `[u32; 16]`.
238-
type Results: AsRef<[Self::Item]> + Default;
242+
type Results: AsRef<[Self::Item]> + AsMut<[Self::Item]> + Default;
239243

240244
/// Generate a new block of results.
241245
fn generate(&mut self, results: &mut Self::Results);

0 commit comments

Comments
 (0)