use super::*; impl Atomic for A { fn a_deserialize(inlining: impl Inlining) -> AParseResult { ::seal(Self::ma_deserialize(inlining)) } fn a_extend(self, tail: &[u8]) -> AParseResult { ::xseal(Self::ma_extend(self.ma_prepare(), tail)) } } pub type AParseResultM = <::Mode as Mode>::ParseResult, I>; pub type AExtensionResultM = <::Mode as Mode>::ExtensionResult>; pub type AExtensionSourceM = <::Mode as Mode>::ExtensionSource>; pub trait AtomicModeParse: AtomicBase + ParseMode { fn ma_deserialize(inlining: I) -> AParseResultM; fn ma_extend(atomic: AExtensionSourceM, tail: &[u8]) -> AExtensionResultM; fn ma_prepare(self) -> AExtensionSourceM; } pub trait AtomicModeProxy { type A: AtomicBase + ParseMode; fn pma_deserialize(inlining: I) -> AParseResultM; fn pma_extend(atomic: AExtensionSourceM, tail: &[u8]) -> AExtensionResultM; fn pma_prepare(atomic: Self::A) -> AExtensionSourceM; } impl AtomicModeParse for A where ::WithMode: AtomicModeProxy, { fn ma_deserialize(inlining: I) -> AParseResultM { <::WithMode as AtomicModeProxy>::pma_deserialize(inlining) } fn ma_extend(atomic: AExtensionSourceM, tail: &[u8]) -> AExtensionResultM { <::WithMode as AtomicModeProxy>::pma_extend(atomic, tail) } fn ma_prepare(self) -> AExtensionSourceM { <::WithMode as AtomicModeProxy>::pma_prepare(self) } } pub trait RegularAtomic: AtomicBase + ParseMode { fn ra_deserialize(inlining: impl Inlining) -> AParseResult; fn ra_extend(self, tail: &[u8]) -> AParseResult; } impl AtomicModeProxy for WithMode { type A = A; fn pma_deserialize(inlining: I) -> AParseResultM { A::ra_deserialize(inlining) } fn pma_extend(atomic: AExtensionSourceM, tail: &[u8]) -> AExtensionResultM { atomic.ra_extend(tail) } fn pma_prepare(atomic: Self::A) -> AExtensionSourceM { atomic } }