From 2c547afe24adaa193bdcd2fcc498d70c59ac8a04 Mon Sep 17 00:00:00 2001 From: Andrew Morris Date: Thu, 17 Aug 2023 13:58:28 +1000 Subject: [PATCH] Add (incomplete) pop method --- radix_tree/src/lib.rs | 17 +++++++++++++++++ radix_tree/src/radix_tree.rs | 22 ++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/radix_tree/src/lib.rs b/radix_tree/src/lib.rs index f5b07b8..8cfab9f 100644 --- a/radix_tree/src/lib.rs +++ b/radix_tree/src/lib.rs @@ -87,4 +87,21 @@ mod tests { assert_eq!(*v, i); } } + + #[test] + #[should_panic] // TODO: fix + fn pop_100() { + let mut tree = RadixTree::::new(); + + for i in 0..100 { + tree.push(i); + } + + for i in (0..100).rev() { + assert_eq!(tree.pop(), Some(i)); + assert_eq!(tree.len(), i); + } + + assert_eq!(tree.pop(), None); + } } diff --git a/radix_tree/src/radix_tree.rs b/radix_tree/src/radix_tree.rs index fdf8280..31f36dd 100644 --- a/radix_tree/src/radix_tree.rs +++ b/radix_tree/src/radix_tree.rs @@ -155,6 +155,28 @@ impl RadixTree { meta_node_with_space.push(RadixTree(Rc::new(RadixTreeData::Leaves(new_leaves)))); } + pub fn pop(&mut self) -> Option { + let mut tree = self; + + loop { + match tree.data_mut() { + RadixTreeData::Meta(meta) => { + let last = meta.len() - 1; + tree = &mut meta[last]; + } + RadixTreeData::Leaves(leaves) => { + let res = leaves.pop(); + + if leaves.is_empty() { + todo!(); // Shrink tree + } + + return res; + } + } + } + } + pub fn first(&self) -> Option<&T> { let mut tree = self;