From 4697d71436f2f94e8e65f924d4a2f026479d4142 Mon Sep 17 00:00:00 2001 From: timofey Date: Sat, 29 Jul 2023 20:44:45 +0000 Subject: [PATCH] `Atomic` via `AtomicModeProxy` --- src/rstd/atomic.rs | 2 +- src/rstd/atomic/atomic_object.rs | 2 +- src/rstd/atomic/modes.rs | 25 +++++++++++-------------- src/rstd/inlining/modes.rs | 12 +++++++----- 4 files changed, 20 insertions(+), 21 deletions(-) diff --git a/src/rstd/atomic.rs b/src/rstd/atomic.rs index 57915c2..21f2fd9 100644 --- a/src/rstd/atomic.rs +++ b/src/rstd/atomic.rs @@ -15,7 +15,7 @@ use crate::rcore::*; use super::*; pub use self::modes::{ - AExtensionResultM, AExtensionSourceM, AParseResultM, AtomicModeParse, AtomicProxy, + AExtensionResultM, AExtensionSourceM, AParseResultM, AtomicModeParse, AtomicModeProxy, RegularAtomic, }; diff --git a/src/rstd/atomic/atomic_object.rs b/src/rstd/atomic/atomic_object.rs index 1a6b839..b920dad 100644 --- a/src/rstd/atomic/atomic_object.rs +++ b/src/rstd/atomic/atomic_object.rs @@ -36,7 +36,7 @@ impl Serializable for AtomicObject { } } -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>; diff --git a/src/rstd/atomic/modes.rs b/src/rstd/atomic/modes.rs index b38f5fa..2fe5e68 100644 --- a/src/rstd/atomic/modes.rs +++ b/src/rstd/atomic/modes.rs @@ -1,22 +1,15 @@ use super::*; -pub trait AtomicProxy { - type A: AtomicBase + ParseMode; - - fn pa_deserialize(inlining: impl Inlining) -> AParseResult; - fn pa_extend(a: Self::A, tail: &[u8]) -> AParseResult; -} - impl Atomic for A where - A::WithMode: AtomicProxy, + A::WithMode: AtomicModeProxy, { fn a_deserialize(inlining: impl Inlining) -> AParseResult { - ::pa_deserialize(inlining) + ::seal(Self::ma_deserialize(inlining)) } fn a_extend(self, tail: &[u8]) -> AParseResult { - ::pa_extend(self, tail) + ::xseal(Self::ma_extend(self.ma_prepare(), tail)) } } @@ -68,14 +61,18 @@ pub trait RegularAtomic: AtomicBase + ParseMode { fn ra_extend(self, tail: &[u8]) -> AParseResult; } -impl AtomicProxy for WithMode { +impl AtomicModeProxy for WithMode { type A = A; - fn pa_deserialize(inlining: impl Inlining) -> AParseResult { + fn pma_deserialize(inlining: I) -> AParseResultM { A::ra_deserialize(inlining) } - fn pa_extend(a: Self::A, tail: &[u8]) -> AParseResult { - a.ra_extend(tail) + fn pma_extend(atomic: AExtensionSourceM, tail: &[u8]) -> AExtensionResultM { + atomic.ra_extend(tail) + } + + fn pma_prepare(atomic: Self::A) -> AExtensionSourceM { + atomic } } diff --git a/src/rstd/inlining/modes.rs b/src/rstd/inlining/modes.rs index 03e4caa..975f46e 100644 --- a/src/rstd/inlining/modes.rs +++ b/src/rstd/inlining/modes.rs @@ -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 AtomicProxy for WithMode { +impl AtomicModeProxy for WithMode { type A = A; - fn pa_deserialize(inlining: impl Inlining) -> AParseResult { - A::a_ideserialize(inlining).seal() + fn pma_deserialize(inlining: I) -> AParseResultM { + A::a_ideserialize(inlining) } - fn pa_extend(_a: Self::A, tail: &[u8]) -> AParseResult { - Err(A::a_extension_error(tail)) + fn pma_extend(_atomic: AExtensionSourceM, tail: &[u8]) -> AExtensionResultM { + A::a_extension_error(tail) } + + fn pma_prepare(_atomic: Self::A) -> AExtensionSourceM {} }