From 133a3c23e57321465c64f012b326ecc2ff115e0e Mon Sep 17 00:00:00 2001 From: timofey Date: Sun, 18 Jun 2023 12:46:02 +0000 Subject: [PATCH] non-AVL trees --- src/rstd/collections/tree.rs | 129 ++++++++++++++++++++++++++++++++++- 1 file changed, 127 insertions(+), 2 deletions(-) diff --git a/src/rstd/collections/tree.rs b/src/rstd/collections/tree.rs index 3a56acd..9a2943e 100644 --- a/src/rstd/collections/tree.rs +++ b/src/rstd/collections/tree.rs @@ -1,6 +1,13 @@ -use std::{error::Error, fmt::Display}; +use std::{error::Error, fmt::Display, rc::Rc}; -use crate::rstd::{atomic::au64::*, point::*}; +use crate::{ + rcore::*, + rstd::{ + atomic::{au64::*, *}, + nullable::*, + point::*, + }, +}; #[derive(Debug)] pub enum TreeParseError { @@ -38,3 +45,121 @@ impl Display for TreeParseError { } impl Error for TreeParseError {} + +pub struct Node<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> { + l: Tree<'a, Ctx, A>, + r: Tree<'a, Ctx, A>, + key: A, +} + +pub struct Tree<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> { + node: Nullable<'a, Ctx, Node<'a, Ctx, A>>, + height: u64, +} + +#[derive(Clone)] +pub struct NodeFactory(F); + +#[derive(Clone)] +pub struct TreeFactory(NullableFactory>); + +impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> Serializable for Node<'a, Ctx, A> { + fn serialize(&self, serializer: &mut dyn Serializer) { + self.l.serialize(serializer); + self.r.serialize(serializer); + self.key.serialize(serializer); + } +} + +impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> Serializable for Tree<'a, Ctx, A> { + fn serialize(&self, serializer: &mut dyn Serializer) { + self.height.serialize(serializer); + self.node.serialize(serializer); + } +} + +impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> Mentionable<'a, Ctx> for Node<'a, Ctx, A> { + type Fctr = NodeFactory; + + fn factory(&self) -> Self::Fctr { + NodeFactory(self.key.factory()) + } + + fn points_typed(&self, points: &mut impl TakesPoints<'a, Ctx>) { + self.l.points_typed(points); + self.r.points_typed(points); + self.key.points_typed(points); + } +} + +impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> Mentionable<'a, Ctx> for Tree<'a, Ctx, A> { + type Fctr = TreeFactory; + + fn factory(&self) -> Self::Fctr { + TreeFactory(self.node.factory()) + } + + fn points_typed(&self, points: &mut impl TakesPoints<'a, Ctx>) { + self.node.points_typed(points); + } +} + +impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for NodeFactory { + type Mtbl = Node<'a, Ctx, F::Mtbl>; + + type ParseError = TreeParseError; + + fn deserialize( + &self, + deserializer: &mut dyn Deserializer, + resolver: Rc>, + addresses: &mut Addresses, + ) -> ParseResult<'a, Ctx, Self> { + let tree_factory = TreeFactory(NullableFactory::new(self.clone())); + let l = tree_factory.deserialize(deserializer, resolver.clone(), addresses)?; + let r = tree_factory.deserialize(deserializer, resolver.clone(), addresses)?; + let key = self + .0 + .deserialize(deserializer, resolver.clone(), addresses) + .map_err(TreeParseError::Key)?; + Ok(Node { l, r, key }) + } + + fn extend( + &self, + mut mentionable: Self::Mtbl, + tail: &[u8], + ) -> Result { + mentionable.key = self + .0 + .extend(mentionable.key, tail) + .map_err(TreeParseError::Key)?; + Ok(mentionable) + } +} + +impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for TreeFactory { + type Mtbl = Tree<'a, Ctx, F::Mtbl>; + + type ParseError = TreeParseError; + + fn deserialize( + &self, + deserializer: &mut dyn Deserializer, + resolver: Rc>, + addresses: &mut Addresses, + ) -> ParseResult<'a, Ctx, Self> { + let node = self.0.deserialize(deserializer, resolver, addresses)?; + let height = u64::a_deserialize(deserializer)?; + Ok(Tree { node, height }) + } + + fn extend( + &self, + mut mentionable: Self::Mtbl, + tail: &[u8], + ) -> Result { + mentionable.height = u64::a_extend(mentionable.height, tail)?; + Ok(mentionable) + } +}