tidy_tree/
iter.rs

1use crate::Node;
2
3pub struct Iter<'a> {
4    nodes: Vec<&'a Node>,
5}
6
7impl<'a> Iterator for Iter<'a> {
8    type Item = &'a Node;
9
10    fn next(&mut self) -> Option<Self::Item> {
11        self.nodes.pop()
12    }
13}
14
15fn recursive_iter<'a>(node: &'a Node, nodes: &mut Vec<&'a Node>) {
16    nodes.push(node);
17    for child in node.children.iter() {
18        recursive_iter(child, nodes);
19    }
20}
21
22impl Node {
23    #[inline]
24    pub fn iter(&self) -> Iter {
25        let mut nodes = Vec::new();
26        recursive_iter(self, &mut nodes);
27        nodes.reverse();
28        Iter { nodes }
29    }
30}
31
32#[cfg(test)]
33mod iter_test {
34    use super::*;
35
36    #[test]
37    fn test_node_iter() {
38        let mut root = Node::new_with_child(0, 1., 1., Node::new(1, 2., 2.));
39        assert_eq!(root.iter().count(), 2);
40        root.append_child(Node::new(2, 3., 3.));
41        assert_eq!(root.iter().count(), 3);
42        root.append_child(Node::new(3, 3., 3.));
43        assert_eq!(root.iter().count(), 4);
44        root.children[2].append_child(Node::new(4, 3., 3.));
45        assert_eq!(root.iter().count(), 5);
46
47        for (i, node) in root.iter().enumerate() {
48            assert_eq!(i, node.id);
49        }
50    }
51}