RegularAtomic

This commit is contained in:
AF 2023-07-28 21:22:14 +00:00
parent 1c5a9a28b7
commit 8015a9301b
4 changed files with 43 additions and 2 deletions

View File

@ -32,7 +32,9 @@ pub use self::diagnostic::Diagnostic;
pub use self::hashing::{Hash, HASH_SIZE, HASH_ZEROS};
pub use self::inctx::InCtx;
pub use self::inlining::{Inlining, InliningExt, InliningResultExt};
pub use self::modes::{FactoryProxy, ModeFactory, RegularFactory, RegularFactoryMode, WithMode};
pub use self::modes::{
FactoryProxy, FactoryWithMode, ModeFactory, RegularFactory, RegularFactoryMode, WithMode,
};
pub use self::origin::{OFctr, Origin};
pub use self::point::Point;
pub use self::points::PointsVisitor;

View File

@ -15,7 +15,7 @@ pub trait RegularFactory<'a, Ctx: Context<'a>>:
fn rextend(&self, mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self>;
}
trait FactoryWithMode: ModeFactory {
pub trait FactoryWithMode: ModeFactory {
type WithMode: ?Sized;
}

View File

@ -5,6 +5,7 @@ pub mod array;
pub mod atomic_object;
pub mod au64;
pub mod boolean;
mod modes;
pub mod plain;
use std::marker::PhantomData;

38
src/rstd/atomic/modes.rs Normal file
View File

@ -0,0 +1,38 @@
use super::*;
pub trait RegularAtomic: AtomicBase + ModeFactory<Mode = RegularFactoryMode> {
fn ra_deserialize(inlining: impl Inlining) -> AParseResult<Self>;
fn ra_extend(self, tail: &[u8]) -> AParseResult<Self>;
}
pub trait AtomicProxy {
type A: AtomicBase + ModeFactory;
fn pa_deserialize(inlining: impl Inlining) -> AParseResult<Self::A>;
fn pa_extend(a: Self::A, tail: &[u8]) -> AParseResult<Self::A>;
}
impl<A: RegularAtomic> AtomicProxy for WithMode<A, RegularFactoryMode> {
type A = A;
fn pa_deserialize(inlining: impl Inlining) -> AParseResult<Self::A> {
A::ra_deserialize(inlining)
}
fn pa_extend(a: Self::A, tail: &[u8]) -> AParseResult<Self::A> {
a.ra_extend(tail)
}
}
impl<A: AtomicBase + FactoryWithMode> Atomic for A
where
A::WithMode: AtomicProxy<A = Self>,
{
fn a_deserialize(inlining: impl Inlining) -> AParseResult<Self> {
<A::WithMode as AtomicProxy>::pa_deserialize(inlining)
}
fn a_extend(self, tail: &[u8]) -> AParseResult<Self> {
<A::WithMode as AtomicProxy>::pa_extend(self, tail)
}
}