1use super::*;
2
3impl<'a, T: Aabb> Tree<'a, T> {
4 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_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}