From bab0b4169e4fa9b23762a7cb4a5cba4c0ad56589 Mon Sep 17 00:00:00 2001 From: timofey Date: Fri, 30 Jun 2023 22:02:38 +0000 Subject: [PATCH] inlining dyn box --- src/rstd/inlining.rs | 52 +++++++++++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/src/rstd/inlining.rs b/src/rstd/inlining.rs index eb7f5cc..257a85e 100644 --- a/src/rstd/inlining.rs +++ b/src/rstd/inlining.rs @@ -90,16 +90,20 @@ impl<'a: 'c, 'c, Ctx: Context<'a>> InCtx<'a, Ctx> for &'c mut dyn DeCtx<'a, Ctx> pub type ResultDyn = Result<(A, I), Vec>; -pub trait InliningDyn<'c>: 'c { - fn idread_n(self, n: usize) -> ResultDyn, Box>>; +pub trait InCtxDyn<'a: 'c, 'c, Ctx: Context<'a>>: 'c { + fn idread_n(self, n: usize) -> ResultDyn, Box>>; fn idread_all(self) -> Vec; fn idtell(&self) -> usize; + + fn idnext_address(self) -> ResultDyn>>; + + fn idresolver(&self) -> Rc>; } -impl<'c, I: 'c + Inlining> InliningDyn<'c> for I { - fn idread_n(self, n: usize) -> ResultDyn, Box>> { +impl<'a: 'c, 'c, Ctx: Context<'a>, I: 'c + InCtx<'a, Ctx>> InCtxDyn<'a, 'c, Ctx> for I { + fn idread_n(self, n: usize) -> ResultDyn, Box>> { let (vec, i) = self.iread_n(n, |slice| Vec::from(slice), |slice| Vec::from(slice))?; Ok((vec, Box::new(i))) } @@ -111,16 +115,8 @@ impl<'c, I: 'c + Inlining> InliningDyn<'c> for I { fn idtell(&self) -> usize { self.itell() } -} -pub trait InCtxDyn<'a: 'c, 'c, Ctx: Context<'a>>: InliningDyn<'c> { - fn icdnext_address(self) -> ResultDyn>>; - - fn idresolver(&self) -> Rc>; -} - -impl<'a: 'c, 'c, Ctx: Context<'a>, I: 'c + InCtx<'a, Ctx>> InCtxDyn<'a, 'c, Ctx> for I { - fn icdnext_address(self) -> ResultDyn>> { + fn idnext_address(self) -> ResultDyn>> { let (address, i) = self.icnext_address(|slice| Vec::from(slice))?; Ok((address, Box::new(i))) } @@ -130,6 +126,36 @@ impl<'a: 'c, 'c, Ctx: Context<'a>, I: 'c + InCtx<'a, Ctx>> InCtxDyn<'a, 'c, Ctx> } } +impl<'a: 'c, 'c, Ctx: Context<'a>> Inlining for Box> { + fn iread_n( + self, + n: usize, + ok: impl FnOnce(&[u8]) -> A, + err: impl FnOnce(&[u8]) -> E, + ) -> Result<(A, Self), E> { + let (vec, i) = self.idread_n(n).map_err(|vec| err(&vec))?; + Ok((ok(&vec), i)) + } + + fn iread_all(self, ok: impl FnOnce(&[u8]) -> A) -> A { + ok(&self.idread_all()) + } + + fn itell(&self) -> usize { + self.idtell() + } +} + +impl<'a: 'c, 'c, Ctx: Context<'a>> InCtx<'a, Ctx> for Box> { + fn icnext_address(self, err: impl FnOnce(&[u8]) -> E) -> Result<(Address, Self), E> { + self.idnext_address().map_err(|vec| err(&vec)) + } + + fn iresolver(&self) -> Rc> { + self.idresolver() + } +} + pub type IParseResult<'a, Ctx, F, I> = Result<(Mtbl<'a, Ctx, F>, I), >::ParseError>;