[go: up one dir, main page]

rose_tree 0.3.0

An indexable tree data structure with a variable and unbounded number of branches per node. It is Implemented on top of petgraph's Graph data structure and attempts to follow similar conventions where suitable.
Documentation
extern crate rose_tree;

use rose_tree::RoseTree;

struct Weight;

#[test]
fn children() {
    let (mut tree, root) = RoseTree::<Weight, u32>::new(Weight);
    let a = tree.add_child(root, Weight);
    let b = tree.add_child(root, Weight);
    let c = tree.add_child(root, Weight);

    {
        let mut children = tree.children(root);
        assert_eq!(Some(c), children.next());
        assert_eq!(Some(b), children.next());
        assert_eq!(Some(a), children.next());
        assert_eq!(None, children.next());
    }

    {
        let d = tree.add_child(b, Weight);
        let e = tree.add_child(b, Weight);
        let f = tree.add_child(b, Weight);
        let mut children = tree.children(b);
        assert_eq!(Some(f), children.next());
        assert_eq!(Some(e), children.next());
        assert_eq!(Some(d), children.next());
        assert_eq!(None, children.next());
    }
}

#[test]
fn parent_recursion() {
    let (mut tree, root) = RoseTree::<Weight, u32>::new(Weight);
    let a = tree.add_child(root, Weight);
    let a_1 = tree.add_child(root, Weight);
    let a_2 = tree.add_child(root, Weight);
    let b = tree.add_child(a, Weight);
    let c = tree.add_child(b, Weight);

    {
        let mut parent_recursion = tree.parent_recursion(c);
        assert_eq!(Some(b), parent_recursion.next());
        assert_eq!(Some(a), parent_recursion.next());
        assert_eq!(Some(root), parent_recursion.next());
        assert_eq!(None, parent_recursion.next());
    }

    let b_1 = tree.add_child(a_1, Weight);
    let c_1 = tree.add_child(b_1, Weight);
    let d_1 = tree.add_child(c_1, Weight);

    {
        let mut parent_recursion = tree.parent_recursion(d_1);
        assert_eq!(Some(c_1), parent_recursion.next());
        assert_eq!(Some(b_1), parent_recursion.next());
        assert_eq!(Some(a_1), parent_recursion.next());
        assert_eq!(Some(root), parent_recursion.next());
        assert_eq!(None, parent_recursion.next());
    }

    let b_2 = tree.add_child(a_2, Weight);
    let c_2 = tree.add_child(b_2, Weight);

    {
        let mut parent_recursion = tree.parent_recursion(c_2);
        assert_eq!(Some(b_2), parent_recursion.next());
        assert_eq!(Some(a_2), parent_recursion.next());
        assert_eq!(Some(root), parent_recursion.next());
        assert_eq!(None, parent_recursion.next());
    }
}

#[test]
fn siblings() {
    let (mut tree, root) = RoseTree::<Weight, u32>::new(Weight);
    let a = tree.add_child(root, Weight);
    let b = tree.add_child(root, Weight);
    let c = tree.add_child(root, Weight);
    let d = tree.add_child(root, Weight);

    {
        let mut siblings = tree.siblings(a);
        assert_eq!(Some(d), siblings.next());
        assert_eq!(Some(c), siblings.next());
        assert_eq!(Some(b), siblings.next());
        assert_eq!(None, siblings.next());
    }
}