Add first, last

This commit is contained in:
Andrew Morris
2023-08-17 10:56:53 +10:00
parent 29b2ae11e6
commit 1c321ee7be

View File

@@ -20,8 +20,16 @@ impl<T: Clone, const N: usize> RadixTree<T, N> {
RadixTree::<T, N>(Rc::new(RadixTreeData::<T, N>::Meta(ArrayVec::new())))
}
fn data(&self) -> &RadixTreeData<T, N> {
&self.0
}
fn data_mut(&mut self) -> &mut RadixTreeData<T, N> {
Rc::make_mut(&mut self.0)
}
pub fn is_empty(&self) -> bool {
match &*self.0 {
match self.data() {
RadixTreeData::Meta(_) => false,
RadixTreeData::Leaves(leaves) => leaves.is_empty(),
}
@@ -32,7 +40,7 @@ impl<T: Clone, const N: usize> RadixTree<T, N> {
let mut tree = self;
loop {
match &*tree.0 {
match tree.data() {
RadixTreeData::Meta(meta) => {
let i = meta.len() - 1;
res += i;
@@ -75,7 +83,7 @@ impl<T: Clone, const N: usize> RadixTree<T, N> {
let mut depth = 1;
loop {
match &*tree.0 {
match tree.data() {
RadixTreeData::Meta(meta) => {
if !meta.is_full() {
max_depth_with_space = depth;
@@ -97,7 +105,7 @@ impl<T: Clone, const N: usize> RadixTree<T, N> {
let mut swap_node = Self::new_meta();
swap(&mut swap_node, self);
let self_meta = match Rc::make_mut(&mut self.0) {
let self_meta = match self.data_mut() {
RadixTreeData::Meta(meta) => meta,
RadixTreeData::Leaves(_) => {
panic!("Should not happen because we just swapped meta into self")
@@ -143,6 +151,60 @@ impl<T: Clone, const N: usize> RadixTree<T, N> {
new_leaves.push(value);
meta_node_with_space.push(RadixTree(Rc::new(RadixTreeData::Leaves(new_leaves))));
}
pub fn first(&self) -> Option<&T> {
let mut tree = self;
loop {
match tree.data() {
RadixTreeData::Meta(meta) => {
tree = &meta[0];
}
RadixTreeData::Leaves(leaves) => break leaves.first(),
}
}
}
pub fn first_mut(&mut self) -> Option<&mut T> {
let mut tree = self;
loop {
match tree.data_mut() {
RadixTreeData::Meta(meta) => {
tree = &mut meta[0];
}
RadixTreeData::Leaves(leaves) => break leaves.first_mut(),
}
}
}
pub fn last(&self) -> Option<&T> {
let mut tree = self;
loop {
match tree.data() {
RadixTreeData::Meta(meta) => {
let last = meta.len() - 1;
tree = &meta[last];
}
RadixTreeData::Leaves(leaves) => break leaves.last(),
}
}
}
pub fn last_mut(&mut self) -> Option<&mut T> {
let mut tree = self;
loop {
match tree.data_mut() {
RadixTreeData::Meta(meta) => {
let last = meta.len() - 1;
tree = &mut meta[last];
}
RadixTreeData::Leaves(leaves) => break leaves.last_mut(),
}
}
}
}
impl<T: Clone, const N: usize> Default for RadixTree<T, N> {