Rollup merge of #79354 - ssomers:btree_bereave_BoxedNode, r=Mark-Simulacrum
BTreeMap: cut out the ceremony around BoxedNode The opposite direction of #79093. r? ``@Mark-Simulacrum``
This commit is contained in:
commit
012d5fd8d7
@ -112,20 +112,8 @@ unsafe fn new() -> Self {
|
|||||||
///
|
///
|
||||||
/// However, `BoxedNode` contains no information as to which of the two types
|
/// However, `BoxedNode` contains no information as to which of the two types
|
||||||
/// of nodes it actually contains, and, partially due to this lack of information,
|
/// of nodes it actually contains, and, partially due to this lack of information,
|
||||||
/// has no destructor.
|
/// is not a separate type and has no destructor.
|
||||||
struct BoxedNode<K, V> {
|
type BoxedNode<K, V> = NonNull<LeafNode<K, V>>;
|
||||||
ptr: NonNull<LeafNode<K, V>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<K, V> BoxedNode<K, V> {
|
|
||||||
fn from_owned(ptr: NonNull<LeafNode<K, V>>) -> Self {
|
|
||||||
BoxedNode { ptr }
|
|
||||||
}
|
|
||||||
|
|
||||||
fn as_ptr(&self) -> NonNull<LeafNode<K, V>> {
|
|
||||||
self.ptr
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// An owned tree.
|
/// An owned tree.
|
||||||
///
|
///
|
||||||
@ -168,11 +156,6 @@ pub fn borrow_mut(&mut self) -> NodeRef<marker::Mut<'_>, K, V, Type> {
|
|||||||
pub fn borrow_valmut(&mut self) -> NodeRef<marker::ValMut<'_>, K, V, Type> {
|
pub fn borrow_valmut(&mut self) -> NodeRef<marker::ValMut<'_>, K, V, Type> {
|
||||||
NodeRef { height: self.height, node: self.node, _marker: PhantomData }
|
NodeRef { height: self.height, node: self.node, _marker: PhantomData }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Packs the reference, aware of type and height, into a type-agnostic pointer.
|
|
||||||
fn into_boxed_node(self) -> BoxedNode<K, V> {
|
|
||||||
BoxedNode::from_owned(self.node)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<K, V> NodeRef<marker::Owned, K, V, marker::LeafOrInternal> {
|
impl<K, V> NodeRef<marker::Owned, K, V, marker::LeafOrInternal> {
|
||||||
@ -181,7 +164,7 @@ impl<K, V> NodeRef<marker::Owned, K, V, marker::LeafOrInternal> {
|
|||||||
/// and is the opposite of `pop_internal_level`.
|
/// and is the opposite of `pop_internal_level`.
|
||||||
pub fn push_internal_level(&mut self) -> NodeRef<marker::Mut<'_>, K, V, marker::Internal> {
|
pub fn push_internal_level(&mut self) -> NodeRef<marker::Mut<'_>, K, V, marker::Internal> {
|
||||||
let mut new_node = Box::new(unsafe { InternalNode::new() });
|
let mut new_node = Box::new(unsafe { InternalNode::new() });
|
||||||
new_node.edges[0].write(BoxedNode::from_owned(self.node));
|
new_node.edges[0].write(self.node);
|
||||||
let mut new_root = NodeRef::from_new_internal(new_node, self.height + 1);
|
let mut new_root = NodeRef::from_new_internal(new_node, self.height + 1);
|
||||||
new_root.borrow_mut().first_edge().correct_parent_link();
|
new_root.borrow_mut().first_edge().correct_parent_link();
|
||||||
*self = new_root.forget_type();
|
*self = new_root.forget_type();
|
||||||
@ -288,13 +271,6 @@ unsafe impl<'a, K: Send + 'a, V: Send + 'a, Type> Send for NodeRef<marker::Mut<'
|
|||||||
unsafe impl<'a, K: Send + 'a, V: Send + 'a, Type> Send for NodeRef<marker::ValMut<'a>, K, V, Type> {}
|
unsafe impl<'a, K: Send + 'a, V: Send + 'a, Type> Send for NodeRef<marker::ValMut<'a>, K, V, Type> {}
|
||||||
unsafe impl<K: Send, V: Send, Type> Send for NodeRef<marker::Owned, K, V, Type> {}
|
unsafe impl<K: Send, V: Send, Type> Send for NodeRef<marker::Owned, K, V, Type> {}
|
||||||
|
|
||||||
impl<BorrowType, K, V> NodeRef<BorrowType, K, V, marker::LeafOrInternal> {
|
|
||||||
/// Unpack a node reference that was packed by `Root::into_boxed_node`.
|
|
||||||
fn from_boxed_node(boxed_node: BoxedNode<K, V>, height: usize) -> Self {
|
|
||||||
NodeRef { height, node: boxed_node.as_ptr(), _marker: PhantomData }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<BorrowType, K, V> NodeRef<BorrowType, K, V, marker::Internal> {
|
impl<BorrowType, K, V> NodeRef<BorrowType, K, V, marker::Internal> {
|
||||||
/// Unpack a node reference that was packed as `NodeRef::parent`.
|
/// Unpack a node reference that was packed as `NodeRef::parent`.
|
||||||
fn from_internal(node: NonNull<InternalNode<K, V>>, height: usize) -> Self {
|
fn from_internal(node: NonNull<InternalNode<K, V>>, height: usize) -> Self {
|
||||||
@ -695,7 +671,7 @@ pub fn push(&mut self, key: K, val: V, edge: Root<K, V>) {
|
|||||||
unsafe {
|
unsafe {
|
||||||
self.reborrow_mut().into_key_area_mut_at(idx).write(key);
|
self.reborrow_mut().into_key_area_mut_at(idx).write(key);
|
||||||
self.reborrow_mut().into_val_area_mut_at(idx).write(val);
|
self.reborrow_mut().into_val_area_mut_at(idx).write(val);
|
||||||
self.reborrow_mut().into_edge_area_mut_at(idx + 1).write(edge.into_boxed_node());
|
self.reborrow_mut().into_edge_area_mut_at(idx + 1).write(edge.node);
|
||||||
Handle::new_edge(self.reborrow_mut(), idx + 1).correct_parent_link();
|
Handle::new_edge(self.reborrow_mut(), idx + 1).correct_parent_link();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -710,7 +686,7 @@ fn push_front(&mut self, key: K, val: V, edge: Root<K, V>) {
|
|||||||
*self.reborrow_mut().into_len_mut() += 1;
|
*self.reborrow_mut().into_len_mut() += 1;
|
||||||
slice_insert(self.reborrow_mut().into_key_area_slice(), 0, key);
|
slice_insert(self.reborrow_mut().into_key_area_slice(), 0, key);
|
||||||
slice_insert(self.reborrow_mut().into_val_area_slice(), 0, val);
|
slice_insert(self.reborrow_mut().into_val_area_slice(), 0, val);
|
||||||
slice_insert(self.reborrow_mut().into_edge_area_slice(), 0, edge.into_boxed_node());
|
slice_insert(self.reborrow_mut().into_edge_area_slice(), 0, edge.node);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.correct_all_childrens_parent_links();
|
self.correct_all_childrens_parent_links();
|
||||||
@ -732,8 +708,8 @@ fn pop(&mut self) -> (K, V, Option<Root<K, V>>) {
|
|||||||
let edge = match self.reborrow_mut().force() {
|
let edge = match self.reborrow_mut().force() {
|
||||||
ForceResult::Leaf(_) => None,
|
ForceResult::Leaf(_) => None,
|
||||||
ForceResult::Internal(internal) => {
|
ForceResult::Internal(internal) => {
|
||||||
let boxed_node = ptr::read(internal.reborrow().edge_at(idx + 1));
|
let node = ptr::read(internal.reborrow().edge_at(idx + 1));
|
||||||
let mut edge = Root::from_boxed_node(boxed_node, internal.height - 1);
|
let mut edge = Root { node, height: internal.height - 1, _marker: PhantomData };
|
||||||
// In practice, clearing the parent is a waste of time, because we will
|
// In practice, clearing the parent is a waste of time, because we will
|
||||||
// insert the node elsewhere and set its parent link again.
|
// insert the node elsewhere and set its parent link again.
|
||||||
edge.borrow_mut().clear_parent_link();
|
edge.borrow_mut().clear_parent_link();
|
||||||
@ -760,9 +736,8 @@ fn pop_front(&mut self) -> (K, V, Option<Root<K, V>>) {
|
|||||||
let edge = match self.reborrow_mut().force() {
|
let edge = match self.reborrow_mut().force() {
|
||||||
ForceResult::Leaf(_) => None,
|
ForceResult::Leaf(_) => None,
|
||||||
ForceResult::Internal(mut internal) => {
|
ForceResult::Internal(mut internal) => {
|
||||||
let boxed_node =
|
let node = slice_remove(internal.reborrow_mut().into_edge_area_slice(), 0);
|
||||||
slice_remove(internal.reborrow_mut().into_edge_area_slice(), 0);
|
let mut edge = Root { node, height: internal.height - 1, _marker: PhantomData };
|
||||||
let mut edge = Root::from_boxed_node(boxed_node, internal.height - 1);
|
|
||||||
// In practice, clearing the parent is a waste of time, because we will
|
// In practice, clearing the parent is a waste of time, because we will
|
||||||
// insert the node elsewhere and set its parent link again.
|
// insert the node elsewhere and set its parent link again.
|
||||||
edge.borrow_mut().clear_parent_link();
|
edge.borrow_mut().clear_parent_link();
|
||||||
@ -1041,12 +1016,11 @@ fn insert_fit(&mut self, key: K, val: V, edge: Root<K, V>) {
|
|||||||
debug_assert!(self.node.len() < CAPACITY);
|
debug_assert!(self.node.len() < CAPACITY);
|
||||||
debug_assert!(edge.height == self.node.height - 1);
|
debug_assert!(edge.height == self.node.height - 1);
|
||||||
|
|
||||||
let boxed_node = edge.into_boxed_node();
|
|
||||||
unsafe {
|
unsafe {
|
||||||
*self.node.reborrow_mut().into_len_mut() += 1;
|
*self.node.reborrow_mut().into_len_mut() += 1;
|
||||||
slice_insert(self.node.reborrow_mut().into_key_area_slice(), self.idx, key);
|
slice_insert(self.node.reborrow_mut().into_key_area_slice(), self.idx, key);
|
||||||
slice_insert(self.node.reborrow_mut().into_val_area_slice(), self.idx, val);
|
slice_insert(self.node.reborrow_mut().into_val_area_slice(), self.idx, val);
|
||||||
slice_insert(self.node.reborrow_mut().into_edge_area_slice(), self.idx + 1, boxed_node);
|
slice_insert(self.node.reborrow_mut().into_edge_area_slice(), self.idx + 1, edge.node);
|
||||||
|
|
||||||
self.node.correct_childrens_parent_links((self.idx + 1)..=self.node.len());
|
self.node.correct_childrens_parent_links((self.idx + 1)..=self.node.len());
|
||||||
}
|
}
|
||||||
@ -1135,8 +1109,8 @@ pub fn descend(self) -> NodeRef<BorrowType, K, V, marker::LeafOrInternal> {
|
|||||||
// reference (Rust issue #73987) and invalidate any other references
|
// reference (Rust issue #73987) and invalidate any other references
|
||||||
// to or inside the array, should any be around.
|
// to or inside the array, should any be around.
|
||||||
let parent_ptr = NodeRef::as_internal_ptr(&self.node);
|
let parent_ptr = NodeRef::as_internal_ptr(&self.node);
|
||||||
let boxed_node = unsafe { (*parent_ptr).edges.get_unchecked(self.idx).assume_init_read() };
|
let node = unsafe { (*parent_ptr).edges.get_unchecked(self.idx).assume_init_read() };
|
||||||
NodeRef::from_boxed_node(boxed_node, self.node.height - 1)
|
NodeRef { node, height: self.node.height - 1, _marker: PhantomData }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -216,6 +216,10 @@ def children_of_btree_map(map):
|
|||||||
internal_type = lookup_type(internal_type_name)
|
internal_type = lookup_type(internal_type_name)
|
||||||
return node.cast(internal_type.pointer())
|
return node.cast(internal_type.pointer())
|
||||||
|
|
||||||
|
if node_ptr.type.name.startswith("alloc::collections::btree::node::BoxedNode<"):
|
||||||
|
# BACKCOMPAT: rust 1.49
|
||||||
|
node_ptr = node_ptr["ptr"]
|
||||||
|
node_ptr = unwrap_unique_or_non_null(node_ptr)
|
||||||
leaf = node_ptr.dereference()
|
leaf = node_ptr.dereference()
|
||||||
keys = leaf["keys"]
|
keys = leaf["keys"]
|
||||||
vals = leaf["vals"]
|
vals = leaf["vals"]
|
||||||
@ -224,9 +228,8 @@ def children_of_btree_map(map):
|
|||||||
|
|
||||||
for i in xrange(0, length + 1):
|
for i in xrange(0, length + 1):
|
||||||
if height > 0:
|
if height > 0:
|
||||||
boxed_child_node = edges[i]["value"]["value"]
|
child_ptr = edges[i]["value"]["value"]
|
||||||
child_node = unwrap_unique_or_non_null(boxed_child_node["ptr"])
|
for child in children_of_node(child_ptr, height - 1):
|
||||||
for child in children_of_node(child_node, height - 1):
|
|
||||||
yield child
|
yield child
|
||||||
if i < length:
|
if i < length:
|
||||||
# Avoid "Cannot perform pointer math on incomplete type" on zero-sized arrays.
|
# Avoid "Cannot perform pointer math on incomplete type" on zero-sized arrays.
|
||||||
@ -239,9 +242,6 @@ def children_of_btree_map(map):
|
|||||||
if root.type.name.startswith("core::option::Option<"):
|
if root.type.name.startswith("core::option::Option<"):
|
||||||
root = root.cast(gdb.lookup_type(root.type.name[21:-1]))
|
root = root.cast(gdb.lookup_type(root.type.name[21:-1]))
|
||||||
node_ptr = root["node"]
|
node_ptr = root["node"]
|
||||||
if node_ptr.type.name.startswith("alloc::collections::btree::node::BoxedNode<"):
|
|
||||||
node_ptr = node_ptr["ptr"]
|
|
||||||
node_ptr = unwrap_unique_or_non_null(node_ptr)
|
|
||||||
height = root["height"]
|
height = root["height"]
|
||||||
for child in children_of_node(node_ptr, height):
|
for child in children_of_node(node_ptr, height):
|
||||||
yield child
|
yield child
|
||||||
|
Loading…
Reference in New Issue
Block a user