#[cfg(not(feature = "std"))]
use alloc::vec::Vec;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::bounding_box::BoundingBox;
pub const NULL: usize = usize::MAX;
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Node {
Leaf {
point_idx: usize,
mass: usize,
},
Internal {
left: usize,
right: usize,
cut_dim: usize,
cut_val: f32,
mass: usize,
bbox: BoundingBox,
},
}
impl Node {
pub fn mass(&self) -> usize {
match self {
Node::Leaf { mass, .. } => *mass,
Node::Internal { mass, .. } => *mass,
}
}
pub fn is_leaf(&self) -> bool {
matches!(self, Node::Leaf { .. })
}
}
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct NodeArena {
nodes: Vec<Option<Node>>,
free: Vec<usize>,
}
impl NodeArena {
pub fn new(initial_capacity: usize) -> Self {
NodeArena {
nodes: Vec::with_capacity(initial_capacity),
free: Vec::new(),
}
}
pub fn alloc(&mut self, node: Node) -> usize {
if let Some(id) = self.free.pop() {
self.nodes[id] = Some(node);
id
} else {
let id = self.nodes.len();
self.nodes.push(Some(node));
id
}
}
pub fn get(&self, id: usize) -> &Node {
self.nodes[id]
.as_ref()
.expect("accessed freed or uninitialized node")
}
pub fn get_mut(&mut self, id: usize) -> &mut Node {
self.nodes[id]
.as_mut()
.expect("accessed freed or uninitialized node")
}
pub fn free(&mut self, id: usize) {
debug_assert!(id < self.nodes.len());
self.nodes[id] = None;
self.free.push(id);
}
pub fn slot_count(&self) -> usize {
self.nodes.len()
}
}