Atomic: ParseMode

This commit is contained in:
AF 2023-07-28 21:37:35 +00:00
parent cf5390fbec
commit 53266188a3
5 changed files with 31 additions and 13 deletions

View File

@ -12,6 +12,8 @@ use std::marker::PhantomData;
use crate::rcore::*;
pub use self::modes::{AtomicProxy, RegularAtomic};
use super::*;
pub type AParseError<A> = <A as AtomicBase>::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<Self>;
/// Static equivalent of [`Factory::extend`].

View File

@ -38,12 +38,16 @@ impl<const N: usize> AtomicBase for [u8; N] {
type AParseError = ArrayParseError;
}
impl<const N: usize> Atomic for [u8; N] {
fn a_deserialize(inlining: impl Inlining) -> AParseResult<Self> {
impl<const N: usize> ParseMode for [u8; N] {
type Mode = RegularMode;
}
impl<const N: usize> RegularAtomic for [u8; N] {
fn ra_deserialize(inlining: impl Inlining) -> AParseResult<Self> {
Self::a_ideserialize(inlining).seal()
}
fn a_extend(self, tail: &[u8]) -> AParseResult<Self> {
fn ra_extend(self, tail: &[u8]) -> AParseResult<Self> {
Err(Self::a_extension_error(tail))
}
}

View File

@ -38,12 +38,16 @@ impl AtomicBase for u64 {
type AParseError = IntParseError;
}
impl Atomic for u64 {
fn a_deserialize(inlining: impl Inlining) -> AParseResult<Self> {
impl ParseMode for u64 {
type Mode = RegularMode;
}
impl RegularAtomic for u64 {
fn ra_deserialize(inlining: impl Inlining) -> AParseResult<Self> {
Self::a_ideserialize(inlining).seal()
}
fn a_extend(self, tail: &[u8]) -> AParseResult<Self> {
fn ra_extend(self, tail: &[u8]) -> AParseResult<Self> {
Err(Self::a_extension_error(tail))
}
}

View File

@ -45,12 +45,16 @@ impl AtomicBase for bool {
type AParseError = BooleanParseError;
}
impl Atomic for bool {
fn a_deserialize(inlining: impl Inlining) -> AParseResult<Self> {
impl ParseMode for bool {
type Mode = RegularMode;
}
impl RegularAtomic for bool {
fn ra_deserialize(inlining: impl Inlining) -> AParseResult<Self> {
Self::a_ideserialize(inlining).seal()
}
fn a_extend(self, tail: &[u8]) -> AParseResult<Self> {
fn ra_extend(self, tail: &[u8]) -> AParseResult<Self> {
Err(Self::a_extension_error(tail))
}
}

View File

@ -32,12 +32,16 @@ impl AtomicBase for Plain {
type AParseError = PlainParseError;
}
impl Atomic for Plain {
fn a_deserialize(inlining: impl Inlining) -> AParseResult<Self> {
impl ParseMode for Plain {
type Mode = RegularMode;
}
impl RegularAtomic for Plain {
fn ra_deserialize(inlining: impl Inlining) -> AParseResult<Self> {
Ok(inlining.iread_all(Plain::from_slice))
}
fn a_extend(mut self, tail: &[u8]) -> AParseResult<Self> {
fn ra_extend(mut self, tail: &[u8]) -> AParseResult<Self> {
self.data.extend_from_slice(tail);
Ok(self)
}