rcore::stream

This commit is contained in:
AF 2023-07-30 19:24:28 +00:00
parent 3ba406856e
commit 2d8f457b21
14 changed files with 50 additions and 51 deletions

View File

@ -34,9 +34,9 @@ pub type ModeResult<M, A, E, I> = Result<ParseSuccess<M, A, I>, E>;
/// [`()`]: unit /// [`()`]: unit
pub trait Mode { pub trait Mode {
/// Successful parsing, may countain the parser itself /// Successful parsing, may countain the parser itself
/// (`I`, usually [`Inlining`]). /// (`I`, usually [`Stream`]).
/// ///
/// [`Inlining`]: crate::rcore::Inlining /// [`Stream`]: crate::rcore::Stream
type ParseSuccess<A, I>; type ParseSuccess<A, I>;
/// Result of extending the value, failing sometimes or always. /// Result of extending the value, failing sometimes or always.

View File

@ -9,7 +9,6 @@ mod demoted;
mod diagnostic; mod diagnostic;
mod hashing; mod hashing;
mod inctx; mod inctx;
mod inlining;
mod modes; mod modes;
mod origin; mod origin;
mod point; mod point;
@ -17,6 +16,7 @@ mod points;
mod resolution; mod resolution;
mod resolver_origin; mod resolver_origin;
mod slice_deserializer; mod slice_deserializer;
mod stream;
use std::{error::Error, rc::Rc}; use std::{error::Error, rc::Rc};
@ -31,7 +31,6 @@ pub use self::demoted::Demoted;
pub use self::diagnostic::Diagnostic; pub use self::diagnostic::Diagnostic;
pub use self::hashing::{Hash, HASH_SIZE, HASH_ZEROS}; pub use self::hashing::{Hash, HASH_SIZE, HASH_ZEROS};
pub use self::inctx::InCtx; pub use self::inctx::InCtx;
pub use self::inlining::{Inlining, InliningExt, InliningResultExt};
pub use self::modes::{ pub use self::modes::{
CRegularFactory, ExtensionResultM, ExtensionSourceM, FactoryModeParse, FactoryModeProxy, CRegularFactory, ExtensionResultM, ExtensionSourceM, FactoryModeParse, FactoryModeProxy,
ModeResultM, RegularFactory, ModeResultM, RegularFactory,
@ -44,6 +43,7 @@ pub use self::resolution::{
ResolutionFailure, ResolutionResult, Resolver, ResolverMap, ResolutionFailure, ResolutionResult, Resolver, ResolverMap,
}; };
pub use self::slice_deserializer::SliceDeserializer; pub use self::slice_deserializer::SliceDeserializer;
pub use self::stream::{Stream, StreamExt, StreamResultExt};
/// Helper alias for [`WeakFunctor::F`] of [`FunctorContext::T`]. /// Helper alias for [`WeakFunctor::F`] of [`FunctorContext::T`].
pub type Wrapped<'a, Ctx, A> = WrapC<'a, A, Ctx>; pub type Wrapped<'a, Ctx, A> = WrapC<'a, A, Ctx>;

View File

@ -26,7 +26,7 @@ impl Addresses {
} }
} }
pub(super) trait InliningAddresses<E>: Inlining { pub(super) trait InliningAddresses<E>: Stream {
fn inext_address( fn inext_address(
self, self,
addresses: &mut Addresses, addresses: &mut Addresses,
@ -53,7 +53,7 @@ pub(super) trait InliningAddresses<E>: Inlining {
} }
} }
impl<E, D: ?Sized + Inlining> InliningAddresses<E> for D {} impl<E, D: ?Sized + Stream> InliningAddresses<E> for D {}
fn _parse_slice<'a, Ctx: Context<'a>, F: FactoryParse<'a, Ctx>>( fn _parse_slice<'a, Ctx: Context<'a>, F: FactoryParse<'a, Ctx>>(
factory: &F, factory: &F,

View File

@ -3,7 +3,7 @@ use super::*;
/// Demoted [`InCtx`], returned by [`InCtx::demote`]. Use when a concrete type required. /// Demoted [`InCtx`], returned by [`InCtx::demote`]. Use when a concrete type required.
pub struct Demoted<'a: 'c, 'c, Ctx: Context<'a>>(pub(super) &'c mut dyn DeCtx<'a, Ctx>); pub struct Demoted<'a: 'c, 'c, Ctx: Context<'a>>(pub(super) &'c mut dyn DeCtx<'a, Ctx>);
impl<'a: 'c, 'c, Ctx: Context<'a>> Inlining for Demoted<'a, 'c, Ctx> { impl<'a: 'c, 'c, Ctx: Context<'a>> Stream for Demoted<'a, 'c, Ctx> {
fn iread_n<A, E>( fn iread_n<A, E>(
self, self,
n: usize, n: usize,

View File

@ -1,7 +1,7 @@
use super::*; use super::*;
/// [Inlining] context. /// Inlining ([Stream]ed) context.
pub trait InCtx<'a, Ctx: Context<'a>>: Inlining { pub trait InCtx<'a, Ctx: Context<'a>>: Stream {
/// Read the next [Address]. /// Read the next [Address].
fn icnext_address<E>(self, err: impl FnOnce(&[u8]) -> E) -> Result<(Address, Self), E>; fn icnext_address<E>(self, err: impl FnOnce(&[u8]) -> E) -> Result<(Address, Self), E>;
@ -28,7 +28,7 @@ pub trait InCtx<'a, Ctx: Context<'a>>: Inlining {
Self: 'd; Self: 'd;
} }
impl<'a: 'c, 'c, Ctx: Context<'a>> Inlining for &'c mut dyn DeCtx<'a, Ctx> { impl<'a: 'c, 'c, Ctx: Context<'a>> Stream for &'c mut dyn DeCtx<'a, Ctx> {
fn iread_n<A, E>( fn iread_n<A, E>(
self, self,
n: usize, n: usize,

View File

@ -2,7 +2,7 @@ use super::*;
/// [`Deserializer`] with a cleaner interface for parsing multiple objects /// [`Deserializer`] with a cleaner interface for parsing multiple objects
/// from one stream ("inlining"). /// from one stream ("inlining").
pub trait Inlining: Sized { pub trait Stream: Sized {
/// Try to read `n` bytes. Consumes the deserializer on failure. /// Try to read `n` bytes. Consumes the deserializer on failure.
fn iread_n<A, E>( fn iread_n<A, E>(
self, self,
@ -18,9 +18,9 @@ pub trait Inlining: Sized {
fn itell(&self) -> usize; fn itell(&self) -> usize;
} }
/// [`InliningExt::iread_n_const`]. /// [`StreamExt::iread_n_const`].
pub trait InliningExt<E>: Inlining { pub trait StreamExt<E>: Stream {
/// `const`-length equivalent of [`Inlining::iread_n`]. /// `const`-length equivalent of [`Stream::iread_n`].
fn iread_n_const<const N: usize>( fn iread_n_const<const N: usize>(
self, self,
err: impl FnOnce(&[u8]) -> E, err: impl FnOnce(&[u8]) -> E,
@ -33,9 +33,9 @@ pub trait InliningExt<E>: Inlining {
} }
} }
impl<D: Inlining, E> InliningExt<E> for D {} impl<I: Stream, E> StreamExt<E> for I {}
impl<D: ?Sized + Deserializer> Inlining for &mut D { impl<D: ?Sized + Deserializer> Stream for &mut D {
fn iread_n<A, E>( fn iread_n<A, E>(
self, self,
n: usize, n: usize,
@ -59,13 +59,13 @@ impl<D: ?Sized + Deserializer> Inlining for &mut D {
} }
} }
/// [`InliningResultExt::seal`]. /// [`StreamResultExt::seal`].
pub trait InliningResultExt<A, E> { pub trait StreamResultExt<A, E> {
/// Drop the deserializer from parsing result. /// Drop the deserializer from parsing result.
fn seal(self) -> Result<A, E>; fn seal(self) -> Result<A, E>;
} }
impl<A, E, I: Inlining> InliningResultExt<A, E> for Result<(A, I), E> { impl<A, E, I: Stream> StreamResultExt<A, E> for Result<(A, I), E> {
fn seal(self) -> Result<A, E> { fn seal(self) -> Result<A, E> {
self.map(|(a, _)| a) self.map(|(a, _)| a)
} }

View File

@ -35,7 +35,7 @@ pub trait AtomicBase: 'static + Send + Sync + Send + Clone + Serializable {
/// to an empty sequence. /// to an empty sequence.
pub trait Atomic: AtomicBase + ParseMode { pub trait Atomic: AtomicBase + ParseMode {
/// Static equivalent of [`FactoryParse::deserialize`]. /// Static equivalent of [`FactoryParse::deserialize`].
fn a_deserialize(inlining: impl Inlining) -> AParseResult<Self>; fn a_deserialize(stream: impl Stream) -> AParseResult<Self>;
/// Static equivalent of [`FactoryParse::extend`]. /// Static equivalent of [`FactoryParse::extend`].
fn a_extend(self, tail: &[u8]) -> AParseResult<Self>; fn a_extend(self, tail: &[u8]) -> AParseResult<Self>;
} }

View File

@ -47,8 +47,8 @@ impl<const N: usize> CInliningAtomic for [u8; N] {
ArrayParseError::ExtraData(tail.len()) ArrayParseError::ExtraData(tail.len())
} }
fn ca_ideserialize<D: Inlining>(inlining: D) -> ADParseResult<Self, D> { fn ca_ideserialize<I: Stream>(stream: I) -> AIParseResult<Self, I> {
inlining.iread_n_const::<N>(|slice| ArrayParseError::from(slice)) stream.iread_n_const::<N>(|slice| ArrayParseError::from(slice))
} }
} }

View File

@ -47,9 +47,9 @@ impl CInliningAtomic for u64 {
IntParseError::ExtraData(tail.len()) IntParseError::ExtraData(tail.len())
} }
fn ca_ideserialize<D: Inlining>(inlining: D) -> ADParseResult<Self, D> { fn ca_ideserialize<I: Stream>(stream: I) -> AIParseResult<Self, I> {
let (x, inlining) = inlining.iread_n_const::<8>(|slice| IntParseError::from(slice))?; let (x, stream) = stream.iread_n_const::<8>(|slice| IntParseError::from(slice))?;
Ok((u64::from_le_bytes(x), inlining)) Ok((u64::from_le_bytes(x), stream))
} }
} }

View File

@ -54,12 +54,11 @@ impl CInliningAtomic for bool {
BooleanParseError::ExtraData(tail.len()) BooleanParseError::ExtraData(tail.len())
} }
fn ca_ideserialize<D: Inlining>(inlining: D) -> ADParseResult<Self, D> { fn ca_ideserialize<I: Stream>(stream: I) -> AIParseResult<Self, I> {
let (byte, inlining) = let (byte, stream) = stream.iread_n_const::<1>(|slice| BooleanParseError::from(slice))?;
inlining.iread_n_const::<1>(|slice| BooleanParseError::from(slice))?;
match byte[0] { match byte[0] {
0 => Ok((false, inlining)), 0 => Ok((false, stream)),
1 => Ok((true, inlining)), 1 => Ok((true, stream)),
value => Err(BooleanParseError::OutOfBounds(value)), value => Err(BooleanParseError::OutOfBounds(value)),
} }
} }

View File

@ -1,8 +1,8 @@
use super::*; use super::*;
impl<A: AtomicModeParse> Atomic for A { impl<A: AtomicModeParse> Atomic for A {
fn a_deserialize(inlining: impl Inlining) -> AParseResult<Self> { fn a_deserialize(stream: impl Stream) -> AParseResult<Self> {
Self::ma_deserialize(inlining).map(Self::seal) Self::ma_deserialize(stream).map(Self::seal)
} }
fn a_extend(self, tail: &[u8]) -> AParseResult<Self> { fn a_extend(self, tail: &[u8]) -> AParseResult<Self> {
@ -22,7 +22,7 @@ pub type AExtensionSourceM<A> = ExtensionSourceP<A, A>;
/// A more generic version of [`Atomic`]. /// A more generic version of [`Atomic`].
pub trait AtomicModeParse: AtomicBase + ParseMode { pub trait AtomicModeParse: AtomicBase + ParseMode {
/// A more generic version of [`Atomic::a_deserialize`]. /// A more generic version of [`Atomic::a_deserialize`].
fn ma_deserialize<I: Inlining>(inlining: I) -> AModeResultM<Self, I>; fn ma_deserialize<I: Stream>(stream: I) -> AModeResultM<Self, I>;
/// A more generic version of [`Atomic::a_extend`]. /// A more generic version of [`Atomic::a_extend`].
fn ma_extend(atomic: AExtensionSourceM<Self>, tail: &[u8]) -> AExtensionResultM<Self>; fn ma_extend(atomic: AExtensionSourceM<Self>, tail: &[u8]) -> AExtensionResultM<Self>;
@ -34,7 +34,7 @@ pub trait AtomicModeProxy {
type A: AtomicBase + ParseMode; type A: AtomicBase + ParseMode;
/// External implementation of [`AtomicModeParse::ma_deserialize`]. /// External implementation of [`AtomicModeParse::ma_deserialize`].
fn pma_deserialize<I: Inlining>(inlining: I) -> AModeResultM<Self::A, I>; fn pma_deserialize<I: Stream>(stream: I) -> AModeResultM<Self::A, I>;
/// External implementation of [`AtomicModeParse::ma_extend`]. /// External implementation of [`AtomicModeParse::ma_extend`].
fn pma_extend(atomic: AExtensionSourceM<Self::A>, tail: &[u8]) -> AExtensionResultM<Self::A>; fn pma_extend(atomic: AExtensionSourceM<Self::A>, tail: &[u8]) -> AExtensionResultM<Self::A>;
@ -44,8 +44,8 @@ impl<A: AtomicBase + WithParseMode> AtomicModeParse for A
where where
<A as WithParseMode>::WithMode: AtomicModeProxy<A = A>, <A as WithParseMode>::WithMode: AtomicModeProxy<A = A>,
{ {
fn ma_deserialize<I: Inlining>(inlining: I) -> AModeResultM<Self, I> { fn ma_deserialize<I: Stream>(stream: I) -> AModeResultM<Self, I> {
<<A as WithParseMode>::WithMode as AtomicModeProxy>::pma_deserialize(inlining) <<A as WithParseMode>::WithMode as AtomicModeProxy>::pma_deserialize(stream)
} }
fn ma_extend(atomic: AExtensionSourceM<Self>, tail: &[u8]) -> AExtensionResultM<Self> { fn ma_extend(atomic: AExtensionSourceM<Self>, tail: &[u8]) -> AExtensionResultM<Self> {
@ -56,7 +56,7 @@ where
/// For auto-deriving [`RegularAtomic`] from concrete implementations. /// For auto-deriving [`RegularAtomic`] from concrete implementations.
pub trait CRegularAtomic: AtomicBase + ImplMode<Mode = RegularMode> { pub trait CRegularAtomic: AtomicBase + ImplMode<Mode = RegularMode> {
/// Concrete implementation of [`RegularAtomic::ra_deserialize`]. /// Concrete implementation of [`RegularAtomic::ra_deserialize`].
fn cra_deserialize(inlining: impl Inlining) -> AParseResult<Self>; fn cra_deserialize(stream: impl Stream) -> AParseResult<Self>;
/// Concrete implementation of [`RegularAtomic::ra_extend`]. /// Concrete implementation of [`RegularAtomic::ra_extend`].
fn cra_extend(self, tail: &[u8]) -> AParseResult<Self>; fn cra_extend(self, tail: &[u8]) -> AParseResult<Self>;
} }
@ -64,14 +64,14 @@ pub trait CRegularAtomic: AtomicBase + ImplMode<Mode = RegularMode> {
/// Mostly same as [`AtomicModeParse`] but requires [`Mode`] to be [`RegularMode`]. /// Mostly same as [`AtomicModeParse`] but requires [`Mode`] to be [`RegularMode`].
pub trait RegularAtomic: AtomicBase + ParseMode<Mode = RegularMode> { pub trait RegularAtomic: AtomicBase + ParseMode<Mode = RegularMode> {
/// Same as [`AtomicModeParse::ma_deserialize`]. /// Same as [`AtomicModeParse::ma_deserialize`].
fn ra_deserialize(inlining: impl Inlining) -> AParseResult<Self>; fn ra_deserialize(stream: impl Stream) -> AParseResult<Self>;
/// Same as [`AtomicModeParse::ma_extend`]. /// Same as [`AtomicModeParse::ma_extend`].
fn ra_extend(self, tail: &[u8]) -> AParseResult<Self>; fn ra_extend(self, tail: &[u8]) -> AParseResult<Self>;
} }
impl<A: AtomicModeParse + ParseMode<Mode = RegularMode>> RegularAtomic for A { impl<A: AtomicModeParse + ParseMode<Mode = RegularMode>> RegularAtomic for A {
fn ra_deserialize(inlining: impl Inlining) -> AParseResult<Self> { fn ra_deserialize(stream: impl Stream) -> AParseResult<Self> {
A::ma_deserialize(inlining) A::ma_deserialize(stream)
} }
fn ra_extend(self, tail: &[u8]) -> AParseResult<Self> { fn ra_extend(self, tail: &[u8]) -> AParseResult<Self> {
@ -82,8 +82,8 @@ impl<A: AtomicModeParse + ParseMode<Mode = RegularMode>> RegularAtomic for A {
impl<A: CRegularAtomic> AtomicModeProxy for WithMode<A, RegularMode> { impl<A: CRegularAtomic> AtomicModeProxy for WithMode<A, RegularMode> {
type A = A; type A = A;
fn pma_deserialize<I: Inlining>(inlining: I) -> AModeResultM<Self::A, I> { fn pma_deserialize<I: Stream>(stream: I) -> AModeResultM<Self::A, I> {
A::cra_deserialize(inlining) A::cra_deserialize(stream)
} }
fn pma_extend(atomic: AExtensionSourceM<Self::A>, tail: &[u8]) -> AExtensionResultM<Self::A> { fn pma_extend(atomic: AExtensionSourceM<Self::A>, tail: &[u8]) -> AExtensionResultM<Self::A> {

View File

@ -27,8 +27,8 @@ impl ImplMode for Plain {
} }
impl CRegularAtomic for Plain { impl CRegularAtomic for Plain {
fn cra_deserialize(inlining: impl Inlining) -> AParseResult<Self> { fn cra_deserialize(stream: impl Stream) -> AParseResult<Self> {
Ok(inlining.iread_all(Plain::from_slice)) Ok(stream.iread_all(Plain::from_slice))
} }
fn cra_extend(mut self, tail: &[u8]) -> AParseResult<Self> { fn cra_extend(mut self, tail: &[u8]) -> AParseResult<Self> {

View File

@ -71,19 +71,19 @@ pub trait ConstSizeObject<'a, Ctx: Context<'a>>: FixedSizeObject<'a, Ctx> {
const SIZE: usize; const SIZE: usize;
} }
pub type ADParseResult<A, D> = Result<(A, D), AParseError<A>>; pub type AIParseResult<A, I> = Result<(A, I), AParseError<A>>;
pub trait CInliningAtomic: AtomicBase + ImplMode<Mode = InliningMode> { pub trait CInliningAtomic: AtomicBase + ImplMode<Mode = InliningMode> {
fn ca_extension_error(tail: &[u8]) -> Self::AParseError; fn ca_extension_error(tail: &[u8]) -> Self::AParseError;
fn ca_ideserialize<D: Inlining>(inlining: D) -> ADParseResult<Self, D>; fn ca_ideserialize<I: Stream>(stream: I) -> AIParseResult<Self, I>;
} }
/// Atomic analogue of [`InliningFactory`]/[`InliningObject`]. /// Atomic analogue of [`InliningFactory`]/[`InliningObject`].
pub trait InliningAtomic: AtomicBase + ParseMode<Mode = InliningMode> { pub trait InliningAtomic: AtomicBase + ParseMode<Mode = InliningMode> {
fn a_extension_error(tail: &[u8]) -> Self::AParseError; fn a_extension_error(tail: &[u8]) -> Self::AParseError;
fn a_ideserialize<D: Inlining>(inlining: D) -> ADParseResult<Self, D>; fn a_ideserialize<I: Stream>(strean: I) -> AIParseResult<Self, I>;
} }
impl<A: AtomicModeParse + ParseMode<Mode = InliningMode>> InliningAtomic for A { impl<A: AtomicModeParse + ParseMode<Mode = InliningMode>> InliningAtomic for A {
@ -91,8 +91,8 @@ impl<A: AtomicModeParse + ParseMode<Mode = InliningMode>> InliningAtomic for A {
A::ma_extend((), tail) A::ma_extend((), tail)
} }
fn a_ideserialize<D: Inlining>(inlining: D) -> ADParseResult<Self, D> { fn a_ideserialize<I: Stream>(stream: I) -> AIParseResult<Self, I> {
A::ma_deserialize(inlining) A::ma_deserialize(stream)
} }
} }

View File

@ -93,8 +93,8 @@ impl<'a, Ctx: Context<'a>, F: CInliningFactory<'a, Ctx>> FactoryModeProxy<'a, Ct
impl<A: CInliningAtomic> AtomicModeProxy for WithMode<A, InliningMode> { impl<A: CInliningAtomic> AtomicModeProxy for WithMode<A, InliningMode> {
type A = A; type A = A;
fn pma_deserialize<I: Inlining>(inlining: I) -> AModeResultM<Self::A, I> { fn pma_deserialize<I: Stream>(stream: I) -> AModeResultM<Self::A, I> {
A::ca_ideserialize(inlining) A::ca_ideserialize(stream)
} }
fn pma_extend(_atomic: AExtensionSourceM<Self::A>, tail: &[u8]) -> AExtensionResultM<Self::A> { fn pma_extend(_atomic: AExtensionSourceM<Self::A>, tail: &[u8]) -> AExtensionResultM<Self::A> {