diff --git a/src/rcore.rs b/src/rcore.rs index 62d415d..31ba66e 100644 --- a/src/rcore.rs +++ b/src/rcore.rs @@ -4,6 +4,7 @@ mod addresses; mod context; +mod dectx; mod diagnostic; mod hashing; mod inctx; @@ -23,6 +24,8 @@ use crate::func::*; pub use self::addresses::{Addresses, InliningAddresses}; pub use self::context::Context; +pub use self::dectx::DeCtx; +use self::dectx::DeCtxT; pub use self::diagnostic::Diagnostic; pub use self::hashing::{Hash, HASH_SIZE, HASH_ZEROS}; pub use self::inctx::InCtx; @@ -66,58 +69,6 @@ pub type ParseResult<'a, Ctx, F> = Result, = Result>; -pub struct DeCtxT<'a: 'c, 'c, Ctx: Context<'a>> { - deserializer: &'c mut dyn Deserializer, - resolver: &'c Rc>, - addresses: &'c mut Addresses, -} - -pub trait DeCtx<'a, Ctx: Context<'a>> { - fn deserializer(&mut self) -> &mut dyn Deserializer; - - fn tell(&self) -> usize; - - fn next_address(&mut self) -> Result; - - fn resolver(&self) -> Rc>; - - fn adr( - &mut self, - ) -> ( - &mut Addresses, - &mut dyn Deserializer, - &Rc>, - ); -} - -impl<'a: 'c, 'c, Ctx: Context<'a>> DeCtx<'a, Ctx> for DeCtxT<'a, 'c, Ctx> { - fn deserializer(&mut self) -> &mut dyn Deserializer { - self.deserializer - } - - fn tell(&self) -> usize { - self.deserializer.tell() - } - - fn next_address(&mut self) -> Result { - self.addresses.next(self.deserializer) - } - - fn resolver(&self) -> Rc> { - self.resolver.clone() - } - - fn adr( - &mut self, - ) -> ( - &mut Addresses, - &mut dyn Deserializer, - &Rc>, - ) { - (&mut self.addresses, self.deserializer, self.resolver) - } -} - /// Trait representing deserialisation rules for [Mentionable]s. /// Crucial for [`crate::rstd::typeless`]. pub trait Factory<'a, Ctx: Context<'a>>: 'a + Send + Sync + Clone { diff --git a/src/rcore/dectx.rs b/src/rcore/dectx.rs new file mode 100644 index 0000000..2d4aa47 --- /dev/null +++ b/src/rcore/dectx.rs @@ -0,0 +1,53 @@ +use super::*; + +pub struct DeCtxT<'a: 'c, 'c, Ctx: Context<'a>> { + pub deserializer: &'c mut dyn Deserializer, + pub resolver: &'c Rc>, + pub addresses: &'c mut Addresses, +} + +pub trait DeCtx<'a, Ctx: Context<'a>> { + fn deserializer(&mut self) -> &mut dyn Deserializer; + + fn tell(&self) -> usize; + + fn next_address(&mut self) -> Result; + + fn resolver(&self) -> Rc>; + + fn adr( + &mut self, + ) -> ( + &mut Addresses, + &mut dyn Deserializer, + &Rc>, + ); +} + +impl<'a: 'c, 'c, Ctx: Context<'a>> DeCtx<'a, Ctx> for DeCtxT<'a, 'c, Ctx> { + fn deserializer(&mut self) -> &mut dyn Deserializer { + self.deserializer + } + + fn tell(&self) -> usize { + self.deserializer.tell() + } + + fn next_address(&mut self) -> Result { + self.addresses.next(self.deserializer) + } + + fn resolver(&self) -> Rc> { + self.resolver.clone() + } + + fn adr( + &mut self, + ) -> ( + &mut Addresses, + &mut dyn Deserializer, + &Rc>, + ) { + (&mut self.addresses, self.deserializer, self.resolver) + } +}