From 3e3b096174f8b1b2c3dc163eb6402f9c2c666c74 Mon Sep 17 00:00:00 2001 From: janis Date: Tue, 16 Sep 2025 19:22:08 +0200 Subject: [PATCH] refactor HandleOrTree to generic TreeOr type --- src/tree.rs | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/tree.rs b/src/tree.rs index d65a443..fd55a28 100644 --- a/src/tree.rs +++ b/src/tree.rs @@ -725,7 +725,7 @@ impl<'a, K: 'a, V: 'a> Handle, K, V>, marker::Edge> { // search: mod search { - use super::{marker, ForceResult, Handle, NodeRef}; + use super::{ForceResult, Handle, NodeRef, marker}; use core::borrow::Borrow; use core::cmp::Ordering; @@ -864,6 +864,14 @@ mod search { } } +enum TreeOr<'a, K, V, T> { + Tree(borrow::DormantMutRef<'a, Tree>), + Other(T), +} + +type TreeOrHandle<'a, BorrowType, K, V, HandleType> = + TreeOr<'a, K, V, Handle, HandleType>>; + enum HandleOrTree<'a, BorrowType, K, V, HandleType> { Handle(Handle, HandleType>), Tree(borrow::DormantMutRef<'a, Tree>), @@ -872,7 +880,9 @@ enum HandleOrTree<'a, BorrowType, K, V, HandleType> { mod entry { use core::marker::PhantomData; - use super::{marker, Handle, NodeRef}; + use crate::tree::TreeOrHandle; + + use super::{Handle, NodeRef, marker}; pub enum Entry<'a, Q: 'a, K: 'a, V: 'a> where @@ -922,7 +932,7 @@ mod entry { Q: Iterator, { pub(super) key: Q, - pub(super) handle: super::HandleOrTree<'a, marker::Mut<'a>, K, V, marker::Edge>, + pub(super) handle: super::TreeOrHandle<'a, marker::Mut<'a>, K, V, marker::Edge>, pub(super) _marker: PhantomData<&'a mut (K, V)>, } @@ -963,10 +973,9 @@ mod entry { Q: Iterator, { pub fn insert_entry(self, value: V) -> OccupiedEntry<'a, K, V> { - use super::HandleOrTree; let handle = match self.handle { // no root node yet - HandleOrTree::Tree(mut tree) => { + TreeOrHandle::Tree(mut tree) => { // SAFETY: there are no nodes in the tree yet let tree = unsafe { tree.reborrow() }; let root = tree.root.insert(NodeRef::new()); @@ -975,7 +984,7 @@ mod entry { Handle::new_edge(root.borrow_mut(), 0).insert_recursing(self.key, value) } } - HandleOrTree::Handle(handle) => unsafe { handle.insert_recursing(self.key, value) }, + TreeOrHandle::Other(handle) => unsafe { handle.insert_recursing(self.key, value) }, }; OccupiedEntry { @@ -989,11 +998,12 @@ mod entry { mod subtree { use core::marker::PhantomData; - use crate::tree::{search, HandleOrTree}; + use crate::tree::{TreeOrHandle, search}; use super::{ + NodeRef, OnceAndIter, entry::{Entry, OccupiedEntry, VacantEntry}, - marker, NodeRef, OnceAndIter, + marker, }; // BorrowType may be one of `Immut`, `Mut`. @@ -1085,12 +1095,12 @@ mod subtree { }), search::SearchResult::GoDown(handle) => Vacant(VacantEntry { key: key_seq.into(), - handle: HandleOrTree::Handle(handle), + handle: TreeOrHandle::Other(handle), _marker: PhantomData, }), search::SearchResult::Insert(key, handle) => Vacant(VacantEntry { key: OnceAndIter::once(key, key_seq), - handle: HandleOrTree::Handle(handle), + handle: TreeOrHandle::Other(handle), _marker: PhantomData, }), } @@ -1330,7 +1340,7 @@ where } None => Vacant(VacantEntry { key: key_seq.into(), - handle: HandleOrTree::Tree(dormant), + handle: TreeOrHandle::Tree(dormant), _marker: PhantomData, }), };