grid_tree/
shape.rs

1use crate::{ChildIndex, VectorKey};
2
3/// The shape of a single node's children. E.g. 2<sup>2</sup> for a quadtree and 2<sup>3</sup> for an octree.
4pub trait BranchShape<V>
5where
6    V: VectorKey,
7{
8    /// The number of bits to shift each dimension in order to translate coordinates between adjacent [`Level`](crate::Level)s.
9    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}