summaryrefslogtreecommitdiff
path: root/src/quad.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/quad.rs')
-rw-r--r--src/quad.rs46
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!()
+ }
+}