is_tree/
tree_iterator.rs

1//! Tree iterator.
2
3use crate::traits::has_branches::{HasBranches, HasBranchesAPI};
4pub use crate::unsafe_::*;
5
6/// An iterator over a tree.
7pub struct TreeIterator<Visitor> {
8    stack: Vec<Visitor>,
9}
10
11impl<'a, Visitor> TreeIterator<Visitor>
12{
13    /// Creates a new tree iterator.
14    pub fn new<Value>(root: Value) -> Self
15    where Value: Into<Visitor>,
16          Visitor: UnsafeBorrow<'a> + UnsafeClone + 'a,
17          Visitor::Borrow: HasBranches<Visitor>,
18    {
19        let stack = Vec::new();
20        let mut iterator = Self { stack };
21        iterator.build(root.into());
22        iterator
23    }
24
25    fn build(&mut self, visitor: Visitor)
26    where Visitor: UnsafeBorrow<'a> + UnsafeClone + 'a,
27          Visitor::Borrow: HasBranches<Visitor>,
28    {
29        unsafe { self.stack.push(visitor.unsafe_clone()); }
30        for child in unsafe { longer_ref(&visitor).borrow() }.branches_impl2::<Visitor>() {
31            let visitor = child.into();
32            self.build(visitor);
33        }
34    }
35}
36
37impl<Visitor> Iterator for TreeIterator<Visitor> {
38    type Item = Visitor;
39
40    fn next(&mut self) -> Option<Self::Item> {
41        self.stack.pop()
42    }
43}