resolver by reference

This commit is contained in:
AF 2023-06-28 14:29:39 +00:00
parent 0fdf7532dc
commit 422275bbeb
14 changed files with 51 additions and 66 deletions

View File

@ -72,7 +72,7 @@ pub trait Factory<'a, Ctx: Context<'a>>: 'a + Send + Sync + Clone {
fn deserialize( fn deserialize(
&self, &self,
deserializer: &mut dyn Deserializer, deserializer: &mut dyn Deserializer,
resolver: Rc<dyn Resolver<'a, Ctx>>, resolver: &Rc<dyn Resolver<'a, Ctx>>,
addresses: &mut Addresses, addresses: &mut Addresses,
) -> ParseResult<'a, Ctx, Self>; ) -> 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.
@ -86,11 +86,11 @@ pub type ParseError<'a, Ctx, F> = <F as Factory<'a, Ctx>>::ParseError;
pub type ParseErrorA<'a, Ctx, A> = ParseError<'a, Ctx, Fctr<'a, Ctx, A>>; pub type ParseErrorA<'a, Ctx, A> = ParseError<'a, Ctx, Fctr<'a, Ctx, A>>;
/// Extension trait for factories. /// Extension trait for factories.
pub trait ExtFactory<'a, Ctx: Context<'a>>: Factory<'a, Ctx> { pub trait FactoryExt<'a, Ctx: Context<'a>>: Factory<'a, Ctx> {
/// Parse the object from a slice. /// Parse the object from a slice.
fn parse_slice( fn parse_slice(
&self, &self,
slice: &[u8], slice: &[u8],
resolver: Rc<dyn Resolver<'a, Ctx>>, resolver: &Rc<dyn Resolver<'a, Ctx>>,
) -> ParseResult<'a, Ctx, Self>; ) -> ParseResult<'a, Ctx, Self>;
} }

View File

@ -43,7 +43,7 @@ impl Addresses {
fn _parse_slice<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>>( fn _parse_slice<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>>(
factory: &A::Fctr, factory: &A::Fctr,
slice: &[u8], slice: &[u8],
resolver: Rc<dyn Resolver<'a, Ctx>>, resolver: &Rc<dyn Resolver<'a, Ctx>>,
) -> ParseResult<'a, Ctx, A::Fctr> { ) -> ParseResult<'a, Ctx, A::Fctr> {
let mut deserializer = SliceDeserializer::from(slice); let mut deserializer = SliceDeserializer::from(slice);
let mentionable = factory.deserialize(&mut deserializer, resolver, &mut Addresses::start())?; let mentionable = factory.deserialize(&mut deserializer, resolver, &mut Addresses::start())?;
@ -55,11 +55,11 @@ fn _parse_slice<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>>(
} }
} }
impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> ExtFactory<'a, Ctx> for F { impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> FactoryExt<'a, Ctx> for F {
fn parse_slice( fn parse_slice(
&self, &self,
slice: &[u8], slice: &[u8],
resolver: Rc<dyn Resolver<'a, Ctx>>, resolver: &Rc<dyn Resolver<'a, Ctx>>,
) -> ParseResult<'a, Ctx, Self> { ) -> ParseResult<'a, Ctx, Self> {
_parse_slice::<Ctx, F::Mtbl>(self, slice, resolver) _parse_slice::<Ctx, F::Mtbl>(self, slice, resolver)
} }

View File

@ -34,7 +34,7 @@ fn _resolve_origin<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>>(
let (src, resolver) = resolved.map_err(ResolutionError::Lookup)?; let (src, resolver) = resolved.map_err(ResolutionError::Lookup)?;
let mentionable = origin let mentionable = origin
.r_factory .r_factory
.parse_slice(&src, resolver) .parse_slice(&src, &resolver)
.map_err(ResolutionError::Parse)?; .map_err(ResolutionError::Parse)?;
Ok(Rc::new(mentionable)) Ok(Rc::new(mentionable))
}) })

View File

@ -2,7 +2,7 @@ use std::cmp::min;
use super::*; use super::*;
/// [Deserializer] for slices. Used in [`ExtFactory::parse_slice`] and [`crate::rstd::atomic::ExtAtomic::parse_slice`]. /// [Deserializer] for slices. Used in [`FactoryExt::parse_slice`] and [`crate::rstd::atomic::ExtAtomic::parse_slice`].
pub struct SliceDeserializer<'a> { pub struct SliceDeserializer<'a> {
slice: &'a [u8], slice: &'a [u8],
pos: usize, pos: usize,

View File

@ -37,12 +37,10 @@ fn _parse_slice<A: Atomic>(slice: &[u8]) -> Result<A, A::AParseError> {
/// Extension trait to provide method-like utilities associated with [Atomic]s. /// Extension trait to provide method-like utilities associated with [Atomic]s.
pub trait ExtAtomic: Atomic { pub trait ExtAtomic: Atomic {
/// Static equivalent of [`ExtFactory::parse_slice`]. /// Static equivalent of [`FactoryExt::parse_slice`].
fn parse_slice(slice: &[u8]) -> Result<Self, Self::AParseError>;
}
impl<A: Atomic> ExtAtomic for A {
fn parse_slice(slice: &[u8]) -> Result<Self, Self::AParseError> { fn parse_slice(slice: &[u8]) -> Result<Self, Self::AParseError> {
_parse_slice(slice) _parse_slice(slice)
} }
} }
impl<A: Atomic> ExtAtomic for A {}

View File

@ -75,7 +75,7 @@ impl<'a, Ctx: Context<'a>, A: Atomic> Factory<'a, Ctx> for AtomicFactory<A> {
fn deserialize( fn deserialize(
&self, &self,
deserializer: &mut dyn Deserializer, deserializer: &mut dyn Deserializer,
_resolver: Rc<dyn Resolver<'a, Ctx>>, _resolver: &Rc<dyn Resolver<'a, Ctx>>,
_addresses: &mut Addresses, _addresses: &mut Addresses,
) -> ParseResult<'a, Ctx, Self> { ) -> ParseResult<'a, Ctx, Self> {
Ok(A::a_deserialize(deserializer)?.into()) Ok(A::a_deserialize(deserializer)?.into())
@ -87,18 +87,15 @@ impl<'a, Ctx: Context<'a>, A: Atomic> Factory<'a, Ctx> for AtomicFactory<A> {
} }
/// Extension trait to provide method-like utilities associated with [AtomicObject]s. /// Extension trait to provide method-like utilities associated with [AtomicObject]s.
pub trait ExtAtomicObject: Atomic { pub trait AtomicObjectExt: Atomic {
/// Shorthand for getting specific [`AtomicFactory`]. /// Shorthand for getting specific [`AtomicFactory`].
fn f() -> AtomicFactory<Self>;
/// Shorthand for getting specific [`AtomicObject`].
fn m(self) -> AtomicObject<Self>;
}
impl<A: Atomic> ExtAtomicObject for A {
fn f() -> AtomicFactory<Self> { fn f() -> AtomicFactory<Self> {
AtomicFactory::new() AtomicFactory::new()
} }
/// Shorthand for getting specific [`AtomicObject`].
fn m(self) -> AtomicObject<Self> { fn m(self) -> AtomicObject<Self> {
self.into() self.into()
} }
} }
impl<A: Atomic> AtomicObjectExt for A {}

View File

@ -162,7 +162,7 @@ where
) -> CastResult<'a, Ctx, A> { ) -> CastResult<'a, Ctx, A> {
factory.parse_slice( factory.parse_slice(
&self.bytes(), &self.bytes(),
map_resolver(CastResolver::rc(self.points_vec())), &map_resolver(CastResolver::rc(self.points_vec())),
) )
} }

View File

@ -77,14 +77,12 @@ impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for StackNodeFa
fn deserialize( fn deserialize(
&self, &self,
deserializer: &mut dyn Deserializer, deserializer: &mut dyn Deserializer,
resolver: Rc<dyn Resolver<'a, Ctx>>, resolver: &Rc<dyn Resolver<'a, Ctx>>,
addresses: &mut Addresses, addresses: &mut Addresses,
) -> ParseResult<'a, Ctx, Self> { ) -> ParseResult<'a, Ctx, Self> {
let rest = match NullableFactory::new(self.clone()).deserialize( let rest =
deserializer, match NullableFactory::new(self.clone()).deserialize(deserializer, resolver, addresses)
resolver.clone(), {
addresses,
) {
Ok(rest) => rest, Ok(rest) => rest,
Err(ppe) => { Err(ppe) => {
return Err(StackParseError::Point(ppe)); return Err(StackParseError::Point(ppe));

View File

@ -138,15 +138,15 @@ impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for NodeFactory
fn deserialize( fn deserialize(
&self, &self,
deserializer: &mut dyn Deserializer, deserializer: &mut dyn Deserializer,
resolver: Rc<dyn Resolver<'a, Ctx>>, resolver: &Rc<dyn Resolver<'a, Ctx>>,
addresses: &mut Addresses, addresses: &mut Addresses,
) -> ParseResult<'a, Ctx, Self> { ) -> ParseResult<'a, Ctx, Self> {
let tree_factory = TreeFactory(NullableFactory::new(self.clone())); let tree_factory = TreeFactory(NullableFactory::new(self.clone()));
let l = tree_factory.deserialize(deserializer, resolver.clone(), addresses)?; let l = tree_factory.deserialize(deserializer, resolver, addresses)?;
let r = tree_factory.deserialize(deserializer, resolver.clone(), addresses)?; let r = tree_factory.deserialize(deserializer, resolver, addresses)?;
let key = self let key = self
.0 .0
.deserialize(deserializer, resolver.clone(), addresses) .deserialize(deserializer, resolver, addresses)
.map_err(TreeParseError::Key)?; .map_err(TreeParseError::Key)?;
Ok(Node { l, r, key }) Ok(Node { l, r, key })
} }
@ -168,7 +168,7 @@ impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for TreeFactory
fn deserialize( fn deserialize(
&self, &self,
deserializer: &mut dyn Deserializer, deserializer: &mut dyn Deserializer,
resolver: Rc<dyn Resolver<'a, Ctx>>, resolver: &Rc<dyn Resolver<'a, Ctx>>,
addresses: &mut Addresses, addresses: &mut Addresses,
) -> ParseResult<'a, Ctx, Self> { ) -> ParseResult<'a, Ctx, Self> {
let node = self.0.deserialize(deserializer, resolver, addresses)?; let node = self.0.deserialize(deserializer, resolver, addresses)?;

View File

@ -146,22 +146,7 @@ pub trait CheckedParse<'a, Ctx: Context<'a>>: FixedSizeFactory<'a, Ctx> {
fn deserialize_checked( fn deserialize_checked(
&self, &self,
deserializer: &mut dyn Deserializer, deserializer: &mut dyn Deserializer,
resolver: Rc<dyn Resolver<'a, Ctx>>, resolver: &Rc<dyn Resolver<'a, Ctx>>,
addresses: &mut Addresses,
) -> CheckedParseResult<'a, Ctx, Self>;
}
/// Extension trait for factories that ensures fixed size write.
pub trait CheckedSerialize<'a, Ctx: Context<'a>>: Serializable + FixedSizeObject<'a, Ctx> {
/// Verify proper write length using [`Serializer::tell`].
fn serialize_checked(&self, serializer: &mut dyn Serializer) -> Result<(), SizeError>;
}
impl<'a, Ctx: Context<'a>, F: FixedSizeFactory<'a, Ctx>> CheckedParse<'a, Ctx> for F {
fn deserialize_checked(
&self,
deserializer: &mut dyn Deserializer,
resolver: Rc<dyn Resolver<'a, Ctx>>,
addresses: &mut Addresses, addresses: &mut Addresses,
) -> CheckedParseResult<'a, Ctx, Self> { ) -> CheckedParseResult<'a, Ctx, Self> {
let expected_size = self.size(); let expected_size = self.size();
@ -180,9 +165,9 @@ impl<'a, Ctx: Context<'a>, F: FixedSizeFactory<'a, Ctx>> CheckedParse<'a, Ctx> f
} }
} }
impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx> + FixedSizeObject<'a, Ctx>> /// Extension trait for factories that ensures fixed size write.
CheckedSerialize<'a, Ctx> for A pub trait CheckedSerialize<'a, Ctx: Context<'a>>: Serializable + FixedSizeObject<'a, Ctx> {
{ /// Verify proper write length using [`Serializer::tell`].
fn serialize_checked(&self, serializer: &mut dyn Serializer) -> Result<(), SizeError> { fn serialize_checked(&self, serializer: &mut dyn Serializer) -> Result<(), SizeError> {
let expected_size = self.size(); let expected_size = self.size();
let start = serializer.tell(); let start = serializer.tell();
@ -200,6 +185,13 @@ impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx> + FixedSizeObject<'a, Ctx>>
} }
} }
impl<'a, Ctx: Context<'a>, F: FixedSizeFactory<'a, Ctx>> CheckedParse<'a, Ctx> for F {}
impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx> + FixedSizeObject<'a, Ctx>>
CheckedSerialize<'a, Ctx> for A
{
}
/// Trait useful for objects which aren't influenced by /// Trait useful for objects which aren't influenced by
/// whether some other type (for example, a generic parameter type) /// whether some other type (for example, a generic parameter type)
/// is fixed-size or not. /// is fixed-size or not.

View File

@ -134,11 +134,11 @@ impl<'a, Ctx: Context<'a>, SP: StaticPair<'a, Ctx>> Factory<'a, Ctx>
fn deserialize( fn deserialize(
&self, &self,
deserializer: &mut dyn Deserializer, deserializer: &mut dyn Deserializer,
resolver: Rc<dyn Resolver<'a, Ctx>>, resolver: &Rc<dyn Resolver<'a, Ctx>>,
addresses: &mut Addresses, addresses: &mut Addresses,
) -> ParseResult<'a, Ctx, Self> { ) -> ParseResult<'a, Ctx, Self> {
let (fa, fb) = SP::factories(&self.factory_data); let (fa, fb) = SP::factories(&self.factory_data);
let a: SP::A = match fa.deserialize(deserializer, resolver.clone(), addresses) { let a: SP::A = match fa.deserialize(deserializer, resolver, addresses) {
Ok(a) => a, Ok(a) => a,
Err(error) => return Err(SP::from_error_a(&self.factory_data, error)), Err(error) => return Err(SP::from_error_a(&self.factory_data, error)),
}; };

View File

@ -58,7 +58,7 @@ impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for NullableFac
fn deserialize( fn deserialize(
&self, &self,
deserializer: &mut dyn Deserializer, deserializer: &mut dyn Deserializer,
resolver: std::rc::Rc<dyn Resolver<'a, Ctx>>, resolver: &Rc<dyn Resolver<'a, Ctx>>,
addresses: &mut Addresses, addresses: &mut Addresses,
) -> ParseResult<'a, Ctx, Self> { ) -> ParseResult<'a, Ctx, Self> {
let factory = self.factory.clone(); let factory = self.factory.clone();
@ -66,7 +66,7 @@ impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for NullableFac
Ok(if address.point == HASH_ZEROS { Ok(if address.point == HASH_ZEROS {
Nullable::Null(factory) Nullable::Null(factory)
} else { } else {
Nullable::NotNull(Point::from_address(address, factory, resolver)) Nullable::NotNull(Point::from_address(address, factory, resolver.clone()))
}) })
} }

View File

@ -70,10 +70,10 @@ impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for PointFactor
fn deserialize( fn deserialize(
&self, &self,
deserializer: &mut dyn Deserializer, deserializer: &mut dyn Deserializer,
resolver: Rc<dyn Resolver<'a, Ctx>>, resolver: &Rc<dyn Resolver<'a, Ctx>>,
addresses: &mut Addresses, addresses: &mut Addresses,
) -> ParseResult<'a, Ctx, Self> { ) -> ParseResult<'a, Ctx, Self> {
Ok(addresses.next_point(deserializer, resolver, self.factory.clone())?) Ok(addresses.next_point(deserializer, resolver.clone(), self.factory.clone())?)
} }
fn extend(&self, _mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self> { fn extend(&self, _mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self> {

View File

@ -20,7 +20,7 @@ trait Tde<'a, Ctx: Context<'a>>: 'a + Send + Sync {
fn de( fn de(
&self, &self,
deserializer: &mut dyn Deserializer, deserializer: &mut dyn Deserializer,
resolver: Rc<dyn Resolver<'a, Ctx>>, resolver: &Rc<dyn Resolver<'a, Ctx>>,
addresses: &mut Addresses, addresses: &mut Addresses,
) -> TypelessParsed<'a, Ctx>; ) -> TypelessParsed<'a, Ctx>;
} }
@ -98,7 +98,7 @@ impl<'a, Ctx: Context<'a>> Factory<'a, Ctx> for TypelessFactory<'a, Ctx> {
fn deserialize( fn deserialize(
&self, &self,
deserializer: &mut dyn Deserializer, deserializer: &mut dyn Deserializer,
resolver: Rc<dyn Resolver<'a, Ctx>>, resolver: &Rc<dyn Resolver<'a, Ctx>>,
addresses: &mut Addresses, addresses: &mut Addresses,
) -> ParseResult<'a, Ctx, Self> { ) -> ParseResult<'a, Ctx, Self> {
match self.t_deserialize.de(deserializer, resolver, addresses) { match self.t_deserialize.de(deserializer, resolver, addresses) {
@ -140,7 +140,7 @@ where
fn de( fn de(
&self, &self,
deserializer: &mut dyn Deserializer, deserializer: &mut dyn Deserializer,
resolver: Rc<dyn Resolver<'a, Ctx>>, resolver: &Rc<dyn Resolver<'a, Ctx>>,
addresses: &mut Addresses, addresses: &mut Addresses,
) -> TypelessParsed<'a, Ctx> { ) -> TypelessParsed<'a, Ctx> {
self.deserialize(deserializer, resolver, addresses) self.deserialize(deserializer, resolver, addresses)