diff --git a/src/atomic/inlining.rs b/src/atomic/inlining.rs index dad4fc0..3d4b556 100644 --- a/src/atomic/inlining.rs +++ b/src/atomic/inlining.rs @@ -10,7 +10,7 @@ pub trait CInliningAtomic: AtomicBase + ImplMode { /// Atomic analogue of [`InliningFactory`]/[`InliningObject`]. /// -/// [`InliningFactory`]: crate::rstd::inlining::InliningFactory +/// [`InliningFactory`]: crate::rcore::InliningFactory /// [`InliningObject`]: crate::rstd::inlining::InliningObject pub trait InliningAtomic: AtomicBase + ParseMode { fn a_extension_error(tail: &[u8]) -> Self::AParseError; @@ -27,3 +27,15 @@ impl> InliningAtomic for A { A::ma_deserialize(stream) } } + +impl AtomicModeProxy for WithMode { + type A = A; + + fn pma_deserialize(stream: I) -> AModeResultM { + A::ca_ideserialize(stream) + } + + fn pma_extend(_atomic: AExtensionSourceM, tail: &[u8]) -> AExtensionResultM { + A::ca_extension_error(tail) + } +} diff --git a/src/mode.rs b/src/mode.rs index a5f476a..4fd1f84 100644 --- a/src/mode.rs +++ b/src/mode.rs @@ -56,7 +56,7 @@ pub trait Mode { /// /// See also [`Mode::map`] /// - /// [`InliningFactory`]: crate::rstd::inlining::InliningFactory + /// [`InliningFactory`]: crate::rcore::InliningFactory fn bind( s: Self::ParseSuccess, f: impl FnOnce(A0) -> Result, @@ -79,7 +79,7 @@ pub trait Mode { /// /// Useful for for wrappers and chaining parsing after [`InliningFactory`]. /// - /// [`InliningFactory`]: crate::rstd::inlining::InliningFactory + /// [`InliningFactory`]: crate::rcore::InliningFactory fn xmap_err( result: Self::ExtensionResult, f: impl FnOnce(E0) -> E1, @@ -89,7 +89,7 @@ pub trait Mode { /// /// Useful for wrappers and chaining extension after [`InliningFactory`]. /// - /// [`InliningFactory`]: crate::rstd::inlining::InliningFactory + /// [`InliningFactory`]: crate::rcore::InliningFactory fn xbind( result: Self::ExtensionResult, f: impl FnOnce(A0) -> Result, diff --git a/src/mode/inlining.rs b/src/mode/inlining.rs index 4ce34b9..a691e53 100644 --- a/src/mode/inlining.rs +++ b/src/mode/inlining.rs @@ -2,7 +2,7 @@ use super::*; /// [`Mode`] for [`InliningFactory`]. /// -/// [`InliningFactory`]: crate::rstd::inlining::InliningFactory +/// [`InliningFactory`]: crate::rcore::InliningFactory /// [`InliningAtomic`]: crate::rstd::atomic::InliningAtomic pub struct InliningMode; diff --git a/src/rcore.rs b/src/rcore.rs index 88257d1..23fc846 100644 --- a/src/rcore.rs +++ b/src/rcore.rs @@ -9,6 +9,7 @@ mod demoted; mod diagnostic; mod hashing; mod inctx; +mod inlining; mod modes; mod origin; mod point; @@ -30,6 +31,7 @@ pub use self::demoted::Demoted; pub use self::diagnostic::Diagnostic; pub use self::hashing::{Hash, HASH_SIZE, HASH_ZEROS}; pub use self::inctx::InCtx; +pub use self::inlining::{CInliningFactory, IParseResult, InliningFactory}; pub use self::modes::{ ExtensionResultM, ExtensionSourceM, FactoryModeParse, FactoryModeProxy, ModeResultM, }; diff --git a/src/rcore/inlining.rs b/src/rcore/inlining.rs new file mode 100644 index 0000000..ac68c78 --- /dev/null +++ b/src/rcore/inlining.rs @@ -0,0 +1,50 @@ +use super::*; + +pub type IParseResult<'a, Ctx, F, I> = Result<(Mtbl<'a, Ctx, F>, I), ParseError<'a, Ctx, F>>; + +pub trait CInliningFactory<'a, Ctx: Context<'a>>: + FactoryBase<'a, Ctx> + ImplMode +{ + fn cextension_error(&self, tail: &[u8]) -> Self::ParseError; + + fn cideserialize>(&self, inctx: I) -> IParseResult<'a, Ctx, Self, I>; +} + +/// This factory should return an error on EOF. +pub trait InliningFactory<'a, Ctx: Context<'a>>: + FactoryBase<'a, Ctx> + ParseMode +{ + fn extension_error(&self, tail: &[u8]) -> Self::ParseError; + + fn ideserialize>(&self, inctx: I) -> IParseResult<'a, Ctx, Self, I>; +} + +impl<'a, Ctx: Context<'a>, F: FactoryModeParse<'a, Ctx> + ParseMode> + InliningFactory<'a, Ctx> for F +{ + fn extension_error(&self, tail: &[u8]) -> Self::ParseError { + self.mextend((), tail) + } + + fn ideserialize>(&self, inctx: I) -> IParseResult<'a, Ctx, Self, I> { + self.mdeserialize(inctx) + } +} + +impl<'a, Ctx: Context<'a>, F: CInliningFactory<'a, Ctx>> FactoryModeProxy<'a, Ctx> + for WithMode +{ + type F = F; + + fn pmdeserialize>(f: &Self::F, inctx: I) -> ModeResultM<'a, Ctx, F, I> { + f.cideserialize(inctx) + } + + fn pmextend( + f: &F, + _mentionable: ExtensionSourceM<'a, Ctx, F>, + tail: &[u8], + ) -> ExtensionResultM<'a, Ctx, F> { + f.cextension_error(tail) + } +} diff --git a/src/rstd/collections/pair.rs b/src/rstd/collections/pair.rs index 986dbf9..2607369 100644 --- a/src/rstd/collections/pair.rs +++ b/src/rstd/collections/pair.rs @@ -5,7 +5,7 @@ use std::fmt::Display; use crate::mode::*; use crate::rcore::*; -use crate::rstd::inlining::{static_pair::*, *}; +use crate::rstd::inlining::static_pair::*; pub type PairObject = StaticPairObject<(A, B)>; pub type PairFactory<'a, Ctx, A, B> = StaticPairFactory<'a, Ctx, (A, B)>; diff --git a/src/rstd/collections/tree.rs b/src/rstd/collections/tree.rs index dfb13f8..c98159b 100644 --- a/src/rstd/collections/tree.rs +++ b/src/rstd/collections/tree.rs @@ -7,7 +7,7 @@ use crate::{ flow::binary::*, mode::*, rcore::*, - rstd::{atomic::au64::*, inlining::*, nullable::*, point::*}, + rstd::{atomic::au64::*, nullable::*, point::*}, }; #[derive(Debug)] diff --git a/src/rstd/inlining.rs b/src/rstd/inlining.rs index cce8c4c..69ca5bc 100644 --- a/src/rstd/inlining.rs +++ b/src/rstd/inlining.rs @@ -1,6 +1,5 @@ //! Traits to better express parsing semantics. -mod modes; pub mod static_pair; use crate::atomic::*; @@ -9,37 +8,6 @@ use crate::rcore::*; use super::{atomic_object::*, *}; -pub type IParseResult<'a, Ctx, F, I> = Result<(Mtbl<'a, Ctx, F>, I), ParseError<'a, Ctx, F>>; - -pub trait CInliningFactory<'a, Ctx: Context<'a>>: - FactoryBase<'a, Ctx> + ImplMode -{ - fn cextension_error(&self, tail: &[u8]) -> Self::ParseError; - - fn cideserialize>(&self, inctx: I) -> IParseResult<'a, Ctx, Self, I>; -} - -/// This factory should return an error on EOF. -pub trait InliningFactory<'a, Ctx: Context<'a>>: - FactoryBase<'a, Ctx> + ParseMode -{ - fn extension_error(&self, tail: &[u8]) -> Self::ParseError; - - fn ideserialize>(&self, inctx: I) -> IParseResult<'a, Ctx, Self, I>; -} - -impl<'a, Ctx: Context<'a>, F: FactoryModeParse<'a, Ctx> + ParseMode> - InliningFactory<'a, Ctx> for F -{ - fn extension_error(&self, tail: &[u8]) -> Self::ParseError { - self.mextend((), tail) - } - - fn ideserialize>(&self, inctx: I) -> IParseResult<'a, Ctx, Self, I> { - self.mdeserialize(inctx) - } -} - /// This factory always reads the same amount of bytes or returns error. pub trait FixedSizeFactory<'a, Ctx: Context<'a>>: InliningFactory<'a, Ctx> { /// For [`ConstSizeFactory`] this must return [`ConstSizeFactory::SIZE`]. diff --git a/src/rstd/inlining/modes.rs b/src/rstd/inlining/modes.rs deleted file mode 100644 index c62d1c3..0000000 --- a/src/rstd/inlining/modes.rs +++ /dev/null @@ -1,33 +0,0 @@ -use crate::mode::*; - -use super::*; - -impl<'a, Ctx: Context<'a>, F: CInliningFactory<'a, Ctx>> FactoryModeProxy<'a, Ctx> - for WithMode -{ - type F = F; - - fn pmdeserialize>(f: &Self::F, inctx: I) -> ModeResultM<'a, Ctx, F, I> { - f.cideserialize(inctx) - } - - fn pmextend( - f: &F, - _mentionable: ExtensionSourceM<'a, Ctx, F>, - tail: &[u8], - ) -> ExtensionResultM<'a, Ctx, F> { - f.cextension_error(tail) - } -} - -impl AtomicModeProxy for WithMode { - type A = A; - - fn pma_deserialize(stream: I) -> AModeResultM { - A::ca_ideserialize(stream) - } - - fn pma_extend(_atomic: AExtensionSourceM, tail: &[u8]) -> AExtensionResultM { - A::ca_extension_error(tail) - } -}