@@ -195,6 +195,10 @@ impl<K, V> Root<K, V> {
195
195
}
196
196
197
197
pub fn shared_empty_root ( ) -> Self {
198
+ // Ensuring that the shared node hasn't been corrupted by any mutations
199
+ debug_assert ! ( EMPTY_ROOT_NODE . parent == ptr:: null( ) ) ;
200
+ debug_assert ! ( EMPTY_ROOT_NODE . parent_idx == 0 ) ;
201
+ debug_assert ! ( EMPTY_ROOT_NODE . len == 0 ) ;
198
202
Root {
199
203
node : unsafe {
200
204
BoxedNode :: from_ptr ( NonNull :: new_unchecked (
@@ -246,6 +250,7 @@ impl<K, V> Root<K, V> {
246
250
/// new node the root. This increases the height by 1 and is the opposite of `pop_level`.
247
251
pub fn push_level ( & mut self )
248
252
-> NodeRef < marker:: Mut , K , V , marker:: Internal > {
253
+ debug_assert ! ( !self . is_shared_root( ) ) ;
249
254
let mut new_node = Box :: new ( unsafe { InternalNode :: new ( ) } ) ;
250
255
new_node. edges [ 0 ] = unsafe { BoxedNode :: from_ptr ( self . node . as_ptr ( ) ) } ;
251
256
@@ -474,6 +479,7 @@ impl<K, V> NodeRef<marker::Owned, K, V, marker::Leaf> {
474
479
marker:: Edge
475
480
>
476
481
> {
482
+ debug_assert ! ( !self . is_shared_root( ) ) ;
477
483
let node = self . node ;
478
484
let ret = self . ascend ( ) . ok ( ) ;
479
485
Global . dealloc ( node. as_opaque ( ) , Layout :: new :: < LeafNode < K , V > > ( ) ) ;
@@ -631,6 +637,7 @@ impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::Leaf> {
631
637
pub fn push ( & mut self , key : K , val : V ) {
632
638
// Necessary for correctness, but this is an internal module
633
639
debug_assert ! ( self . len( ) < CAPACITY ) ;
640
+ debug_assert ! ( !self . is_shared_root( ) ) ;
634
641
635
642
let idx = self . len ( ) ;
636
643
@@ -646,6 +653,7 @@ impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::Leaf> {
646
653
pub fn push_front ( & mut self , key : K , val : V ) {
647
654
// Necessary for correctness, but this is an internal module
648
655
debug_assert ! ( self . len( ) < CAPACITY ) ;
656
+ debug_assert ! ( !self . is_shared_root( ) ) ;
649
657
650
658
unsafe {
651
659
slice_insert ( self . keys_mut ( ) , 0 , key) ;
@@ -959,6 +967,7 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::Edge
959
967
fn insert_fit ( & mut self , key : K , val : V ) -> * mut V {
960
968
// Necessary for correctness, but in a private module
961
969
debug_assert ! ( self . node. len( ) < CAPACITY ) ;
970
+ debug_assert ! ( !self . node. is_shared_root( ) ) ;
962
971
963
972
unsafe {
964
973
slice_insert ( self . node . keys_mut ( ) , self . idx , key) ;
@@ -1136,6 +1145,7 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::KV>
1136
1145
/// allocated node.
1137
1146
pub fn split ( mut self )
1138
1147
-> ( NodeRef < marker:: Mut < ' a > , K , V , marker:: Leaf > , K , V , Root < K , V > ) {
1148
+ debug_assert ! ( !self . node. is_shared_root( ) ) ;
1139
1149
unsafe {
1140
1150
let mut new_node = Box :: new ( LeafNode :: new ( ) ) ;
1141
1151
@@ -1173,6 +1183,7 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::KV>
1173
1183
/// now adjacent key/value pairs to the left and right of this handle.
1174
1184
pub fn remove ( mut self )
1175
1185
-> ( Handle < NodeRef < marker:: Mut < ' a > , K , V , marker:: Leaf > , marker:: Edge > , K , V ) {
1186
+ debug_assert ! ( !self . node. is_shared_root( ) ) ;
1176
1187
unsafe {
1177
1188
let k = slice_remove ( self . node . keys_mut ( ) , self . idx ) ;
1178
1189
let v = slice_remove ( self . node . vals_mut ( ) , self . idx ) ;
0 commit comments