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, { fn a_deserialize(inlining: impl Inlining) -> AParseResult { ::pa_deserialize(inlining) } fn a_extend(self, tail: &[u8]) -> AParseResult { ::pa_extend(self, 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 + ImplMode { fn ra_deserialize(inlining: impl Inlining) -> AParseResult; fn ra_extend(self, tail: &[u8]) -> AParseResult; } impl AtomicProxy for WithMode { type A = A; fn pa_deserialize(inlining: impl Inlining) -> AParseResult { A::ra_deserialize(inlining) } fn pa_extend(a: Self::A, tail: &[u8]) -> AParseResult { a.ra_extend(tail) } }