mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-23 15:23:46 +00:00
Rewrite BTreeMap to use parent pointers.
This commit is contained in:
parent
05aeeb314d
commit
cd639d8927
File diff suppressed because it is too large
Load Diff
@ -9,6 +9,7 @@
|
|||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
mod node;
|
mod node;
|
||||||
|
mod search;
|
||||||
pub mod map;
|
pub mod map;
|
||||||
pub mod set;
|
pub mod set;
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
76
src/libcollections/btree/search.rs
Normal file
76
src/libcollections/btree/search.rs
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
// 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 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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<BorrowType, K, V, FoundType, GoDownType> {
|
||||||
|
Found(Handle<NodeRef<BorrowType, K, V, FoundType>, marker::KV>),
|
||||||
|
GoDown(Handle<NodeRef<BorrowType, K, V, GoDownType>, marker::Edge>)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn search_tree<BorrowType, K, V, Q: ?Sized>(
|
||||||
|
mut node: NodeRef<BorrowType, K, V, marker::LeafOrInternal>,
|
||||||
|
key: &Q
|
||||||
|
) -> SearchResult<BorrowType, K, V, marker::LeafOrInternal, marker::Leaf>
|
||||||
|
where Q: Ord, K: Borrow<Q> {
|
||||||
|
|
||||||
|
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<BorrowType, K, V, Type, Q: ?Sized>(
|
||||||
|
node: NodeRef<BorrowType, K, V, Type>,
|
||||||
|
key: &Q
|
||||||
|
) -> SearchResult<BorrowType, K, V, Type, Type>
|
||||||
|
where Q: Ord, K: Borrow<Q> {
|
||||||
|
|
||||||
|
match search_linear(&node, key) {
|
||||||
|
(idx, true) => Found(
|
||||||
|
Handle::new_kv(node, idx)
|
||||||
|
),
|
||||||
|
(idx, false) => SearchResult::GoDown(
|
||||||
|
Handle::new_edge(node, idx)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn search_linear<BorrowType, K, V, Type, Q: ?Sized>(
|
||||||
|
node: &NodeRef<BorrowType, K, V, Type>,
|
||||||
|
key: &Q
|
||||||
|
) -> (usize, bool)
|
||||||
|
where Q: Ord, K: Borrow<Q> {
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
|
@ -43,8 +43,8 @@
|
|||||||
#![feature(iter_arith)]
|
#![feature(iter_arith)]
|
||||||
#![feature(iter_arith)]
|
#![feature(iter_arith)]
|
||||||
#![feature(lang_items)]
|
#![feature(lang_items)]
|
||||||
|
#![feature(nonzero)]
|
||||||
#![feature(num_bits_bytes)]
|
#![feature(num_bits_bytes)]
|
||||||
#![feature(oom)]
|
|
||||||
#![feature(pattern)]
|
#![feature(pattern)]
|
||||||
#![feature(shared)]
|
#![feature(shared)]
|
||||||
#![feature(slice_bytes)]
|
#![feature(slice_bytes)]
|
||||||
@ -55,7 +55,7 @@
|
|||||||
#![feature(unboxed_closures)]
|
#![feature(unboxed_closures)]
|
||||||
#![feature(unicode)]
|
#![feature(unicode)]
|
||||||
#![feature(unique)]
|
#![feature(unique)]
|
||||||
#![feature(unsafe_no_drop_flag, filling_drop)]
|
#![feature(unsafe_no_drop_flag)]
|
||||||
#![cfg_attr(test, feature(clone_from_slice, rand, test))]
|
#![cfg_attr(test, feature(clone_from_slice, rand, test))]
|
||||||
|
|
||||||
#![no_std]
|
#![no_std]
|
||||||
|
Loading…
Reference in New Issue
Block a user