From 8015a9301ba147045a1dacc40bc06a5e195a8824 Mon Sep 17 00:00:00 2001 From: timofey Date: Fri, 28 Jul 2023 21:22:14 +0000 Subject: [PATCH] `RegularAtomic` --- src/rcore.rs | 4 +++- src/rcore/modes.rs | 2 +- src/rstd/atomic.rs | 1 + src/rstd/atomic/modes.rs | 38 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 src/rstd/atomic/modes.rs diff --git a/src/rcore.rs b/src/rcore.rs index a281c86..1083b30 100644 --- a/src/rcore.rs +++ b/src/rcore.rs @@ -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; diff --git a/src/rcore/modes.rs b/src/rcore/modes.rs index a4e2e26..cfb2cee 100644 --- a/src/rcore/modes.rs +++ b/src/rcore/modes.rs @@ -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; } diff --git a/src/rstd/atomic.rs b/src/rstd/atomic.rs index 02e7bdd..68c7dba 100644 --- a/src/rstd/atomic.rs +++ b/src/rstd/atomic.rs @@ -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; diff --git a/src/rstd/atomic/modes.rs b/src/rstd/atomic/modes.rs new file mode 100644 index 0000000..3c5f07d --- /dev/null +++ b/src/rstd/atomic/modes.rs @@ -0,0 +1,38 @@ +use super::*; + +pub trait RegularAtomic: AtomicBase + ModeFactory { + fn ra_deserialize(inlining: impl Inlining) -> AParseResult; + fn ra_extend(self, tail: &[u8]) -> AParseResult; +} + +pub trait AtomicProxy { + type A: AtomicBase + ModeFactory; + + fn pa_deserialize(inlining: impl Inlining) -> AParseResult; + fn pa_extend(a: Self::A, tail: &[u8]) -> AParseResult; +} + +impl AtomicProxy for WithMode { + type A = A; + + fn pa_deserialize(inlining: impl Inlining) -> AParseResult { + A::ra_deserialize(inlining) + } + + fn pa_extend(a: Self::A, tail: &[u8]) -> AParseResult { + a.ra_extend(tail) + } +} + +impl Atomic for A +where + A::WithMode: AtomicProxy, +{ + fn a_deserialize(inlining: impl Inlining) -> AParseResult { + ::pa_deserialize(inlining) + } + + fn a_extend(self, tail: &[u8]) -> AParseResult { + ::pa_extend(self, tail) + } +}