radn-rs/src/rstd/atomic/modes.rs
2023-07-29 23:39:09 +00:00

63 lines
2.1 KiB
Rust

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