decouple FactoryBase
from MentionableTop
This commit is contained in:
parent
f7ad44920f
commit
d75e7c05a8
12
src/rcore.rs
12
src/rcore.rs
@ -73,13 +73,13 @@ pub trait MentionableTop<'a, Ctx: Context<'a>>: 'a {
|
|||||||
pub trait Mentionable<'a, Ctx: Context<'a>>:
|
pub trait Mentionable<'a, Ctx: Context<'a>>:
|
||||||
MentionableBase<'a, Ctx, Fctr = Self::_Fctr> + MentionableTop<'a, Ctx>
|
MentionableBase<'a, Ctx, Fctr = Self::_Fctr> + MentionableTop<'a, Ctx>
|
||||||
{
|
{
|
||||||
type _Fctr: Factory<'a, Ctx, Mtbl = Self>;
|
type _Fctr: Factory<'a, Ctx, _Mtbl = Self>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, A: MentionableBase<'a, Ctx> + MentionableTop<'a, Ctx>>
|
impl<'a, Ctx: Context<'a>, A: MentionableBase<'a, Ctx> + MentionableTop<'a, Ctx>>
|
||||||
Mentionable<'a, Ctx> for A
|
Mentionable<'a, Ctx> for A
|
||||||
where
|
where
|
||||||
Self::Fctr: Factory<'a, Ctx>,
|
Self::Fctr: Factory<'a, Ctx, _Mtbl = Self>,
|
||||||
{
|
{
|
||||||
type _Fctr = Self::Fctr;
|
type _Fctr = Self::Fctr;
|
||||||
}
|
}
|
||||||
@ -96,14 +96,18 @@ pub type ParseResultA<'a, Ctx, A> = Result<A, ParseErrorA<'a, Ctx, A>>;
|
|||||||
/// [Factory] base.
|
/// [Factory] base.
|
||||||
pub trait FactoryBase<'a, Ctx: Context<'a>>: 'a + Send + Sync + Clone {
|
pub trait FactoryBase<'a, Ctx: Context<'a>>: 'a + Send + Sync + Clone {
|
||||||
/// Type of the associated objects.
|
/// Type of the associated objects.
|
||||||
type Mtbl: MentionableBase<'a, Ctx, Fctr = Self> + MentionableTop<'a, Ctx>;
|
type Mtbl: MentionableBase<'a, Ctx, Fctr = Self>;
|
||||||
/// Type of an error that [`Factory::deserialize`] can fail with.
|
/// Type of an error that [`Factory::deserialize`] can fail with.
|
||||||
type ParseError: 'a + Error;
|
type ParseError: 'a + Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Trait representing deserialisation rules for [Mentionable]s.
|
/// Trait representing deserialisation rules for [Mentionable]s.
|
||||||
/// Crucial for [`crate::rstd::typeless`].
|
/// Crucial for [`crate::rstd::typeless`].
|
||||||
pub trait Factory<'a, Ctx: Context<'a>>: FactoryBase<'a, Ctx> + ParseMode {
|
pub trait Factory<'a, Ctx: Context<'a>>:
|
||||||
|
FactoryBase<'a, Ctx, Mtbl = Self::_Mtbl> + ParseMode
|
||||||
|
{
|
||||||
|
type _Mtbl: MentionableBase<'a, Ctx, Fctr = Self> + MentionableTop<'a, Ctx>;
|
||||||
|
|
||||||
/// See [`Deserializer`], [`Resolver`].
|
/// See [`Deserializer`], [`Resolver`].
|
||||||
fn deserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self>;
|
fn deserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self>;
|
||||||
/// Called by finite stream parsers if there's any data left.
|
/// Called by finite stream parsers if there's any data left.
|
||||||
|
@ -30,7 +30,10 @@ pub trait FactoryProxy<'a, Ctx: Context<'a>> {
|
|||||||
impl<'a, Ctx: Context<'a>, F: FactoryBase<'a, Ctx> + WithParseMode> Factory<'a, Ctx> for F
|
impl<'a, Ctx: Context<'a>, F: FactoryBase<'a, Ctx> + WithParseMode> Factory<'a, Ctx> for F
|
||||||
where
|
where
|
||||||
F::WithMode: FactoryProxy<'a, Ctx, F = Self>,
|
F::WithMode: FactoryProxy<'a, Ctx, F = Self>,
|
||||||
|
F::Mtbl: MentionableTop<'a, Ctx>,
|
||||||
{
|
{
|
||||||
|
type _Mtbl = Self::Mtbl;
|
||||||
|
|
||||||
fn deserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> {
|
fn deserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> {
|
||||||
<F::WithMode as FactoryProxy<'a, Ctx>>::pdeserialize(self, inctx)
|
<F::WithMode as FactoryProxy<'a, Ctx>>::pdeserialize(self, inctx)
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,7 @@ impl<A: AtomicBase> Serializable for AtomicObject<A> {
|
|||||||
|
|
||||||
pub trait AoProxy<'a, Ctx: Context<'a>>: AtomicProxy {
|
pub trait AoProxy<'a, Ctx: Context<'a>>: AtomicProxy {
|
||||||
type Mtbl: MentionableBase<'a, Ctx, Fctr = Self::Fctr> + MentionableTop<'a, Ctx>;
|
type Mtbl: MentionableBase<'a, Ctx, Fctr = Self::Fctr> + MentionableTop<'a, Ctx>;
|
||||||
type Fctr: Factory<'a, Ctx, Mtbl = Self::Mtbl>;
|
type Fctr: Factory<'a, Ctx, _Mtbl = Self::Mtbl>;
|
||||||
|
|
||||||
fn factory() -> Self::Fctr;
|
fn factory() -> Self::Fctr;
|
||||||
fn wrap(a: Self::A) -> Self::Mtbl;
|
fn wrap(a: Self::A) -> Self::Mtbl;
|
||||||
|
@ -58,6 +58,8 @@ where
|
|||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, F: RegularFactory<'a, Ctx>>
|
impl<'a, Ctx: Context<'a>, F: RegularFactory<'a, Ctx>>
|
||||||
StackCompatibleProxy<'a, Ctx, Stack<'a, Ctx, Mtbl<'a, Ctx, F>>> for WithMode<F, RegularMode>
|
StackCompatibleProxy<'a, Ctx, Stack<'a, Ctx, Mtbl<'a, Ctx, F>>> for WithMode<F, RegularMode>
|
||||||
|
where
|
||||||
|
F::Mtbl: MentionableTop<'a, Ctx>,
|
||||||
{
|
{
|
||||||
fn points_typed_rest(
|
fn points_typed_rest(
|
||||||
stack: &Stack<'a, Ctx, Mtbl<'a, Ctx, Self::F>>,
|
stack: &Stack<'a, Ctx, Mtbl<'a, Ctx, Self::F>>,
|
||||||
@ -69,6 +71,8 @@ impl<'a, Ctx: Context<'a>, F: RegularFactory<'a, Ctx>>
|
|||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, F: InlineableFactory<'a, Ctx>>
|
impl<'a, Ctx: Context<'a>, F: InlineableFactory<'a, Ctx>>
|
||||||
StackCompatibleProxy<'a, Ctx, Stack<'a, Ctx, Mtbl<'a, Ctx, F>>> for WithMode<F, InliningMode>
|
StackCompatibleProxy<'a, Ctx, Stack<'a, Ctx, Mtbl<'a, Ctx, F>>> for WithMode<F, InliningMode>
|
||||||
|
where
|
||||||
|
F::Mtbl: MentionableTop<'a, Ctx>,
|
||||||
{
|
{
|
||||||
fn points_typed_rest(
|
fn points_typed_rest(
|
||||||
stack: &Stack<'a, Ctx, Mtbl<'a, Ctx, Self::F>>,
|
stack: &Stack<'a, Ctx, Mtbl<'a, Ctx, Self::F>>,
|
||||||
@ -151,6 +155,8 @@ impl<F: ParseMode> ParseMode for StackNodeFactory<F> {
|
|||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, F: RegularFactory<'a, Ctx>> RegularFactory<'a, Ctx>
|
impl<'a, Ctx: Context<'a>, F: RegularFactory<'a, Ctx>> RegularFactory<'a, Ctx>
|
||||||
for StackNodeFactory<F>
|
for StackNodeFactory<F>
|
||||||
|
where
|
||||||
|
F::Mtbl: MentionableTop<'a, Ctx>,
|
||||||
{
|
{
|
||||||
fn rdeserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> {
|
fn rdeserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> {
|
||||||
let (rest, inctx) = self.parse_point(inctx)?;
|
let (rest, inctx) = self.parse_point(inctx)?;
|
||||||
@ -180,7 +186,7 @@ pub type StackVecResult<'a, Ctx, A> = Result<Vec<A>, StackFaiure<'a, Ctx, A>>;
|
|||||||
pub type StackVecWrapped<'a, Ctx, A> = Wrapped<'a, Ctx, StackVecResult<'a, Ctx, A>>;
|
pub type StackVecWrapped<'a, Ctx, A> = Wrapped<'a, Ctx, StackVecResult<'a, Ctx, A>>;
|
||||||
|
|
||||||
/// Extention trait with helper methods for [Stack]s.
|
/// Extention trait with helper methods for [Stack]s.
|
||||||
pub trait ExtStack<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>>:
|
pub trait ExtStack<'a, Ctx: Context<'a>, A: MentionableBase<'a, Ctx>>:
|
||||||
MentionableBase<'a, Ctx>
|
MentionableBase<'a, Ctx>
|
||||||
{
|
{
|
||||||
/// Get an empty stack ([`Nullable::Null`]).
|
/// Get an empty stack ([`Nullable::Null`]).
|
||||||
@ -201,9 +207,10 @@ pub trait ExtStackClone<'a, Ctx: Context<'a>, A: StackCompatible<'a, Ctx> + Clon
|
|||||||
fn vec(self) -> StackVecWrapped<'a, Ctx, A>;
|
fn vec(self) -> StackVecWrapped<'a, Ctx, A>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, A: StackCompatible<'a, Ctx>> ExtStack<'a, Ctx, A> for Stack<'a, Ctx, A>
|
impl<'a, Ctx: Context<'a>, A: StackCompatible<'a, Ctx> + Mentionable<'a, Ctx>> ExtStack<'a, Ctx, A>
|
||||||
|
for Stack<'a, Ctx, A>
|
||||||
where
|
where
|
||||||
Fctr<'a, Ctx, StackNode<'a, Ctx, A>>: Factory<'a, Ctx>,
|
StackNode<'a, Ctx, A>: Mentionable<'a, Ctx, _Fctr = StackNodeFactory<A::Fctr>>,
|
||||||
{
|
{
|
||||||
fn empty(factory: A::Fctr) -> Self {
|
fn empty(factory: A::Fctr) -> Self {
|
||||||
Nullable::Null(StackNodeFactory::new(factory.clone()))
|
Nullable::Null(StackNodeFactory::new(factory.clone()))
|
||||||
@ -222,10 +229,10 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, A: StackCompatible<'a, Ctx> + Clone> ExtStackClone<'a, Ctx, A>
|
impl<'a, Ctx: Context<'a>, A: StackCompatible<'a, Ctx> + Mentionable<'a, Ctx> + Clone>
|
||||||
for Stack<'a, Ctx, A>
|
ExtStackClone<'a, Ctx, A> for Stack<'a, Ctx, A>
|
||||||
where
|
where
|
||||||
Fctr<'a, Ctx, StackNode<'a, Ctx, A>>: Factory<'a, Ctx>,
|
StackNode<'a, Ctx, A>: Mentionable<'a, Ctx, _Fctr = StackNodeFactory<A::Fctr>>,
|
||||||
{
|
{
|
||||||
fn vec(self) -> StackVecWrapped<'a, Ctx, A> {
|
fn vec(self) -> StackVecWrapped<'a, Ctx, A> {
|
||||||
Ctx::T::iterate_mut((vec![], self), |(mut vec, stack)| match stack {
|
Ctx::T::iterate_mut((vec![], self), |(mut vec, stack)| match stack {
|
||||||
@ -246,6 +253,8 @@ where
|
|||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, F: InlineableFactory<'a, Ctx>> InlineableFactory<'a, Ctx>
|
impl<'a, Ctx: Context<'a>, F: InlineableFactory<'a, Ctx>> InlineableFactory<'a, Ctx>
|
||||||
for StackNodeFactory<F>
|
for StackNodeFactory<F>
|
||||||
|
where
|
||||||
|
F::Mtbl: MentionableTop<'a, Ctx>,
|
||||||
{
|
{
|
||||||
fn extension_error(&self, tail: &[u8]) -> Self::ParseError {
|
fn extension_error(&self, tail: &[u8]) -> Self::ParseError {
|
||||||
StackParseError::Element(self.element_factory.extension_error(tail))
|
StackParseError::Element(self.element_factory.extension_error(tail))
|
||||||
@ -263,6 +272,8 @@ impl<'a, Ctx: Context<'a>, F: InlineableFactory<'a, Ctx>> InlineableFactory<'a,
|
|||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, F: FixedSizeFactory<'a, Ctx>> FixedSizeFactory<'a, Ctx>
|
impl<'a, Ctx: Context<'a>, F: FixedSizeFactory<'a, Ctx>> FixedSizeFactory<'a, Ctx>
|
||||||
for StackNodeFactory<F>
|
for StackNodeFactory<F>
|
||||||
|
where
|
||||||
|
F::Mtbl: MentionableTop<'a, Ctx>,
|
||||||
{
|
{
|
||||||
fn size(&self) -> usize {
|
fn size(&self) -> usize {
|
||||||
Stack::<'a, Ctx, F::Mtbl>::SIZE + self.element_factory.size()
|
Stack::<'a, Ctx, F::Mtbl>::SIZE + self.element_factory.size()
|
||||||
@ -271,6 +282,8 @@ impl<'a, Ctx: Context<'a>, F: FixedSizeFactory<'a, Ctx>> FixedSizeFactory<'a, Ct
|
|||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, F: ConstSizeFactory<'a, Ctx>> ConstSizeFactory<'a, Ctx>
|
impl<'a, Ctx: Context<'a>, F: ConstSizeFactory<'a, Ctx>> ConstSizeFactory<'a, Ctx>
|
||||||
for StackNodeFactory<F>
|
for StackNodeFactory<F>
|
||||||
|
where
|
||||||
|
F::Mtbl: MentionableTop<'a, Ctx>,
|
||||||
{
|
{
|
||||||
const SIZE: usize = Stack::<'a, Ctx, F::Mtbl>::SIZE + F::SIZE;
|
const SIZE: usize = Stack::<'a, Ctx, F::Mtbl>::SIZE + F::SIZE;
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,7 @@ impl<'a, Ctx: Context<'a>, A: MentionableBase<'a, Ctx>> Serializable for Nullabl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> MentionableBase<'a, Ctx>
|
impl<'a, Ctx: Context<'a>, A: MentionableBase<'a, Ctx>> MentionableBase<'a, Ctx>
|
||||||
for Nullable<'a, Ctx, A>
|
for Nullable<'a, Ctx, A>
|
||||||
{
|
{
|
||||||
type Fctr = NullableFactory<A::Fctr>;
|
type Fctr = NullableFactory<A::Fctr>;
|
||||||
@ -56,7 +56,7 @@ impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> MentionableTop<'a, Ctx>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> FactoryBase<'a, Ctx> for NullableFactory<F> {
|
impl<'a, Ctx: Context<'a>, F: FactoryBase<'a, Ctx>> FactoryBase<'a, Ctx> for NullableFactory<F> {
|
||||||
type Mtbl = Nullable<'a, Ctx, F::Mtbl>;
|
type Mtbl = Nullable<'a, Ctx, F::Mtbl>;
|
||||||
|
|
||||||
type ParseError = PointParseError;
|
type ParseError = PointParseError;
|
||||||
|
@ -11,7 +11,9 @@ impl<'a, Ctx: Context<'a>, A: MentionableBase<'a, Ctx>> Serializable for Point<'
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> MentionableBase<'a, Ctx> for Point<'a, Ctx, A> {
|
impl<'a, Ctx: Context<'a>, A: MentionableBase<'a, Ctx>> MentionableBase<'a, Ctx>
|
||||||
|
for Point<'a, Ctx, A>
|
||||||
|
{
|
||||||
type Fctr = PointFactory<A::Fctr>;
|
type Fctr = PointFactory<A::Fctr>;
|
||||||
|
|
||||||
fn factory(&self) -> Self::Fctr {
|
fn factory(&self) -> Self::Fctr {
|
||||||
@ -71,7 +73,7 @@ impl<'a, Ctx: Context<'a>, A: MentionableBase<'a, Ctx>> AsRef<[u8]> for Point<'a
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> FactoryBase<'a, Ctx> for PointFactory<F> {
|
impl<'a, Ctx: Context<'a>, F: FactoryBase<'a, Ctx>> FactoryBase<'a, Ctx> for PointFactory<F> {
|
||||||
type Mtbl = Point<'a, Ctx, F::Mtbl>;
|
type Mtbl = Point<'a, Ctx, F::Mtbl>;
|
||||||
|
|
||||||
type ParseError = PointParseError;
|
type ParseError = PointParseError;
|
||||||
|
@ -26,7 +26,7 @@ pub trait MappableOrigin<'a, Ctx: Context<'a>>: Origin<'a, Ctx> {
|
|||||||
map_factory: impl 'a + FnOnce(OFctr<'a, Ctx, Self>) -> B::Fctr,
|
map_factory: impl 'a + FnOnce(OFctr<'a, Ctx, Self>) -> B::Fctr,
|
||||||
) -> Rc<dyn Origin<'a, Ctx, Mtbl = B>>
|
) -> Rc<dyn Origin<'a, Ctx, Mtbl = B>>
|
||||||
where
|
where
|
||||||
OFctr<'a, Ctx, Self>: Factory<'a, Ctx>,
|
OFctr<'a, Ctx, Self>: Factory<'a, Ctx, _Mtbl = Self::Mtbl>,
|
||||||
Self::Mtbl: MentionableTop<'a, Ctx>,
|
Self::Mtbl: MentionableTop<'a, Ctx>,
|
||||||
{
|
{
|
||||||
let origin_r = self.clone();
|
let origin_r = self.clone();
|
||||||
|
Loading…
Reference in New Issue
Block a user