// Copyright 2015 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. use core::cmp::Ordering; use borrow::Borrow; use super::node::{Handle, NodeRef, marker}; use super::node::ForceResult::*; use self::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) }