BinaryTreesHeight::height_r
				
					
				
			This commit is contained in:
		
							parent
							
								
									53cd98aa86
								
							
						
					
					
						commit
						d9c21f639d
					
				@ -133,7 +133,7 @@ pub trait BinaryTreesMutable<'a>: BinaryTreesEmpty<'a> + BinaryTreesTreeOf<'a> {
 | 
			
		||||
 | 
			
		||||
pub trait BinaryTreesHeight<'a>: BinaryTrees<'a> {
 | 
			
		||||
    fn height(&self, tree: &Self::Tree) -> u64;
 | 
			
		||||
 | 
			
		||||
    fn height_r(&self, reference: &Self::Reference) -> u64;
 | 
			
		||||
    fn leaf_height_error<T: 'a>(&self, height: u64) -> BTWrap<'a, Self, T>;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -155,6 +155,10 @@ impl<'a, BT: BinaryTreesBindable<'a> + BinaryTreesHeight<'a>> BinaryTreesHeight<
 | 
			
		||||
        self.0.height(&tree.bound)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn height_r(&self, reference: &Self::Reference) -> u64 {
 | 
			
		||||
        self.0.height_r(&reference.bound)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn leaf_height_error<T: 'a>(&self, height: u64) -> BTWrap<'a, Self, T> {
 | 
			
		||||
        self.0.leaf_height_error(height)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -29,12 +29,14 @@ impl<A> AvlN<A> {
 | 
			
		||||
 | 
			
		||||
struct AvlR<A> {
 | 
			
		||||
    node: Rc<AvlN<A>>,
 | 
			
		||||
    height: u64,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<A> Clone for AvlR<A> {
 | 
			
		||||
    fn clone(&self) -> Self {
 | 
			
		||||
        Self {
 | 
			
		||||
            node: self.node.clone(),
 | 
			
		||||
            height: self.height,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -45,15 +47,8 @@ impl<A: Display> Display for AvlR<A> {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
impl<A> AvlR<A> {
 | 
			
		||||
    fn balanced(&self) -> bool {
 | 
			
		||||
        self.node.balanced()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct AvlT<A> {
 | 
			
		||||
    reference: Option<AvlR<A>>,
 | 
			
		||||
    reference: Option<Rc<AvlN<A>>>,
 | 
			
		||||
    height: u64,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -135,7 +130,10 @@ impl<'a, A: 'a + PartialOrd + Clone> BinaryTrees<'a> for AvlTs<A> {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn refer(&self, tree: &Self::Tree) -> Option<Self::Reference> {
 | 
			
		||||
        tree.reference.clone()
 | 
			
		||||
        Some(AvlR {
 | 
			
		||||
            node: tree.reference.clone()?,
 | 
			
		||||
            height: tree.height,
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -145,7 +143,7 @@ impl<'a, A: 'a + PartialOrd + Clone> BinaryTreesTreeOf<'a> for AvlTs<A> {
 | 
			
		||||
            height: std::cmp::max(node.l.height, node.r.height)
 | 
			
		||||
                .checked_add(1)
 | 
			
		||||
                .unwrap(),
 | 
			
		||||
            reference: Some(AvlR { node: node.into() }),
 | 
			
		||||
            reference: Some(node.into()),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -183,6 +181,10 @@ impl<'a, A: 'a + PartialOrd + Clone> BinaryTreesHeight<'a> for AvlTs<A> {
 | 
			
		||||
        tree.height
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn height_r(&self, reference: &Self::Reference) -> u64 {
 | 
			
		||||
        reference.height
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn leaf_height_error<T: 'a>(&self, height: u64) -> BTWrap<'a, Self, T> {
 | 
			
		||||
        panic!("leaf height error: {height}.")
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -4,12 +4,12 @@ use super::*;
 | 
			
		||||
 | 
			
		||||
pub struct AvlReference<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> {
 | 
			
		||||
    node: Point<'a, Ctx, AvlNode<'a, Ctx, A>>,
 | 
			
		||||
    parent_height: u64,
 | 
			
		||||
    height: u64,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> PartialEq for AvlReference<'a, Ctx, A> {
 | 
			
		||||
    fn eq(&self, other: &Self) -> bool {
 | 
			
		||||
        self.node == other.node && self.parent_height == other.parent_height
 | 
			
		||||
        self.node == other.node && self.height == other.height
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -67,7 +67,7 @@ impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> AvlTree<'a, Ctx, A> {
 | 
			
		||||
            Nullable::Null(_) => None,
 | 
			
		||||
            Nullable::NotNull(ref point) => Some(AvlReference {
 | 
			
		||||
                node: point.clone(),
 | 
			
		||||
                parent_height: self.height,
 | 
			
		||||
                height: self.height,
 | 
			
		||||
            }),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@ -75,7 +75,7 @@ impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> AvlTree<'a, Ctx, A> {
 | 
			
		||||
 | 
			
		||||
impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> AvlReference<'a, Ctx, A> {
 | 
			
		||||
    pub fn resolve(&self) -> Resolution<'a, Ctx, AvlNode<'a, Ctx, A>> {
 | 
			
		||||
        let parent_height = self.parent_height;
 | 
			
		||||
        let parent_height = self.height;
 | 
			
		||||
        Ctx::fmap(self.node.resolve(), move |resolved| {
 | 
			
		||||
            let node = resolved?;
 | 
			
		||||
            node.matches_height(parent_height)
 | 
			
		||||
@ -83,6 +83,10 @@ impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> AvlReference<'a, Ctx, A> {
 | 
			
		||||
            Ok(node)
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn height(&self) -> u64 {
 | 
			
		||||
        self.height
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> Clone for AvlTree<'a, Ctx, A> {
 | 
			
		||||
 | 
			
		||||
@ -183,4 +183,8 @@ impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx> + Clone> BoundReference<'a, C
 | 
			
		||||
    pub fn equal(rl: &Self, rr: &Self, comparator: &impl Comparator<A>) -> bool {
 | 
			
		||||
        rl.reference == rr.reference && Bounds::equal(&rl.bounds, &rr.bounds, comparator)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn height(&self) -> u64 {
 | 
			
		||||
        self.reference.height()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -108,6 +108,10 @@ impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx> + Clone, C: 'a + Comparator<A
 | 
			
		||||
        tree.height()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn height_r(&self, reference: &Self::Reference) -> u64 {
 | 
			
		||||
        reference.height()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn leaf_height_error<T: 'a>(&self, height: u64) -> BTWrap<'a, Self, T> {
 | 
			
		||||
        <FallibleMonad<'a, Ctx, _> as Fail<_>>::fail(ResolutionError::Parse(BoundError::Avl(
 | 
			
		||||
            AvlError::LeafHeight(height),
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user