use core::borrow::Borrow; use core::cmp::Ordering; use super::node::{Handle, NodeRef, marker, ForceResult::*}; 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) }