delete rbtree

This commit is contained in:
AF 2023-06-16 05:27:06 +00:00
parent 9d3da4f97c
commit 344831dc91
2 changed files with 0 additions and 264 deletions

View File

@ -2,5 +2,4 @@
pub mod avl;
pub mod pair;
pub mod rbtree;
pub mod stack;

View File

@ -1,263 +0,0 @@
pub mod subset;
use std::{error::Error, fmt::Display, rc::Rc};
use crate::rcore::*;
use crate::rstd::{
atomic::{boolean::*, *},
nullable::*,
point::*,
};
const B: bool = false;
const R: bool = true;
type RB = bool;
#[derive(Debug)]
pub enum TreeParseError<E> {
Boolean(BooleanParseError),
Point(PointParseError),
Key(E),
}
impl<E> From<BooleanParseError> for TreeParseError<E> {
fn from(value: BooleanParseError) -> Self {
Self::Boolean(value)
}
}
impl<E> From<PointParseError> for TreeParseError<E> {
fn from(value: PointParseError) -> Self {
Self::Point(value)
}
}
impl<E: Display> Display for TreeParseError<E> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Boolean(boolean_error) => {
f.write_fmt(format_args!("failed to parse RB flag: {boolean_error}"))
}
Self::Point(point_error) => f.write_fmt(format_args!(
"failed to parse RB tree reference: {point_error}"
)),
Self::Key(key_error) => {
f.write_fmt(format_args!("failed to parse RB tree key: {key_error}"))
}
}
}
}
impl<E: Error> Error for TreeParseError<E> {}
pub enum RBNode<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> {
R(RNode<'a, Ctx, A>),
B(BNode<'a, Ctx, A>),
}
pub struct BNode<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> {
cl: Nullable<'a, Ctx, RBNode<'a, Ctx, A>>,
cr: Nullable<'a, Ctx, RBNode<'a, Ctx, A>>,
key: Rc<A>,
}
pub struct RNode<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> {
cl: Nullable<'a, Ctx, BNode<'a, Ctx, A>>,
cr: Nullable<'a, Ctx, BNode<'a, Ctx, A>>,
key: Rc<A>,
}
#[derive(Clone)]
pub struct RBFactory<F> {
key_factory: F,
}
#[derive(Clone)]
pub struct BFactory<F> {
key_factory: F,
}
#[derive(Clone)]
pub struct RFactory<F> {
key_factory: F,
}
impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> RBNode<'a, Ctx, A> {
fn key(&self) -> &A {
match self {
RBNode::R(RNode { key, .. }) => key,
RBNode::B(BNode { key, .. }) => key,
}
}
}
impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> Serializable for RBNode<'a, Ctx, A> {
fn serialize(&self, serializer: &mut dyn Serializer) {
match self {
RBNode::R(r) => {
R.serialize(serializer);
r.serialize(serializer);
}
RBNode::B(b) => {
B.serialize(serializer);
b.serialize(serializer);
}
}
}
}
impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> Serializable for BNode<'a, Ctx, A> {
fn serialize(&self, serializer: &mut dyn Serializer) {
self.cl.serialize(serializer);
self.cr.serialize(serializer);
self.key.serialize(serializer);
}
}
impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> Serializable for RNode<'a, Ctx, A> {
fn serialize(&self, serializer: &mut dyn Serializer) {
self.cl.serialize(serializer);
self.cr.serialize(serializer);
self.key.serialize(serializer);
}
}
impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> Mentionable<'a, Ctx> for RBNode<'a, Ctx, A> {
type Fctr = RBFactory<A::Fctr>;
fn factory(&self) -> Self::Fctr {
RBFactory {
key_factory: self.key().factory(),
}
}
fn points_typed(&self, points: &mut impl TakesPoints<'a, Ctx>) {
match self {
RBNode::R(r) => r.points_typed(points),
RBNode::B(b) => b.points_typed(points),
}
}
}
impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> Mentionable<'a, Ctx> for BNode<'a, Ctx, A> {
type Fctr = BFactory<A::Fctr>;
fn factory(&self) -> Self::Fctr {
BFactory {
key_factory: self.key.factory(),
}
}
fn points_typed(&self, points: &mut impl TakesPoints<'a, Ctx>) {
self.cl.points_typed(points);
self.cr.points_typed(points);
self.key.points_typed(points);
}
}
impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> Mentionable<'a, Ctx> for RNode<'a, Ctx, A> {
type Fctr = RFactory<A::Fctr>;
fn factory(&self) -> Self::Fctr {
RFactory {
key_factory: self.key.factory(),
}
}
fn points_typed(&self, points: &mut impl TakesPoints<'a, Ctx>) {
self.cl.points_typed(points);
self.cr.points_typed(points);
self.key.points_typed(points);
}
}
impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for RBFactory<F> {
type Mtbl = RBNode<'a, Ctx, F::Mtbl>;
type ParseError = TreeParseError<F::ParseError>;
fn deserialize(
&self,
deserializer: &mut dyn Deserializer,
resolver: std::rc::Rc<dyn Resolver<'a, Ctx>>,
addresses: &mut Addresses,
) -> ParseResult<'a, Ctx, Self> {
let rb = RB::a_deserialize(deserializer)?;
Ok(match rb {
R => RBNode::R(
RFactory {
key_factory: self.key_factory.clone(),
}
.deserialize(deserializer, resolver, addresses)?,
),
B => RBNode::B(
BFactory {
key_factory: self.key_factory.clone(),
}
.deserialize(deserializer, resolver, addresses)?,
),
})
}
fn unexpected_tail(&self, tail: &[u8]) -> Self::ParseError {
TreeParseError::Key(self.key_factory.unexpected_tail(tail))
}
}
impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for BFactory<F> {
type Mtbl = BNode<'a, Ctx, F::Mtbl>;
type ParseError = TreeParseError<F::ParseError>;
fn deserialize(
&self,
deserializer: &mut dyn Deserializer,
resolver: std::rc::Rc<dyn Resolver<'a, Ctx>>,
addresses: &mut Addresses,
) -> ParseResult<'a, Ctx, Self> {
let nullable_factory = NullableFactory::new(RBFactory {
key_factory: self.key_factory.clone(),
});
let cl = nullable_factory.deserialize(deserializer, resolver.clone(), addresses)?;
let cr = nullable_factory.deserialize(deserializer, resolver.clone(), addresses)?;
let key = self
.key_factory
.deserialize(deserializer, resolver, addresses)
.map_err(TreeParseError::Key)?
.into();
Ok(BNode { cl, cr, key })
}
fn unexpected_tail(&self, tail: &[u8]) -> Self::ParseError {
TreeParseError::Key(self.key_factory.unexpected_tail(tail))
}
}
impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for RFactory<F> {
type Mtbl = RNode<'a, Ctx, F::Mtbl>;
type ParseError = TreeParseError<F::ParseError>;
fn deserialize(
&self,
deserializer: &mut dyn Deserializer,
resolver: std::rc::Rc<dyn Resolver<'a, Ctx>>,
addresses: &mut Addresses,
) -> ParseResult<'a, Ctx, Self> {
let nullable_factory = NullableFactory::new(BFactory {
key_factory: self.key_factory.clone(),
});
let cl = nullable_factory.deserialize(deserializer, resolver.clone(), addresses)?;
let cr = nullable_factory.deserialize(deserializer, resolver.clone(), addresses)?;
let key = self
.key_factory
.deserialize(deserializer, resolver, addresses)
.map_err(TreeParseError::Key)?
.into();
Ok(RNode { cl, cr, key })
}
fn unexpected_tail(&self, tail: &[u8]) -> Self::ParseError {
TreeParseError::Key(self.key_factory.unexpected_tail(tail))
}
}