1use crate::{ChildIndex, VectorKey};
2
3pub trait BranchShape<V>
5where
6 V: VectorKey,
7{
8 const SHAPE_SHIFTER: V;
10
11 fn linearize_child(offset: V) -> ChildIndex;
12 fn delinearize_child(i: ChildIndex) -> V;
13
14 #[inline]
15 fn parent_key(key: V) -> V {
16 key >> Self::SHAPE_SHIFTER
17 }
18
19 #[inline]
20 fn ancestor_key(key: V, levels_up: u32) -> V {
21 key >> Self::SHAPE_SHIFTER.mul_u32(levels_up)
22 }
23
24 #[inline]
25 fn min_child_key(key: V) -> V {
26 key << Self::SHAPE_SHIFTER
27 }
28
29 #[inline]
30 fn min_descendant_key(key: V, levels_down: u32) -> V {
31 key << Self::SHAPE_SHIFTER.mul_u32(levels_down)
32 }
33}