use crate::multiplier::Multiplier;
use crate::numops::BitSize;
use crate::outputmix::OutputMixin;
use crate::stream::{SpecificSeqStream, Stream};
use crate::PcgEngine;
use num_traits::Zero;
#[cfg(not(feature = "no_deserialize_verify"))]
use serde::de::Error;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
impl<'de, Itype, Xtype, MulMix, OutMix> Deserialize<'de>
for PcgEngine<Itype, Xtype, SpecificSeqStream<Itype>, MulMix, OutMix>
where
Itype: Copy + Eq + Zero + BitSize + Deserialize<'de>,
SpecificSeqStream<Itype>: Stream<Itype>,
Xtype: BitSize,
MulMix: Multiplier<Itype>,
OutMix: OutputMixin<Itype, Xtype>,
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let state = crate::PCGStateInfo::deserialize(deserializer)?;
#[cfg(feature = "no_deserialize_verify")]
{
Ok(Self::restore_state_with_no_verification(state))
}
#[cfg(not(feature = "no_deserialize_verify"))]
{
Self::restore_state(state).map_err(|e| Error::custom(e))
}
}
}
impl<Itype, Xtype, StreamMix, MulMix, OutMix> Serialize
for PcgEngine<Itype, Xtype, StreamMix, MulMix, OutMix>
where
Itype: Copy + BitSize + Serialize,
Xtype: BitSize,
StreamMix: Stream<Itype>,
MulMix: Multiplier<Itype>,
OutMix: OutputMixin<Itype, Xtype>,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let state = self.get_state();
state.serialize(serializer)
}
}