@@ -5,7 +5,6 @@ use core::hash::{Hash, Hasher};
5
5
use core:: iter:: { FromIterator , FusedIterator , Peekable } ;
6
6
use core:: marker:: PhantomData ;
7
7
use core:: mem:: { self , ManuallyDrop } ;
8
- use core:: ops:: Bound :: { Excluded , Included , Unbounded } ;
9
8
use core:: ops:: { Index , RangeBounds } ;
10
9
use core:: ptr;
11
10
@@ -408,8 +407,8 @@ impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for Range<'_, K, V> {
408
407
/// [`range_mut`]: BTreeMap::range_mut
409
408
#[ stable( feature = "btree_range" , since = "1.17.0" ) ]
410
409
pub struct RangeMut < ' a , K : ' a , V : ' a > {
411
- front : Option < Handle < NodeRef < marker:: Mut < ' a > , K , V , marker:: Leaf > , marker:: Edge > > ,
412
- back : Option < Handle < NodeRef < marker:: Mut < ' a > , K , V , marker:: Leaf > , marker:: Edge > > ,
410
+ front : Option < Handle < NodeRef < marker:: ValMut < ' a > , K , V , marker:: Leaf > , marker:: Edge > > ,
411
+ back : Option < Handle < NodeRef < marker:: ValMut < ' a > , K , V , marker:: Leaf > , marker:: Edge > > ,
413
412
414
413
// Be invariant in `K` and `V`
415
414
_marker : PhantomData < & ' a mut ( K , V ) > ,
@@ -999,7 +998,7 @@ impl<K: Ord, V> BTreeMap<K, V> {
999
998
R : RangeBounds < T > ,
1000
999
{
1001
1000
if let Some ( root) = & self . root {
1002
- let ( f, b) = range_search ( root. node_as_ref ( ) , range) ;
1001
+ let ( f, b) = root. node_as_ref ( ) . range_search ( range) ;
1003
1002
1004
1003
Range { front : Some ( f) , back : Some ( b) }
1005
1004
} else {
@@ -1045,7 +1044,7 @@ impl<K: Ord, V> BTreeMap<K, V> {
1045
1044
R : RangeBounds < T > ,
1046
1045
{
1047
1046
if let Some ( root) = & mut self . root {
1048
- let ( f, b) = range_search ( root. node_as_mut ( ) , range) ;
1047
+ let ( f, b) = root. node_as_valmut ( ) . range_search ( range) ;
1049
1048
1050
1049
RangeMut { front : Some ( f) , back : Some ( b) , _marker : PhantomData }
1051
1050
} else {
@@ -1478,7 +1477,7 @@ impl<K, V> IntoIterator for BTreeMap<K, V> {
1478
1477
fn into_iter ( self ) -> IntoIter < K , V > {
1479
1478
let mut me = ManuallyDrop :: new ( self ) ;
1480
1479
if let Some ( root) = me. root . take ( ) {
1481
- let ( f, b) = full_range_search ( root. into_ref ( ) ) ;
1480
+ let ( f, b) = root. into_ref ( ) . full_range ( ) ;
1482
1481
1483
1482
IntoIter { front : Some ( f) , back : Some ( b) , length : me. length }
1484
1483
} else {
@@ -1942,7 +1941,7 @@ impl<'a, K, V> RangeMut<'a, K, V> {
1942
1941
self . front == self . back
1943
1942
}
1944
1943
1945
- unsafe fn next_unchecked ( & mut self ) -> ( & ' a mut K , & ' a mut V ) {
1944
+ unsafe fn next_unchecked ( & mut self ) -> ( & ' a K , & ' a mut V ) {
1946
1945
unsafe { unwrap_unchecked ( self . front . as_mut ( ) ) . next_unchecked ( ) }
1947
1946
}
1948
1947
}
@@ -1963,7 +1962,7 @@ impl<'a, K, V> DoubleEndedIterator for RangeMut<'a, K, V> {
1963
1962
impl < K , V > FusedIterator for RangeMut < ' _ , K , V > { }
1964
1963
1965
1964
impl < ' a , K , V > RangeMut < ' a , K , V > {
1966
- unsafe fn next_back_unchecked ( & mut self ) -> ( & ' a mut K , & ' a mut V ) {
1965
+ unsafe fn next_back_unchecked ( & mut self ) -> ( & ' a K , & ' a mut V ) {
1967
1966
unsafe { unwrap_unchecked ( self . back . as_mut ( ) ) . next_back_unchecked ( ) }
1968
1967
}
1969
1968
}
@@ -2073,119 +2072,6 @@ where
2073
2072
}
2074
2073
}
2075
2074
2076
- /// Finds the leaf edges delimiting a specified range in or underneath a node.
2077
- fn range_search < BorrowType , K , V , Q : ?Sized , R : RangeBounds < Q > > (
2078
- root : NodeRef < BorrowType , K , V , marker:: LeafOrInternal > ,
2079
- range : R ,
2080
- ) -> (
2081
- Handle < NodeRef < BorrowType , K , V , marker:: Leaf > , marker:: Edge > ,
2082
- Handle < NodeRef < BorrowType , K , V , marker:: Leaf > , marker:: Edge > ,
2083
- )
2084
- where
2085
- Q : Ord ,
2086
- K : Borrow < Q > ,
2087
- {
2088
- match ( range. start_bound ( ) , range. end_bound ( ) ) {
2089
- ( Excluded ( s) , Excluded ( e) ) if s == e => {
2090
- panic ! ( "range start and end are equal and excluded in BTreeMap" )
2091
- }
2092
- ( Included ( s) | Excluded ( s) , Included ( e) | Excluded ( e) ) if s > e => {
2093
- panic ! ( "range start is greater than range end in BTreeMap" )
2094
- }
2095
- _ => { }
2096
- } ;
2097
-
2098
- // We duplicate the root NodeRef here -- we will never access it in a way
2099
- // that overlaps references obtained from the root.
2100
- let mut min_node = unsafe { ptr:: read ( & root) } ;
2101
- let mut max_node = root;
2102
- let mut min_found = false ;
2103
- let mut max_found = false ;
2104
-
2105
- loop {
2106
- let front = match ( min_found, range. start_bound ( ) ) {
2107
- ( false , Included ( key) ) => match search:: search_node ( min_node, key) {
2108
- Found ( kv) => {
2109
- min_found = true ;
2110
- kv. left_edge ( )
2111
- }
2112
- GoDown ( edge) => edge,
2113
- } ,
2114
- ( false , Excluded ( key) ) => match search:: search_node ( min_node, key) {
2115
- Found ( kv) => {
2116
- min_found = true ;
2117
- kv. right_edge ( )
2118
- }
2119
- GoDown ( edge) => edge,
2120
- } ,
2121
- ( true , Included ( _) ) => min_node. last_edge ( ) ,
2122
- ( true , Excluded ( _) ) => min_node. first_edge ( ) ,
2123
- ( _, Unbounded ) => min_node. first_edge ( ) ,
2124
- } ;
2125
-
2126
- let back = match ( max_found, range. end_bound ( ) ) {
2127
- ( false , Included ( key) ) => match search:: search_node ( max_node, key) {
2128
- Found ( kv) => {
2129
- max_found = true ;
2130
- kv. right_edge ( )
2131
- }
2132
- GoDown ( edge) => edge,
2133
- } ,
2134
- ( false , Excluded ( key) ) => match search:: search_node ( max_node, key) {
2135
- Found ( kv) => {
2136
- max_found = true ;
2137
- kv. left_edge ( )
2138
- }
2139
- GoDown ( edge) => edge,
2140
- } ,
2141
- ( true , Included ( _) ) => max_node. first_edge ( ) ,
2142
- ( true , Excluded ( _) ) => max_node. last_edge ( ) ,
2143
- ( _, Unbounded ) => max_node. last_edge ( ) ,
2144
- } ;
2145
-
2146
- if front. partial_cmp ( & back) == Some ( Ordering :: Greater ) {
2147
- panic ! ( "Ord is ill-defined in BTreeMap range" ) ;
2148
- }
2149
- match ( front. force ( ) , back. force ( ) ) {
2150
- ( Leaf ( f) , Leaf ( b) ) => {
2151
- return ( f, b) ;
2152
- }
2153
- ( Internal ( min_int) , Internal ( max_int) ) => {
2154
- min_node = min_int. descend ( ) ;
2155
- max_node = max_int. descend ( ) ;
2156
- }
2157
- _ => unreachable ! ( "BTreeMap has different depths" ) ,
2158
- } ;
2159
- }
2160
- }
2161
-
2162
- /// Equivalent to `range_search(k, v, ..)` without the `Ord` bound.
2163
- fn full_range_search < BorrowType , K , V > (
2164
- root : NodeRef < BorrowType , K , V , marker:: LeafOrInternal > ,
2165
- ) -> (
2166
- Handle < NodeRef < BorrowType , K , V , marker:: Leaf > , marker:: Edge > ,
2167
- Handle < NodeRef < BorrowType , K , V , marker:: Leaf > , marker:: Edge > ,
2168
- ) {
2169
- // We duplicate the root NodeRef here -- we will never access it in a way
2170
- // that overlaps references obtained from the root.
2171
- let mut min_node = unsafe { ptr:: read ( & root) } ;
2172
- let mut max_node = root;
2173
- loop {
2174
- let front = min_node. first_edge ( ) ;
2175
- let back = max_node. last_edge ( ) ;
2176
- match ( front. force ( ) , back. force ( ) ) {
2177
- ( Leaf ( f) , Leaf ( b) ) => {
2178
- return ( f, b) ;
2179
- }
2180
- ( Internal ( min_int) , Internal ( max_int) ) => {
2181
- min_node = min_int. descend ( ) ;
2182
- max_node = max_int. descend ( ) ;
2183
- }
2184
- _ => unreachable ! ( "BTreeMap has different depths" ) ,
2185
- } ;
2186
- }
2187
- }
2188
-
2189
2075
impl < K , V > BTreeMap < K , V > {
2190
2076
/// Gets an iterator over the entries of the map, sorted by key.
2191
2077
///
@@ -2211,7 +2097,7 @@ impl<K, V> BTreeMap<K, V> {
2211
2097
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
2212
2098
pub fn iter ( & self ) -> Iter < ' _ , K , V > {
2213
2099
if let Some ( root) = & self . root {
2214
- let ( f, b) = full_range_search ( root. node_as_ref ( ) ) ;
2100
+ let ( f, b) = root. node_as_ref ( ) . full_range ( ) ;
2215
2101
2216
2102
Iter { range : Range { front : Some ( f) , back : Some ( b) } , length : self . length }
2217
2103
} else {
@@ -2243,7 +2129,7 @@ impl<K, V> BTreeMap<K, V> {
2243
2129
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
2244
2130
pub fn iter_mut ( & mut self ) -> IterMut < ' _ , K , V > {
2245
2131
if let Some ( root) = & mut self . root {
2246
- let ( f, b) = full_range_search ( root. node_as_mut ( ) ) ;
2132
+ let ( f, b) = root. node_as_valmut ( ) . full_range ( ) ;
2247
2133
2248
2134
IterMut {
2249
2135
range : RangeMut { front : Some ( f) , back : Some ( b) , _marker : PhantomData } ,
@@ -2826,7 +2712,7 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInter
2826
2712
if stole_from_left && at_leaf {
2827
2713
// SAFETY: This is safe since we just added an element to our node.
2828
2714
unsafe {
2829
- pos. next_unchecked ( ) ;
2715
+ pos. move_next_unchecked ( ) ;
2830
2716
}
2831
2717
}
2832
2718
break ;
0 commit comments