From 33da2e9f71e0b99ab166ca940d325b3695a70d6e Mon Sep 17 00:00:00 2001 From: Thomas Churchman Date: Wed, 3 Dec 2025 13:24:45 +0100 Subject: [PATCH 1/3] box_tree: make `NodeId` tuple fields private, use named methods to access --- understory_box_tree/src/tree.rs | 13 ++++++++----- understory_box_tree/src/types.rs | 6 +++++- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/understory_box_tree/src/tree.rs b/understory_box_tree/src/tree.rs index 4ec5ae6..42f156b 100644 --- a/understory_box_tree/src/tree.rs +++ b/understory_box_tree/src/tree.rs @@ -518,7 +518,7 @@ impl> Tree { #[inline] fn id_is_newer(a: NodeId, b: NodeId) -> bool { - (a.1 > b.1) || (a.1 == b.1 && a.0 > b.0) + (a.generation() > b.generation()) || (a.generation() == b.generation() && a.idx() > b.idx()) } impl> Tree { @@ -533,7 +533,7 @@ impl> Tree { self.nodes .get(id.idx()) .and_then(|n| n.as_ref()) - .map(|n| n.generation == id.1) + .map(|n| n.generation == id.generation()) .unwrap_or(false) } @@ -681,7 +681,7 @@ impl> Tree { fn node_opt_mut(&mut self, id: NodeId) -> Option<&mut Node> { let n = self.nodes.get_mut(id.idx())?.as_mut()?; - if n.generation != id.1 { + if n.generation != id.generation() { return None; } Some(n) @@ -1055,8 +1055,11 @@ mod tests { assert!(tree.is_alive(b)); assert!(!tree.is_alive(a)); // Sanity: either same slot or different, but if same slot, generation must be greater. - if a.0 == b.0 { - assert!(b.1 > a.1, "generation must increase on reuse"); + if a.idx() == b.idx() { + assert!( + b.generation() > a.generation(), + "generation must increase on reuse" + ); } } diff --git a/understory_box_tree/src/types.rs b/understory_box_tree/src/types.rs index 7ff54f3..a6b6844 100644 --- a/understory_box_tree/src/types.rs +++ b/understory_box_tree/src/types.rs @@ -46,7 +46,7 @@ pub enum ClipBehavior { /// - The generation increments on slot reuse and never decreases. /// - `u32` is ample for practical lifetimes; behavior on generation overflow is unspecified. #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)] -pub struct NodeId(pub(crate) u32, pub(crate) u32); +pub struct NodeId(u32, u32); impl NodeId { pub(crate) const fn new(idx: u32, generation: u32) -> Self { @@ -56,6 +56,10 @@ impl NodeId { pub(crate) const fn idx(self) -> usize { self.0 as usize } + + pub(crate) const fn generation(self) -> u32 { + self.1 + } } bitflags::bitflags! { From bcb76ac6a94012118b9e2d9e29b64bf857161b23 Mon Sep 17 00:00:00 2001 From: Thomas Churchman Date: Wed, 3 Dec 2025 13:31:01 +0100 Subject: [PATCH 2/3] Inline --- understory_box_tree/src/types.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/understory_box_tree/src/types.rs b/understory_box_tree/src/types.rs index a6b6844..470c51f 100644 --- a/understory_box_tree/src/types.rs +++ b/understory_box_tree/src/types.rs @@ -49,14 +49,17 @@ pub enum ClipBehavior { pub struct NodeId(u32, u32); impl NodeId { + #[inline(always)] pub(crate) const fn new(idx: u32, generation: u32) -> Self { Self(idx, generation) } + #[inline(always)] pub(crate) const fn idx(self) -> usize { self.0 as usize } + #[inline(always)] pub(crate) const fn generation(self) -> u32 { self.1 } From abfe7b3bd8e5a641308aad1e4b8c3c02e8b68e43 Mon Sep 17 00:00:00 2001 From: Thomas Churchman Date: Thu, 4 Dec 2025 11:31:46 +0100 Subject: [PATCH 3/3] Named fields --- understory_box_tree/src/types.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/understory_box_tree/src/types.rs b/understory_box_tree/src/types.rs index 470c51f..b1a9728 100644 --- a/understory_box_tree/src/types.rs +++ b/understory_box_tree/src/types.rs @@ -46,22 +46,25 @@ pub enum ClipBehavior { /// - The generation increments on slot reuse and never decreases. /// - `u32` is ample for practical lifetimes; behavior on generation overflow is unspecified. #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)] -pub struct NodeId(u32, u32); +pub struct NodeId { + idx: u32, + generation: u32, +} impl NodeId { #[inline(always)] pub(crate) const fn new(idx: u32, generation: u32) -> Self { - Self(idx, generation) + Self { idx, generation } } #[inline(always)] pub(crate) const fn idx(self) -> usize { - self.0 as usize + self.idx as usize } #[inline(always)] pub(crate) const fn generation(self) -> u32 { - self.1 + self.generation } }