From for CheckedParseError
{
}
}
-pub type CheckedParseFailure<'a, Ctx, F> = CheckedParseError>;
+pub type CheckedParseFailure<'a, F> = CheckedParseError>;
/// Returned by [`CheckedParse::deserialize_checked`].
-pub type CheckedParseResult<'a, Ctx, F> = Result, CheckedParseFailure<'a, Ctx, F>>;
+pub type CheckedParseResult<'a, F> = Result, CheckedParseFailure<'a, F>>;
/// Extension trait for factories that ensures fixed size read.
pub trait CheckedParse<'a, Ctx: Context<'a>>: FixedSizeFactory<'a, Ctx> {
/// Verify proper read length using [`Deserializer::tell`].
- fn deserialize_checked(&self, inctx: impl InCtx<'a, Ctx>) -> CheckedParseResult<'a, Ctx, Self> {
+ fn deserialize_checked(&self, inctx: impl InCtx<'a, Ctx>) -> CheckedParseResult<'a, Self> {
let expected_size = self.size();
let start = inctx.itell();
let (result, inctx) = self.ideserialize(inctx)?;
diff --git a/src/rstd/inlining/static_pair.rs b/src/rstd/inlining/static_pair.rs
index 6b8ebf3..0ed4f6b 100644
--- a/src/rstd/inlining/static_pair.rs
+++ b/src/rstd/inlining/static_pair.rs
@@ -29,19 +29,19 @@ pub trait StaticPairSerializable {
/// at the cost of having to specify two extra fields.
///
/// Note: [`StaticPair::FA`] requires [`InliningFactory`] be implemented.
-pub trait StaticPair<'a, Ctx: Context<'a>>:
+pub trait StaticPair<'a>:
'a + Send + Sync + StaticPairSerializable + Sized
{
/// [Factory] data. May, depending on the usecase, include factory (factories) on the element(s).
type FactoryData: 'a + Send + Sync + Clone;
/// First element's type. Must equal [`StaticPairSerializable::SA`].
- type A: MentionableBase<'a, Ctx, Fctr = Self::FA>;
+ type A: MentionableBase<'a, Fctr = Self::FA>;
/// Second element's type. Must equal [`StaticPairSerializable::SB`].
- type B: MentionableBase<'a, Ctx, Fctr = Self::FB>;
+ type B: MentionableBase<'a, Fctr = Self::FB>;
/// First element's factory.
- type FA: FactoryBase<'a, Ctx, Mtbl = Self::A> + ParseMode;
+ type FA: FactoryBase<'a, Mtbl = Self::A> + ParseMode;
/// Second element's factory.
- type FB: FactoryBase<'a, Ctx, Mtbl = Self::B> + ParseMode;
+ type FB: FactoryBase<'a, Mtbl = Self::B> + ParseMode;
/// See [`FactoryBase::ParseError`].
type ParseError: 'a + Send + Error;
@@ -56,12 +56,12 @@ pub trait StaticPair<'a, Ctx: Context<'a>>:
/// Regularise the error returned while parsing the first element.
fn from_error_a(
factory_data: &Self::FactoryData,
- error: ParseError<'a, Ctx, Self::FA>,
+ error: ParseError<'a, Self::FA>,
) -> Self::ParseError;
/// Regularise the error returned while parsing the second element.
fn from_error_b(
factory_data: &Self::FactoryData,
- error: ParseError<'a, Ctx, Self::FB>,
+ error: ParseError<'a, Self::FB>,
) -> Self::ParseError;
/// Derive factory data from the object data.
fn factory_data(&self) -> Self::FactoryData;
@@ -94,7 +94,7 @@ impl Deref for StaticPairObject {
}
/// Generic implementation of a [Factory] for [StaticPair]s.
-pub struct StaticPairFactory<'a, Ctx: Context<'a>, SP: StaticPair<'a, Ctx>> {
+pub struct StaticPairFactory<'a, SP: StaticPair<'a>> {
factory_data: SP::FactoryData,
}
@@ -112,10 +112,8 @@ impl Serializable for StaticPairObject {
}
}
-impl<'a, Ctx: Context<'a>, SP: StaticPair<'a, Ctx>> MentionableBase<'a, Ctx>
- for StaticPairObject
-{
- type Fctr = StaticPairFactory<'a, Ctx, SP>;
+impl<'a, SP: StaticPair<'a>> MentionableBase<'a> for StaticPairObject {
+ type Fctr = StaticPairFactory<'a, SP>;
fn factory(&self) -> Self::Fctr {
StaticPairFactory {
@@ -129,7 +127,7 @@ impl StaticPairObject {
pair: &SP,
points: &mut impl PointsVisitor<'a, Ctx>,
) where
- SP: StaticPair<'a, Ctx>,
+ SP: StaticPair<'a>,
SP::A: Mentionable<'a, Ctx>,
SP::B: Mentionable<'a, Ctx>,
{
@@ -139,7 +137,7 @@ impl StaticPairObject {
}
}
-impl<'a, Ctx: Context<'a>, SP: StaticPair<'a, Ctx>> MentionableTop<'a, Ctx> for StaticPairObject
+impl<'a, Ctx: Context<'a>, SP: StaticPair<'a>> MentionableTop<'a, Ctx> for StaticPairObject
where
SP::A: Mentionable<'a, Ctx>,
SP::B: Mentionable<'a, Ctx>,
@@ -149,7 +147,7 @@ where
}
}
-impl<'a, Ctx: Context<'a>, SP: StaticPair<'a, Ctx>> Clone for StaticPairFactory<'a, Ctx, SP> {
+impl<'a, SP: StaticPair<'a>> Clone for StaticPairFactory<'a, SP> {
fn clone(&self) -> Self {
Self {
factory_data: self.factory_data.clone(),
@@ -157,27 +155,25 @@ impl<'a, Ctx: Context<'a>, SP: StaticPair<'a, Ctx>> Clone for StaticPairFactory<
}
}
-impl<'a, Ctx: Context<'a>, SP: StaticPair<'a, Ctx>> FactoryBase<'a, Ctx>
- for StaticPairFactory<'a, Ctx, SP>
-{
+impl<'a, SP: StaticPair<'a>> FactoryBase<'a> for StaticPairFactory<'a, SP> {
type Mtbl = StaticPairObject;
type ParseError = SP::ParseError;
}
-impl<'a, Ctx: Context<'a>, SP: StaticPair<'a, Ctx>> ParseMode for StaticPairFactory<'a, Ctx, SP> {
+impl<'a, SP: StaticPair<'a>> ParseMode for StaticPairFactory<'a, SP> {
type Mode = ::Mode;
}
-impl<'a, Ctx: Context<'a>, SP: StaticPair<'a, Ctx>> StaticPairFactory<'a, Ctx, SP>
-where
- SP::FA: InliningFactory<'a, Ctx>,
- SP::FB: FactoryModeParse<'a, Ctx>,
-{
- pub fn mdeserialize_sp>(
+impl<'a, SP: StaticPair<'a>> StaticPairFactory<'a, SP> {
+ pub fn mdeserialize_sp, I: InCtx<'a, Ctx>>(
factory_data: &SP::FactoryData,
inctx: I,
- ) -> ModeResultP {
+ ) -> ModeResultP
+ where
+ SP::FA: InliningFactory<'a, Ctx>,
+ SP::FB: FactoryModeParse<'a, Ctx>,
+ {
let (fa, fb) = SP::factories(factory_data);
let (a, inctx) = fa
.ideserialize(inctx)
@@ -189,11 +185,15 @@ where
)
}
- pub fn mextend_sp(
+ pub fn mextend_sp>(
factory_data: &SP::FactoryData,
mentionable: ExtensionSourceP,
tail: &[u8],
- ) -> ExtensionResultP {
+ ) -> ExtensionResultP
+ where
+ SP::FA: InliningFactory<'a, Ctx>,
+ SP::FB: FactoryModeParse<'a, Ctx>,
+ {
let (_, fb) = SP::factories(factory_data);
// annotated to help rust-analyzer
Self::xsbind::(
@@ -205,13 +205,13 @@ where
}
}
-impl<'a, Ctx: Context<'a>, SP: StaticPair<'a, Ctx>> FactoryModeParse<'a, Ctx>
- for StaticPairFactory<'a, Ctx, SP>
+impl<'a, Ctx: Context<'a>, SP: StaticPair<'a>> FactoryModeParse<'a, Ctx>
+ for StaticPairFactory<'a, SP>
where
SP::FA: InliningFactory<'a, Ctx>,
SP::FB: FactoryModeParse<'a, Ctx>,
{
- fn mdeserialize>(&self, inctx: I) -> ModeResultM<'a, Ctx, Self, I> {
+ fn mdeserialize>(&self, inctx: I) -> ModeResultM<'a, Self, I> {
Ok(Self::map(
Self::mdeserialize_sp(&self.factory_data, inctx)?,
|pair| StaticPairObject { pair },
@@ -220,9 +220,9 @@ where
fn mextend(
&self,
- mentionable: ExtensionSourceM<'a, Ctx, Self>,
+ mentionable: ExtensionSourceM<'a, Self>,
tail: &[u8],
- ) -> ExtensionResultM<'a, Ctx, Self> {
+ ) -> ExtensionResultM<'a, Self> {
Self::xbind(
Self::mextend_sp(
&self.factory_data,
@@ -234,8 +234,8 @@ where
}
}
-impl<'a, Ctx: Context<'a>, SP: StaticPair<'a, Ctx>> FixedSizeFactory<'a, Ctx>
- for StaticPairFactory<'a, Ctx, SP>
+impl<'a, Ctx: Context<'a>, SP: StaticPair<'a>> FixedSizeFactory<'a, Ctx>
+ for StaticPairFactory<'a, SP>
where
SP::FA: FixedSizeFactory<'a, Ctx>,
SP::FB: FixedSizeFactory<'a, Ctx> + FactoryModeParse<'a, Ctx>,
@@ -246,8 +246,8 @@ where
}
}
-impl<'a, Ctx: Context<'a>, SP: StaticPair<'a, Ctx>> ConstSizeFactory<'a, Ctx>
- for StaticPairFactory<'a, Ctx, SP>
+impl<'a, Ctx: Context<'a>, SP: StaticPair<'a>> ConstSizeFactory<'a, Ctx>
+ for StaticPairFactory<'a, SP>
where
SP::FA: ConstSizeFactory<'a, Ctx>,
SP::FB: ConstSizeFactory<'a, Ctx> + FactoryModeParse<'a, Ctx>,
diff --git a/src/rstd/nullable.rs b/src/rstd/nullable.rs
index 9010d4d..185f21e 100644
--- a/src/rstd/nullable.rs
+++ b/src/rstd/nullable.rs
@@ -1,5 +1,7 @@
//! This module introduces [`Option`]-like concepts into RADN typesystem using [`Nullable`].
+use std::marker::PhantomData;
+
use crate::func::context::*;
use crate::mode::*;
use crate::rcore::*;
@@ -7,20 +9,29 @@ use crate::rcore::*;
use super::{inlining::*, point::*, *};
/// Nullable reference type. Made for use as a linking element in data structures.
-pub enum Nullable<'a, Ctx: Context<'a>, A: MentionableBase<'a, Ctx>> {
+pub enum Nullable<'a, Ctx: Context<'a>, A: MentionableBase<'a>> {
/// Unlike original Python implementation, stores the factory only in the null case.
Null(A::Fctr),
NotNull(Point<'a, Ctx, A>),
}
/// Nullable reference factory.
-#[derive(Clone)]
-pub struct NullableFactory {
+pub struct NullableFactory {
/// Factory of the referenced object.
factory: F,
+ _ctx: PhantomData,
}
-impl<'a, Ctx: Context<'a>, A: MentionableBase<'a, Ctx>> Serializable for Nullable<'a, Ctx, A> {
+impl Clone for NullableFactory {
+ fn clone(&self) -> Self {
+ Self {
+ factory: self.factory.clone(),
+ _ctx: PhantomData,
+ }
+ }
+}
+
+impl<'a, Ctx: Context<'a>, A: MentionableBase<'a>> Serializable for Nullable<'a, Ctx, A> {
fn serialize(&self, serializer: &mut dyn Serializer) {
serializer.write(match self {
Self::Null(_) => &HASH_ZEROS,
@@ -29,19 +40,13 @@ impl<'a, Ctx: Context<'a>, A: MentionableBase<'a, Ctx>> Serializable for Nullabl
}
}
-impl<'a, Ctx: Context<'a>, A: MentionableBase<'a, Ctx>> MentionableBase<'a, Ctx>
- for Nullable<'a, Ctx, A>
-{
- type Fctr = NullableFactory;
+impl<'a, Ctx: Context<'a>, A: MentionableBase<'a>> MentionableBase<'a> for Nullable<'a, Ctx, A> {
+ type Fctr = NullableFactory;
fn factory(&self) -> Self::Fctr {
match self {
- Self::Null(factory) => NullableFactory {
- factory: factory.clone(),
- },
- Self::NotNull(point) => NullableFactory {
- factory: point.origin.factory(),
- },
+ Self::Null(factory) => NullableFactory::new(factory.clone()),
+ Self::NotNull(point) => NullableFactory::new(point.origin.factory()),
}
}
}
@@ -57,13 +62,13 @@ impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> MentionableTop<'a, Ctx>
}
}
-impl<'a, Ctx: Context<'a>, F: FactoryBase<'a, Ctx>> FactoryBase<'a, Ctx> for NullableFactory {
+impl<'a, Ctx: Context<'a>, F: FactoryBase<'a>> FactoryBase<'a> for NullableFactory {
type Mtbl = Nullable<'a, Ctx, F::Mtbl>;
type ParseError = PointParseError;
}
-impl ImplMode for NullableFactory {
+impl ImplMode for NullableFactory {
type Mode = InliningMode;
}
@@ -72,7 +77,7 @@ impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> Nullable<'a, Ctx, Nullable<'
pub fn join(&self) -> Resolution<'a, Ctx, Nullable<'a, Ctx, A>> {
match self {
Self::Null(nullable_factory) => {
- let NullableFactory { factory } = nullable_factory;
+ let NullableFactory { factory, .. } = nullable_factory;
Ctx::pure(Ok(Arc::new(Nullable::Null(factory.clone()))))
}
Self::NotNull(point) => point.resolve(),
@@ -93,7 +98,7 @@ impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> Nullable<'a, Ctx, A> {
}
}
-impl<'a, Ctx: Context<'a>, A: MentionableBase<'a, Ctx>> Nullable<'a, Ctx, A> {
+impl<'a, Ctx: Context<'a>, A: MentionableBase<'a>> Nullable<'a, Ctx, A> {
pub fn is_null(&self) -> bool {
match self {
Nullable::Null(_) => true,
@@ -102,13 +107,16 @@ impl<'a, Ctx: Context<'a>, A: MentionableBase<'a, Ctx>> Nullable<'a, Ctx, A> {
}
}
-impl NullableFactory {
+impl NullableFactory {
pub fn new(factory: F) -> Self {
- Self { factory }
+ Self {
+ factory,
+ _ctx: PhantomData,
+ }
}
}
-impl<'a, Ctx: Context<'a>, A: MentionableBase<'a, Ctx>> Clone for Nullable<'a, Ctx, A> {
+impl<'a, Ctx: Context<'a>, A: MentionableBase<'a>> Clone for Nullable<'a, Ctx, A> {
fn clone(&self) -> Self {
match self {
Self::Null(factory) => Self::Null(factory.clone()),
@@ -117,14 +125,14 @@ impl<'a, Ctx: Context<'a>, A: MentionableBase<'a, Ctx>> Clone for Nullable<'a, C
}
}
-impl<'a, Ctx: Context<'a>, F: FactoryBase<'a, Ctx>> CInliningFactory<'a, Ctx>
- for NullableFactory
+impl<'a, Ctx: Context<'a>, F: FactoryBase<'a>> CInliningFactory<'a, Ctx>
+ for NullableFactory
{
fn cextension_error(&self, tail: &[u8]) -> Self::ParseError {
PointParseError::WrongLength(HASH_SIZE + tail.len())
}
- fn cideserialize>(&self, inctx: I) -> IParseResult<'a, Ctx, Self, I> {
+ fn cideserialize>(&self, inctx: I) -> IParseResult<'a, Self, I> {
let factory = self.factory.clone();
let (address, inctx) = inctx.icnext_address(PointParseError::from_ref)?;
Ok((
@@ -138,7 +146,7 @@ impl<'a, Ctx: Context<'a>, F: FactoryBase<'a, Ctx>> CInliningFactory<'a, Ctx>
}
}
-impl AlwaysConstSize for NullableFactory {
+impl AlwaysConstSize for NullableFactory {
const _SIZE: usize = HASH_SIZE;
}
diff --git a/src/rstd/point.rs b/src/rstd/point.rs
index e492432..25705cd 100644
--- a/src/rstd/point.rs
+++ b/src/rstd/point.rs
@@ -1,25 +1,31 @@
//! Module responsible for making [Point]s [Mentionable].
+use std::marker::PhantomData;
use std::{error::Error, fmt::Display};
use crate::mode::*;
use crate::rcore::*;
use crate::rstd::inlining::*;
-impl<'a, Ctx: Context<'a>, A: MentionableBase<'a, Ctx>> Serializable for Point<'a, Ctx, A> {
+impl<'a, Ctx: Context<'a>, A: MentionableBase<'a>> Serializable for Point<'a, Ctx, A> {
fn serialize(&self, serializer: &mut dyn Serializer) {
serializer.write(&self.point)
}
}
-impl<'a, Ctx: Context<'a>, A: MentionableBase<'a, Ctx>> MentionableBase<'a, Ctx>
- for Point<'a, Ctx, A>
-{
- type Fctr = PointFactory;
+impl<'a, Ctx: Context<'a>, A: MentionableBase<'a>> MentionableBase<'a> for Point<'a, Ctx, A> {
+ type Fctr = PointFactory;
fn factory(&self) -> Self::Fctr {
- PointFactory {
- factory: self.origin.factory(),
+ PointFactory::new(self.origin.factory())
+ }
+}
+
+impl PointFactory {
+ fn new(factory: F) -> Self {
+ Self {
+ factory,
+ _ctx: PhantomData,
}
}
}
@@ -34,12 +40,18 @@ impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> MentionableTop<'a, Ctx> for
}
}
-#[derive(Clone)]
-pub struct PointFactory {
+pub struct PointFactory {
factory: F,
+ _ctx: PhantomData,
}
-impl PointFactory {
+impl Clone for PointFactory