diff --git a/src/rstd/atomic.rs b/src/rstd/atomic.rs index 68c7dba..1d0555e 100644 --- a/src/rstd/atomic.rs +++ b/src/rstd/atomic.rs @@ -12,6 +12,8 @@ use std::marker::PhantomData; use crate::rcore::*; +pub use self::modes::{AtomicProxy, RegularAtomic}; + use super::*; pub type AParseError = ::AParseError; @@ -26,7 +28,7 @@ pub trait AtomicBase: 'static + Send + Sync + Send + Clone + Serializable { type AParseError: Error; } -pub trait Atomic: AtomicBase { +pub trait Atomic: AtomicBase + ParseMode { /// Static equivalent of [`Factory::deserialize`]. fn a_deserialize(inlining: impl Inlining) -> AParseResult; /// Static equivalent of [`Factory::extend`]. diff --git a/src/rstd/atomic/array.rs b/src/rstd/atomic/array.rs index 4f34aa9..5046aca 100644 --- a/src/rstd/atomic/array.rs +++ b/src/rstd/atomic/array.rs @@ -38,12 +38,16 @@ impl AtomicBase for [u8; N] { type AParseError = ArrayParseError; } -impl Atomic for [u8; N] { - fn a_deserialize(inlining: impl Inlining) -> AParseResult { +impl ParseMode for [u8; N] { + type Mode = RegularMode; +} + +impl RegularAtomic for [u8; N] { + fn ra_deserialize(inlining: impl Inlining) -> AParseResult { Self::a_ideserialize(inlining).seal() } - fn a_extend(self, tail: &[u8]) -> AParseResult { + fn ra_extend(self, tail: &[u8]) -> AParseResult { Err(Self::a_extension_error(tail)) } } diff --git a/src/rstd/atomic/au64.rs b/src/rstd/atomic/au64.rs index 0016fe1..b4917d4 100644 --- a/src/rstd/atomic/au64.rs +++ b/src/rstd/atomic/au64.rs @@ -38,12 +38,16 @@ impl AtomicBase for u64 { type AParseError = IntParseError; } -impl Atomic for u64 { - fn a_deserialize(inlining: impl Inlining) -> AParseResult { +impl ParseMode for u64 { + type Mode = RegularMode; +} + +impl RegularAtomic for u64 { + fn ra_deserialize(inlining: impl Inlining) -> AParseResult { Self::a_ideserialize(inlining).seal() } - fn a_extend(self, tail: &[u8]) -> AParseResult { + fn ra_extend(self, tail: &[u8]) -> AParseResult { Err(Self::a_extension_error(tail)) } } diff --git a/src/rstd/atomic/boolean.rs b/src/rstd/atomic/boolean.rs index 2b0aca7..b873a08 100644 --- a/src/rstd/atomic/boolean.rs +++ b/src/rstd/atomic/boolean.rs @@ -45,12 +45,16 @@ impl AtomicBase for bool { type AParseError = BooleanParseError; } -impl Atomic for bool { - fn a_deserialize(inlining: impl Inlining) -> AParseResult { +impl ParseMode for bool { + type Mode = RegularMode; +} + +impl RegularAtomic for bool { + fn ra_deserialize(inlining: impl Inlining) -> AParseResult { Self::a_ideserialize(inlining).seal() } - fn a_extend(self, tail: &[u8]) -> AParseResult { + fn ra_extend(self, tail: &[u8]) -> AParseResult { Err(Self::a_extension_error(tail)) } } diff --git a/src/rstd/atomic/plain.rs b/src/rstd/atomic/plain.rs index fdc79dd..0214ab4 100644 --- a/src/rstd/atomic/plain.rs +++ b/src/rstd/atomic/plain.rs @@ -32,12 +32,16 @@ impl AtomicBase for Plain { type AParseError = PlainParseError; } -impl Atomic for Plain { - fn a_deserialize(inlining: impl Inlining) -> AParseResult { +impl ParseMode for Plain { + type Mode = RegularMode; +} + +impl RegularAtomic for Plain { + fn ra_deserialize(inlining: impl Inlining) -> AParseResult { Ok(inlining.iread_all(Plain::from_slice)) } - fn a_extend(mut self, tail: &[u8]) -> AParseResult { + fn ra_extend(mut self, tail: &[u8]) -> AParseResult { self.data.extend_from_slice(tail); Ok(self) }