@@ -9,6 +9,7 @@ use core::ops::{Index, RangeBounds};
9
9
use core:: ptr;
10
10
11
11
use super :: borrow:: DormantMutRef ;
12
+ use super :: navigate:: LeafRange ;
12
13
use super :: node:: { self , marker, ForceResult :: * , Handle , NodeRef , Root } ;
13
14
use super :: search:: SearchResult :: * ;
14
15
@@ -307,20 +308,15 @@ pub struct IterMut<'a, K: 'a, V: 'a> {
307
308
/// [`into_iter`]: IntoIterator::into_iter
308
309
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
309
310
pub struct IntoIter < K , V > {
310
- front : Option < Handle < NodeRef < marker:: Dying , K , V , marker:: Leaf > , marker:: Edge > > ,
311
- back : Option < Handle < NodeRef < marker:: Dying , K , V , marker:: Leaf > , marker:: Edge > > ,
311
+ range : LeafRange < marker:: Dying , K , V > ,
312
312
length : usize ,
313
313
}
314
314
315
315
impl < K , V > IntoIter < K , V > {
316
316
/// Returns an iterator of references over the remaining items.
317
317
#[ inline]
318
318
pub ( super ) fn iter ( & self ) -> Iter < ' _ , K , V > {
319
- let range = Range {
320
- front : self . front . as_ref ( ) . map ( |f| f. reborrow ( ) ) ,
321
- back : self . back . as_ref ( ) . map ( |b| b. reborrow ( ) ) ,
322
- } ;
323
-
319
+ let range = Range { inner : self . range . reborrow ( ) } ;
324
320
Iter { range : range, length : self . length }
325
321
}
326
322
}
@@ -438,8 +434,7 @@ impl<K, V: fmt::Debug> fmt::Debug for IntoValues<K, V> {
438
434
/// [`range`]: BTreeMap::range
439
435
#[ stable( feature = "btree_range" , since = "1.17.0" ) ]
440
436
pub struct Range < ' a , K : ' a , V : ' a > {
441
- front : Option < Handle < NodeRef < marker:: Immut < ' a > , K , V , marker:: Leaf > , marker:: Edge > > ,
442
- back : Option < Handle < NodeRef < marker:: Immut < ' a > , K , V , marker:: Leaf > , marker:: Edge > > ,
437
+ inner : LeafRange < marker:: Immut < ' a > , K , V > ,
443
438
}
444
439
445
440
#[ stable( feature = "collection_debug" , since = "1.17.0" ) ]
@@ -457,8 +452,7 @@ impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for Range<'_, K, V> {
457
452
/// [`range_mut`]: BTreeMap::range_mut
458
453
#[ stable( feature = "btree_range" , since = "1.17.0" ) ]
459
454
pub struct RangeMut < ' a , K : ' a , V : ' a > {
460
- front : Option < Handle < NodeRef < marker:: ValMut < ' a > , K , V , marker:: Leaf > , marker:: Edge > > ,
461
- back : Option < Handle < NodeRef < marker:: ValMut < ' a > , K , V , marker:: Leaf > , marker:: Edge > > ,
455
+ inner : LeafRange < marker:: ValMut < ' a > , K , V > ,
462
456
463
457
// Be invariant in `K` and `V`
464
458
_marker : PhantomData < & ' a mut ( K , V ) > ,
@@ -467,10 +461,7 @@ pub struct RangeMut<'a, K: 'a, V: 'a> {
467
461
#[ stable( feature = "collection_debug" , since = "1.17.0" ) ]
468
462
impl < K : fmt:: Debug , V : fmt:: Debug > fmt:: Debug for RangeMut < ' _ , K , V > {
469
463
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
470
- let range = Range {
471
- front : self . front . as_ref ( ) . map ( |f| f. reborrow ( ) ) ,
472
- back : self . back . as_ref ( ) . map ( |b| b. reborrow ( ) ) ,
473
- } ;
464
+ let range = Range { inner : self . inner . reborrow ( ) } ;
474
465
f. debug_list ( ) . entries ( range) . finish ( )
475
466
}
476
467
}
@@ -1018,11 +1009,9 @@ impl<K, V> BTreeMap<K, V> {
1018
1009
R : RangeBounds < T > ,
1019
1010
{
1020
1011
if let Some ( root) = & self . root {
1021
- let ( f, b) = root. reborrow ( ) . range_search ( range) ;
1022
-
1023
- Range { front : Some ( f) , back : Some ( b) }
1012
+ Range { inner : root. reborrow ( ) . range_search ( range) }
1024
1013
} else {
1025
- Range { front : None , back : None }
1014
+ Range { inner : LeafRange :: none ( ) }
1026
1015
}
1027
1016
}
1028
1017
@@ -1064,11 +1053,9 @@ impl<K, V> BTreeMap<K, V> {
1064
1053
R : RangeBounds < T > ,
1065
1054
{
1066
1055
if let Some ( root) = & mut self . root {
1067
- let ( f, b) = root. borrow_valmut ( ) . range_search ( range) ;
1068
-
1069
- RangeMut { front : Some ( f) , back : Some ( b) , _marker : PhantomData }
1056
+ RangeMut { inner : root. borrow_valmut ( ) . range_search ( range) , _marker : PhantomData }
1070
1057
} else {
1071
- RangeMut { front : None , back : None , _marker : PhantomData }
1058
+ RangeMut { inner : LeafRange :: none ( ) , _marker : PhantomData }
1072
1059
}
1073
1060
}
1074
1061
@@ -1407,11 +1394,11 @@ impl<K, V> IntoIterator for BTreeMap<K, V> {
1407
1394
fn into_iter ( self ) -> IntoIter < K , V > {
1408
1395
let mut me = ManuallyDrop :: new ( self ) ;
1409
1396
if let Some ( root) = me. root . take ( ) {
1410
- let ( f , b ) = root. into_dying ( ) . full_range ( ) ;
1397
+ let full_range = root. into_dying ( ) . full_range ( ) ;
1411
1398
1412
- IntoIter { front : Some ( f ) , back : Some ( b ) , length : me. length }
1399
+ IntoIter { range : full_range , length : me. length }
1413
1400
} else {
1414
- IntoIter { front : None , back : None , length : 0 }
1401
+ IntoIter { range : LeafRange :: none ( ) , length : 0 }
1415
1402
}
1416
1403
}
1417
1404
}
@@ -1450,7 +1437,7 @@ impl<K, V> Drop for Dropper<K, V> {
1450
1437
#[ stable( feature = "btree_drop" , since = "1.7.0" ) ]
1451
1438
impl < K , V > Drop for IntoIter < K , V > {
1452
1439
fn drop ( & mut self ) {
1453
- if let Some ( front) = self . front . take ( ) {
1440
+ if let Some ( front) = self . range . front . take ( ) {
1454
1441
Dropper { front, remaining_length : self . length } ;
1455
1442
}
1456
1443
}
@@ -1465,7 +1452,7 @@ impl<K, V> Iterator for IntoIter<K, V> {
1465
1452
None
1466
1453
} else {
1467
1454
self . length -= 1 ;
1468
- Some ( unsafe { self . front . as_mut ( ) . unwrap ( ) . deallocating_next_unchecked ( ) } )
1455
+ Some ( unsafe { self . range . front . as_mut ( ) . unwrap ( ) . deallocating_next_unchecked ( ) } )
1469
1456
}
1470
1457
}
1471
1458
@@ -1481,7 +1468,7 @@ impl<K, V> DoubleEndedIterator for IntoIter<K, V> {
1481
1468
None
1482
1469
} else {
1483
1470
self . length -= 1 ;
1484
- Some ( unsafe { self . back . as_mut ( ) . unwrap ( ) . deallocating_next_back_unchecked ( ) } )
1471
+ Some ( unsafe { self . range . back . as_mut ( ) . unwrap ( ) . deallocating_next_back_unchecked ( ) } )
1485
1472
}
1486
1473
}
1487
1474
}
@@ -1698,7 +1685,7 @@ impl<'a, K, V> Iterator for Range<'a, K, V> {
1698
1685
type Item = ( & ' a K , & ' a V ) ;
1699
1686
1700
1687
fn next ( & mut self ) -> Option < ( & ' a K , & ' a V ) > {
1701
- if self . is_empty ( ) { None } else { Some ( unsafe { self . next_unchecked ( ) } ) }
1688
+ if self . inner . is_empty ( ) { None } else { Some ( unsafe { self . next_unchecked ( ) } ) }
1702
1689
}
1703
1690
1704
1691
fn last ( mut self ) -> Option < ( & ' a K , & ' a V ) > {
@@ -1749,12 +1736,8 @@ impl<K, V> ExactSizeIterator for ValuesMut<'_, K, V> {
1749
1736
impl < K , V > FusedIterator for ValuesMut < ' _ , K , V > { }
1750
1737
1751
1738
impl < ' a , K , V > Range < ' a , K , V > {
1752
- fn is_empty ( & self ) -> bool {
1753
- self . front == self . back
1754
- }
1755
-
1756
1739
unsafe fn next_unchecked ( & mut self ) -> ( & ' a K , & ' a V ) {
1757
- unsafe { self . front . as_mut ( ) . unwrap_unchecked ( ) . next_unchecked ( ) }
1740
+ unsafe { self . inner . front . as_mut ( ) . unwrap_unchecked ( ) . next_unchecked ( ) }
1758
1741
}
1759
1742
}
1760
1743
@@ -1837,13 +1820,13 @@ impl<K, V> FusedIterator for IntoValues<K, V> {}
1837
1820
#[ stable( feature = "btree_range" , since = "1.17.0" ) ]
1838
1821
impl < ' a , K , V > DoubleEndedIterator for Range < ' a , K , V > {
1839
1822
fn next_back ( & mut self ) -> Option < ( & ' a K , & ' a V ) > {
1840
- if self . is_empty ( ) { None } else { Some ( unsafe { self . next_back_unchecked ( ) } ) }
1823
+ if self . inner . is_empty ( ) { None } else { Some ( unsafe { self . next_back_unchecked ( ) } ) }
1841
1824
}
1842
1825
}
1843
1826
1844
1827
impl < ' a , K , V > Range < ' a , K , V > {
1845
1828
unsafe fn next_back_unchecked ( & mut self ) -> ( & ' a K , & ' a V ) {
1846
- unsafe { self . back . as_mut ( ) . unwrap_unchecked ( ) . next_back_unchecked ( ) }
1829
+ unsafe { self . inner . back . as_mut ( ) . unwrap_unchecked ( ) . next_back_unchecked ( ) }
1847
1830
}
1848
1831
}
1849
1832
@@ -1853,7 +1836,7 @@ impl<K, V> FusedIterator for Range<'_, K, V> {}
1853
1836
#[ stable( feature = "btree_range" , since = "1.17.0" ) ]
1854
1837
impl < K , V > Clone for Range < ' _ , K , V > {
1855
1838
fn clone ( & self ) -> Self {
1856
- Range { front : self . front , back : self . back }
1839
+ Range { inner : LeafRange { front : self . inner . front , back : self . inner . back } }
1857
1840
}
1858
1841
}
1859
1842
@@ -1862,7 +1845,7 @@ impl<'a, K, V> Iterator for RangeMut<'a, K, V> {
1862
1845
type Item = ( & ' a K , & ' a mut V ) ;
1863
1846
1864
1847
fn next ( & mut self ) -> Option < ( & ' a K , & ' a mut V ) > {
1865
- if self . is_empty ( ) { None } else { Some ( unsafe { self . next_unchecked ( ) } ) }
1848
+ if self . inner . is_empty ( ) { None } else { Some ( unsafe { self . next_unchecked ( ) } ) }
1866
1849
}
1867
1850
1868
1851
fn last ( mut self ) -> Option < ( & ' a K , & ' a mut V ) > {
@@ -1879,28 +1862,21 @@ impl<'a, K, V> Iterator for RangeMut<'a, K, V> {
1879
1862
}
1880
1863
1881
1864
impl < ' a , K , V > RangeMut < ' a , K , V > {
1882
- fn is_empty ( & self ) -> bool {
1883
- self . front == self . back
1884
- }
1885
-
1886
1865
unsafe fn next_unchecked ( & mut self ) -> ( & ' a K , & ' a mut V ) {
1887
- unsafe { self . front . as_mut ( ) . unwrap_unchecked ( ) . next_unchecked ( ) }
1866
+ unsafe { self . inner . front . as_mut ( ) . unwrap_unchecked ( ) . next_unchecked ( ) }
1888
1867
}
1889
1868
1890
1869
/// Returns an iterator of references over the remaining items.
1891
1870
#[ inline]
1892
1871
pub ( super ) fn iter ( & self ) -> Range < ' _ , K , V > {
1893
- Range {
1894
- front : self . front . as_ref ( ) . map ( |f| f. reborrow ( ) ) ,
1895
- back : self . back . as_ref ( ) . map ( |b| b. reborrow ( ) ) ,
1896
- }
1872
+ Range { inner : self . inner . reborrow ( ) }
1897
1873
}
1898
1874
}
1899
1875
1900
1876
#[ stable( feature = "btree_range" , since = "1.17.0" ) ]
1901
1877
impl < ' a , K , V > DoubleEndedIterator for RangeMut < ' a , K , V > {
1902
1878
fn next_back ( & mut self ) -> Option < ( & ' a K , & ' a mut V ) > {
1903
- if self . is_empty ( ) { None } else { Some ( unsafe { self . next_back_unchecked ( ) } ) }
1879
+ if self . inner . is_empty ( ) { None } else { Some ( unsafe { self . next_back_unchecked ( ) } ) }
1904
1880
}
1905
1881
}
1906
1882
@@ -1909,7 +1885,7 @@ impl<K, V> FusedIterator for RangeMut<'_, K, V> {}
1909
1885
1910
1886
impl < ' a , K , V > RangeMut < ' a , K , V > {
1911
1887
unsafe fn next_back_unchecked ( & mut self ) -> ( & ' a K , & ' a mut V ) {
1912
- unsafe { self . back . as_mut ( ) . unwrap_unchecked ( ) . next_back_unchecked ( ) }
1888
+ unsafe { self . inner . back . as_mut ( ) . unwrap_unchecked ( ) . next_back_unchecked ( ) }
1913
1889
}
1914
1890
}
1915
1891
@@ -2043,11 +2019,11 @@ impl<K, V> BTreeMap<K, V> {
2043
2019
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
2044
2020
pub fn iter ( & self ) -> Iter < ' _ , K , V > {
2045
2021
if let Some ( root) = & self . root {
2046
- let ( f , b ) = root. reborrow ( ) . full_range ( ) ;
2022
+ let full_range = root. reborrow ( ) . full_range ( ) ;
2047
2023
2048
- Iter { range : Range { front : Some ( f ) , back : Some ( b ) } , length : self . length }
2024
+ Iter { range : Range { inner : full_range } , length : self . length }
2049
2025
} else {
2050
- Iter { range : Range { front : None , back : None } , length : 0 }
2026
+ Iter { range : Range { inner : LeafRange :: none ( ) } , length : 0 }
2051
2027
}
2052
2028
}
2053
2029
@@ -2075,14 +2051,17 @@ impl<K, V> BTreeMap<K, V> {
2075
2051
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
2076
2052
pub fn iter_mut ( & mut self ) -> IterMut < ' _ , K , V > {
2077
2053
if let Some ( root) = & mut self . root {
2078
- let ( f , b ) = root. borrow_valmut ( ) . full_range ( ) ;
2054
+ let full_range = root. borrow_valmut ( ) . full_range ( ) ;
2079
2055
2080
2056
IterMut {
2081
- range : RangeMut { front : Some ( f ) , back : Some ( b ) , _marker : PhantomData } ,
2057
+ range : RangeMut { inner : full_range , _marker : PhantomData } ,
2082
2058
length : self . length ,
2083
2059
}
2084
2060
} else {
2085
- IterMut { range : RangeMut { front : None , back : None , _marker : PhantomData } , length : 0 }
2061
+ IterMut {
2062
+ range : RangeMut { inner : LeafRange :: none ( ) , _marker : PhantomData } ,
2063
+ length : 0 ,
2064
+ }
2086
2065
}
2087
2066
}
2088
2067
0 commit comments