use super::*; impl Atomic for A { fn a_deserialize(inlining: impl Inlining) -> AParseResult { Self::ma_deserialize(inlining).map(::seal) } fn a_extend(self, tail: &[u8]) -> AParseResult { ::xseal(Self::ma_extend(::prepare(self), tail)) } } pub type AParseResultM = ModeResult<::Mode, A, AParseError, 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; } pub trait AtomicModeProxy { type A: AtomicBase + ParseMode; fn pma_deserialize(inlining: I) -> AParseResultM; fn pma_extend(atomic: AExtensionSourceM, tail: &[u8]) -> AExtensionResultM; } 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) } } 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) } }