BTreeMap: admit the existence of leaf edges in comments
This commit is contained in:
parent
fc42fb8e70
commit
df76cf89ad
|
@ -9,11 +9,8 @@
|
||||||
// struct Node<K, V, height: usize> {
|
// struct Node<K, V, height: usize> {
|
||||||
// keys: [K; 2 * B - 1],
|
// keys: [K; 2 * B - 1],
|
||||||
// vals: [V; 2 * B - 1],
|
// vals: [V; 2 * B - 1],
|
||||||
// edges: if height > 0 {
|
// edges: [if height > 0 { Box<Node<K, V, height - 1>> } else { () }; 2 * B],
|
||||||
// [Box<Node<K, V, height - 1>>; 2 * B]
|
// parent: Option<(NonNull<Node<K, V, height + 1>>, u16)>,
|
||||||
// } else { () },
|
|
||||||
// parent: Option<NonNull<Node<K, V, height + 1>>>,
|
|
||||||
// parent_idx: u16,
|
|
||||||
// len: u16,
|
// len: u16,
|
||||||
// }
|
// }
|
||||||
// ```
|
// ```
|
||||||
|
@ -28,8 +25,8 @@
|
||||||
//
|
//
|
||||||
// - Trees must have uniform depth/height. This means that every path down to a leaf from a
|
// - Trees must have uniform depth/height. This means that every path down to a leaf from a
|
||||||
// given node has exactly the same length.
|
// given node has exactly the same length.
|
||||||
// - A node of length `n` has `n` keys, `n` values, and (in an internal node) `n + 1` edges.
|
// - A node of length `n` has `n` keys, `n` values, and `n + 1` edges.
|
||||||
// This implies that even an empty internal node has at least one edge.
|
// This implies that even an empty node has at least one edge.
|
||||||
|
|
||||||
use core::cmp::Ordering;
|
use core::cmp::Ordering;
|
||||||
use core::marker::PhantomData;
|
use core::marker::PhantomData;
|
||||||
|
@ -298,9 +295,8 @@ impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<BorrowType, K, V, Type> NodeRef<BorrowType, K, V, Type> {
|
impl<BorrowType, K, V, Type> NodeRef<BorrowType, K, V, Type> {
|
||||||
/// Finds the length of the node. This is the number of keys or values. In an
|
/// Finds the length of the node. This is the number of keys or values.
|
||||||
/// internal node, the number of edges is `len() + 1`.
|
/// The number of edges is `len() + 1`.
|
||||||
/// For any node, the number of possible edge handles is also `len() + 1`.
|
|
||||||
/// Note that, despite being safe, calling this function can have the side effect
|
/// Note that, despite being safe, calling this function can have the side effect
|
||||||
/// of invalidating mutable references that unsafe code has created.
|
/// of invalidating mutable references that unsafe code has created.
|
||||||
pub fn len(&self) -> usize {
|
pub fn len(&self) -> usize {
|
||||||
|
@ -321,9 +317,6 @@ impl<BorrowType, K, V, Type> NodeRef<BorrowType, K, V, Type> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Exposes the leaf portion of any leaf or internal node.
|
/// Exposes the leaf portion of any leaf or internal node.
|
||||||
/// If the node is a leaf, this function simply opens up its data.
|
|
||||||
/// If the node is an internal node, so not a leaf, it does have all the data a leaf has
|
|
||||||
/// (header, keys and values), and this function exposes that.
|
|
||||||
///
|
///
|
||||||
/// Returns a raw ptr to avoid invalidating other references to this node,
|
/// Returns a raw ptr to avoid invalidating other references to this node,
|
||||||
/// which is possible when BorrowType is marker::ValMut.
|
/// which is possible when BorrowType is marker::ValMut.
|
||||||
|
@ -471,9 +464,6 @@ impl<'a, K, V, Type> NodeRef<marker::Mut<'a>, K, V, Type> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Exposes the leaf portion of any leaf or internal node for writing.
|
/// Exposes the leaf portion of any leaf or internal node for writing.
|
||||||
/// If the node is a leaf, this function simply opens up its data.
|
|
||||||
/// If the node is an internal node, so not a leaf, it does have all the data a leaf has
|
|
||||||
/// (header, keys and values), and this function exposes that.
|
|
||||||
///
|
///
|
||||||
/// We don't need to return a raw ptr because we have unique access to the entire node.
|
/// We don't need to return a raw ptr because we have unique access to the entire node.
|
||||||
fn as_leaf_mut(&mut self) -> &'a mut LeafNode<K, V> {
|
fn as_leaf_mut(&mut self) -> &'a mut LeafNode<K, V> {
|
||||||
|
@ -679,9 +669,9 @@ impl<'a, K: 'a, V: 'a> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, K: 'a, V: 'a> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
|
impl<'a, K: 'a, V: 'a> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
|
||||||
/// Removes a key/value pair from the end of this node and returns the pair.
|
/// Removes a key/value pair from the end of the node and returns the pair.
|
||||||
/// If this is an internal node, also removes the edge that was to the right
|
/// Also removes the edge that was to the right of that pair and, if the node
|
||||||
/// of that pair and returns the orphaned node that this edge owned.
|
/// is internal, returns the orphaned subtree that this edge owned.
|
||||||
fn pop(&mut self) -> (K, V, Option<Root<K, V>>) {
|
fn pop(&mut self) -> (K, V, Option<Root<K, V>>) {
|
||||||
debug_assert!(self.len() > 0);
|
debug_assert!(self.len() > 0);
|
||||||
|
|
||||||
|
@ -705,9 +695,9 @@ impl<'a, K: 'a, V: 'a> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Removes a key/value pair from the beginning of this node and returns the pair.
|
/// Removes a key/value pair from the beginning of the node and returns the pair.
|
||||||
/// If this is an internal node, also removes the edge that was to the left
|
/// Also removes the edge that was to the left of that pair and, if the node is
|
||||||
/// of that pair and returns the orphaned node that this edge owned.
|
/// internal, returns the orphaned subtree that this edge owned.
|
||||||
fn pop_front(&mut self) -> (K, V, Option<Root<K, V>>) {
|
fn pop_front(&mut self) -> (K, V, Option<Root<K, V>>) {
|
||||||
debug_assert!(self.len() > 0);
|
debug_assert!(self.len() > 0);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue