use core::borrow::Borrow; use core::cmp::Ordering; use super::node::{marker, ForceResult::*, Handle, NodeRef}; use SearchResult::*; pub enum SearchResult { Found(Handle, marker::KV>), GoDown(Handle, marker::Edge>), } pub fn search_tree( mut node: NodeRef, key: &Q, ) -> SearchResult where Q: Ord, K: Borrow, { loop { match search_node(node, key) { Found(handle) => return Found(handle), GoDown(handle) => match handle.force() { Leaf(leaf) => return GoDown(leaf), Internal(internal) => { node = internal.descend(); continue; } }, } } } pub fn search_node( node: NodeRef, key: &Q, ) -> SearchResult where Q: Ord, K: Borrow, { match search_linear(&node, key) { (idx, true) => Found(Handle::new_kv(node, idx)), (idx, false) => SearchResult::GoDown(Handle::new_edge(node, idx)), } } pub fn search_linear( node: &NodeRef, key: &Q, ) -> (usize, bool) where Q: Ord, K: Borrow, { for (i, k) in node.keys().iter().enumerate() { match key.cmp(k.borrow()) { Ordering::Greater => {} Ordering::Equal => return (i, true), Ordering::Less => return (i, false), } } (node.keys().len(), false) }