Atomic via AtomicModeProxy

This commit is contained in:
AF 2023-07-29 20:44:45 +00:00
parent 0d8a10fae6
commit 4697d71436
4 changed files with 20 additions and 21 deletions

View File

@ -15,7 +15,7 @@ use crate::rcore::*;
use super::*;
pub use self::modes::{
AExtensionResultM, AExtensionSourceM, AParseResultM, AtomicModeParse, AtomicProxy,
AExtensionResultM, AExtensionSourceM, AParseResultM, AtomicModeParse, AtomicModeProxy,
RegularAtomic,
};

View File

@ -36,7 +36,7 @@ impl<A: AtomicBase> Serializable for AtomicObject<A> {
}
}
pub trait AoProxy<'a, Ctx: Context<'a>>: AtomicProxy {
pub trait AoProxy<'a, Ctx: Context<'a>>: AtomicModeProxy {
type Mtbl: MentionableBase<'a, Ctx, Fctr = Self::Fctr> + MentionableTop<'a, Ctx>;
type Fctr: FactoryBase<'a, Ctx, Mtbl = Self::Mtbl>;

View File

@ -1,22 +1,15 @@
use super::*;
pub trait AtomicProxy {
type A: AtomicBase + ParseMode;
fn pa_deserialize(inlining: impl Inlining) -> AParseResult<Self::A>;
fn pa_extend(a: Self::A, tail: &[u8]) -> AParseResult<Self::A>;
}
impl<A: AtomicBase + WithParseMode> Atomic for A
where
A::WithMode: AtomicProxy<A = Self>,
A::WithMode: AtomicModeProxy<A = Self>,
{
fn a_deserialize(inlining: impl Inlining) -> AParseResult<Self> {
<A::WithMode as AtomicProxy>::pa_deserialize(inlining)
<A::Mode as Mode>::seal(Self::ma_deserialize(inlining))
}
fn a_extend(self, tail: &[u8]) -> AParseResult<Self> {
<A::WithMode as AtomicProxy>::pa_extend(self, tail)
<A::Mode as Mode>::xseal(Self::ma_extend(self.ma_prepare(), tail))
}
}
@ -68,14 +61,18 @@ pub trait RegularAtomic: AtomicBase + ParseMode<Mode = RegularMode> {
fn ra_extend(self, tail: &[u8]) -> AParseResult<Self>;
}
impl<A: RegularAtomic> AtomicProxy for WithMode<A, RegularMode> {
impl<A: RegularAtomic> AtomicModeProxy for WithMode<A, RegularMode> {
type A = A;
fn pa_deserialize(inlining: impl Inlining) -> AParseResult<Self::A> {
fn pma_deserialize<I: Inlining>(inlining: I) -> AParseResultM<Self::A, I> {
A::ra_deserialize(inlining)
}
fn pa_extend(a: Self::A, tail: &[u8]) -> AParseResult<Self::A> {
a.ra_extend(tail)
fn pma_extend(atomic: AExtensionSourceM<Self::A>, tail: &[u8]) -> AExtensionResultM<Self::A> {
atomic.ra_extend(tail)
}
fn pma_prepare(atomic: Self::A) -> AExtensionSourceM<Self::A> {
atomic
}
}

View File

@ -68,14 +68,16 @@ impl<'a, Ctx: Context<'a>, F: InliningFactory<'a, Ctx>> FactoryModeProxy<'a, Ctx
fn pmprepare(_mentionable: Mtbl<'a, Ctx, Self::F>) -> ExtensionSourceM<'a, Ctx, Self::F> {}
}
impl<A: InliningAtomic> AtomicProxy for WithMode<A, InliningMode> {
impl<A: InliningAtomic> AtomicModeProxy for WithMode<A, InliningMode> {
type A = A;
fn pa_deserialize(inlining: impl Inlining) -> AParseResult<Self::A> {
A::a_ideserialize(inlining).seal()
fn pma_deserialize<I: Inlining>(inlining: I) -> AParseResultM<Self::A, I> {
A::a_ideserialize(inlining)
}
fn pa_extend(_a: Self::A, tail: &[u8]) -> AParseResult<Self::A> {
Err(A::a_extension_error(tail))
fn pma_extend(_atomic: AExtensionSourceM<Self::A>, tail: &[u8]) -> AExtensionResultM<Self::A> {
A::a_extension_error(tail)
}
fn pma_prepare(_atomic: Self::A) -> AExtensionSourceM<Self::A> {}
}