This commit is contained in:
AF 2023-07-29 19:59:42 +00:00
parent 78e74fbf35
commit bd62ae8dbb
2 changed files with 29 additions and 5 deletions

View File

@ -54,7 +54,7 @@ impl<'a, Ctx: Context<'a>, F: FactoryModeParse<'a, Ctx>> FactoryParse<'a, Ctx> f
} }
fn extend(&self, mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self> { fn extend(&self, mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self> {
<<Self as ParseMode>::Mode as Mode>::xseal(self.mextend(mentionable, tail)) <<Self as ParseMode>::Mode as Mode>::xseal(self.mextend(Self::mprepare(mentionable), tail))
} }
} }
@ -76,7 +76,14 @@ pub type ExtensionSourceM<'a, Ctx, F> =
pub trait FactoryModeParse<'a, Ctx: Context<'a>>: FactoryBase<'a, Ctx> + ParseMode { pub trait FactoryModeParse<'a, Ctx: Context<'a>>: FactoryBase<'a, Ctx> + ParseMode {
fn mdeserialize<I: InCtx<'a, Ctx>>(&self, inctx: I) -> ParseResultM<'a, Ctx, Self, I>; fn mdeserialize<I: InCtx<'a, Ctx>>(&self, inctx: I) -> ParseResultM<'a, Ctx, Self, I>;
fn mextend(&self, mentionable: Self::Mtbl, tail: &[u8]) -> ExtensionResultM<'a, Ctx, Self>;
fn mextend(
&self,
mentionable: ExtensionSourceM<'a, Ctx, Self>,
tail: &[u8],
) -> ExtensionResultM<'a, Ctx, Self>;
fn mprepare(mentionable: Self::Mtbl) -> ExtensionSourceM<'a, Ctx, Self>;
} }
pub trait FactoryModeProxy<'a, Ctx: Context<'a>> { pub trait FactoryModeProxy<'a, Ctx: Context<'a>> {
@ -84,11 +91,14 @@ pub trait FactoryModeProxy<'a, Ctx: Context<'a>> {
fn pmdeserialize<I: InCtx<'a, Ctx>>(f: &Self::F, inctx: I) fn pmdeserialize<I: InCtx<'a, Ctx>>(f: &Self::F, inctx: I)
-> ParseResultM<'a, Ctx, Self::F, I>; -> ParseResultM<'a, Ctx, Self::F, I>;
fn pmextend( fn pmextend(
f: &Self::F, f: &Self::F,
mentionable: Mtbl<'a, Ctx, Self::F>, mentionable: ExtensionSourceM<'a, Ctx, Self::F>,
tail: &[u8], tail: &[u8],
) -> ExtensionResultM<'a, Ctx, Self::F>; ) -> ExtensionResultM<'a, Ctx, Self::F>;
fn pmprepare(mentionable: Mtbl<'a, Ctx, Self::F>) -> ExtensionSourceM<'a, Ctx, Self::F>;
} }
impl<'a, Ctx: Context<'a>, F: FactoryBase<'a, Ctx> + WithParseMode> FactoryModeParse<'a, Ctx> for F impl<'a, Ctx: Context<'a>, F: FactoryBase<'a, Ctx> + WithParseMode> FactoryModeParse<'a, Ctx> for F
@ -99,9 +109,17 @@ where
<F::WithMode as FactoryModeProxy<'a, Ctx>>::pmdeserialize(self, inctx) <F::WithMode as FactoryModeProxy<'a, Ctx>>::pmdeserialize(self, inctx)
} }
fn mextend(&self, mentionable: Self::Mtbl, tail: &[u8]) -> ExtensionResultM<'a, Ctx, Self> { fn mextend(
&self,
mentionable: ExtensionSourceM<'a, Ctx, Self>,
tail: &[u8],
) -> ExtensionResultM<'a, Ctx, Self> {
<F::WithMode as FactoryModeProxy<'a, Ctx>>::pmextend(self, mentionable, tail) <F::WithMode as FactoryModeProxy<'a, Ctx>>::pmextend(self, mentionable, tail)
} }
fn mprepare(mentionable: Self::Mtbl) -> ExtensionSourceM<'a, Ctx, Self> {
<F::WithMode as FactoryModeProxy<'a, Ctx>>::pmprepare(mentionable)
}
} }
pub struct RegularMode; pub struct RegularMode;
@ -169,4 +187,8 @@ impl<'a, Ctx: Context<'a>, F: RegularFactory<'a, Ctx>> FactoryModeProxy<'a, Ctx>
fn pmextend(f: &F, mentionable: Mtbl<'a, Ctx, F>, tail: &[u8]) -> ExtensionResultM<'a, Ctx, F> { fn pmextend(f: &F, mentionable: Mtbl<'a, Ctx, F>, tail: &[u8]) -> ExtensionResultM<'a, Ctx, F> {
f.rextend(mentionable, tail) f.rextend(mentionable, tail)
} }
fn pmprepare(mentionable: Mtbl<'a, Ctx, Self::F>) -> ExtensionSourceM<'a, Ctx, Self::F> {
mentionable
}
} }

View File

@ -59,11 +59,13 @@ impl<'a, Ctx: Context<'a>, F: InlineableFactory<'a, Ctx>> FactoryModeProxy<'a, C
fn pmextend( fn pmextend(
f: &F, f: &F,
_mentionable: Mtbl<'a, Ctx, F>, _mentionable: ExtensionSourceM<'a, Ctx, F>,
tail: &[u8], tail: &[u8],
) -> ExtensionResultM<'a, Ctx, F> { ) -> ExtensionResultM<'a, Ctx, F> {
f.extension_error(tail) f.extension_error(tail)
} }
fn pmprepare(_mentionable: Mtbl<'a, Ctx, Self::F>) -> ExtensionSourceM<'a, Ctx, Self::F> {}
} }
impl<A: InlineableAtomic> AtomicProxy for WithMode<A, InliningMode> { impl<A: InlineableAtomic> AtomicProxy for WithMode<A, InliningMode> {