diff options
Diffstat (limited to 'src/quad.rs')
-rw-r--r-- | src/quad.rs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/quad.rs b/src/quad.rs new file mode 100644 index 0000000..f6eaab3 --- /dev/null +++ b/src/quad.rs @@ -0,0 +1,46 @@ +/// Represents the data present in a quad-tree node. +/// May be the base-level repr, or a node with 4 children. +pub enum Quad<A: Default, B> { + /// Base cell in grid. + /// May actually be a chunk of cells for performance. + Base(A), + /// Node with 4 children. + Node(Box<[Node<A, B>;4]>), + /// Children may be generated from Node. + Cached, +} + +/// Represends a node in a quadtree. +/// Has a depth denoting the number of nodes below it. +/// Nodes should only be siblings of nodes with the same depth. +/// Data stored inside a quadtree node, including children, are in `data`. +pub struct Node<A: Default, B> { + depth: usize, + compr: B, + data: Quad<A, B>, +} + +/// Represents a context with shared state. +pub struct Ctx(); + +impl<A: Default, B> Node<A, B> { + /// Creates a new tree from a single base node + pub fn new_base(base: A, ctx: &mut Ctx) -> Self { + Node { + depth: 0, + compr: ctx.compress(&base), + data: Quad::Base(base), + } + } + + /// Creates a new tree with a single empty base node + pub fn new_empty(ctx: &mut Ctx) -> Self { + Self::new_base(Default::default(), ctx) + } + + /// Creates a new node double the size by centering the current node + /// on a node double the size. + pub fn pad_empty(self, ctx: &mut Ctx) -> Self { + todo!() + } +} |