broccoli_tree/
assert.rs

1use super::*;
2
3impl<'a, T: Aabb> Tree<'a, T> {
4    ///panics if a broken broccoli tree invariant is detected.
5    ///For debugging purposes only.
6    pub fn assert_tree_invariants(&self)
7    where
8        T::Num: core::fmt::Debug,
9    {
10        fn inner<A: Axis, T: Aabb>(axis: A, iter: compt::LevelIter<Vistr<Node<T>>>)
11        where
12            T::Num: core::fmt::Debug,
13        {
14            fn a_bot_has_value<N: Num>(it: impl Iterator<Item = N>, val: N) -> bool {
15                for b in it {
16                    if b == val {
17                        return true;
18                    }
19                }
20                false
21            }
22
23            let ((_depth, nn), rest) = iter.next();
24            let axis_next = axis.next();
25
26            assert!(crate::util::is_sorted_by(&nn.range, |a, b| a
27                .get()
28                .get_range(axis_next)
29                .start
30                .partial_cmp(&b.get().get_range(axis_next).start)));
31
32            if let Some([start, end]) = rest {
33                match nn.div {
34                    Some(div) => {
35                        if nn.range.is_empty() {
36                            assert_eq!(nn.cont.start, nn.cont.end);
37                            let v: T::Num = Default::default();
38                            assert_eq!(nn.cont.start, v);
39                        } else {
40                            let cont = &nn.cont;
41                            for bot in nn.range.iter() {
42                                assert!(bot.get().get_range(axis).contains(div));
43                            }
44
45                            assert!(a_bot_has_value(
46                                nn.range.iter().map(|b| b.get().get_range(axis).start),
47                                div
48                            ));
49
50                            for bot in nn.range.iter() {
51                                assert!(cont.contains_range(bot.get().get_range(axis)));
52                            }
53
54                            assert!(a_bot_has_value(
55                                nn.range.iter().map(|b| b.get().get_range(axis).start),
56                                cont.start
57                            ));
58                            assert!(a_bot_has_value(
59                                nn.range.iter().map(|b| b.get().get_range(axis).end),
60                                cont.end
61                            ));
62                        }
63
64                        inner(axis_next, start);
65                        inner(axis_next, end);
66                    }
67                    None => {
68                        for (_depth, n) in start.dfs_preorder_iter().chain(end.dfs_preorder_iter())
69                        {
70                            assert!(n.range.is_empty());
71                            //assert!(n.cont.is_none());
72                            assert_eq!(n.cont.start, nn.cont.end);
73                            let v: T::Num = Default::default();
74                            assert_eq!(n.cont.start, v);
75
76                            assert!(n.div.is_none());
77                        }
78                    }
79                }
80            }
81        }
82
83        inner(default_axis(), self.vistr().with_depth(compt::Depth(0)))
84    }
85}