Skip to content

Commit be555fc

Browse files
borsgitbot
authored and
gitbot
committed
Auto merge of rust-lang#85980 - ssomers:btree_cleanup_LeafRange, r=Mark-Simulacrum
BTree: encapsulate LeafRange better & some debug asserts Looking at iterators again, I think rust-lang#81937 didn't house enough code in `LeafRange`. Moving the API boundary a little makes things more local in navigate.rs and less complicated in map.rs. r? `@Mark-Simulacrum`
2 parents 7882bd6 + 8d3014e commit be555fc

File tree

3 files changed

+143
-58
lines changed

3 files changed

+143
-58
lines changed

alloc/benches/btree/map.rs

+32-7
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ pub fn iteration_mut_100000(b: &mut Bencher) {
177177
bench_iteration_mut(b, 100000);
178178
}
179179

180-
fn bench_first_and_last(b: &mut Bencher, size: i32) {
180+
fn bench_first_and_last_nightly(b: &mut Bencher, size: i32) {
181181
let map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
182182
b.iter(|| {
183183
for _ in 0..10 {
@@ -187,19 +187,44 @@ fn bench_first_and_last(b: &mut Bencher, size: i32) {
187187
});
188188
}
189189

190+
fn bench_first_and_last_stable(b: &mut Bencher, size: i32) {
191+
let map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
192+
b.iter(|| {
193+
for _ in 0..10 {
194+
black_box(map.iter().next());
195+
black_box(map.iter().next_back());
196+
}
197+
});
198+
}
199+
200+
#[bench]
201+
pub fn first_and_last_0_nightly(b: &mut Bencher) {
202+
bench_first_and_last_nightly(b, 0);
203+
}
204+
205+
#[bench]
206+
pub fn first_and_last_0_stable(b: &mut Bencher) {
207+
bench_first_and_last_stable(b, 0);
208+
}
209+
210+
#[bench]
211+
pub fn first_and_last_100_nightly(b: &mut Bencher) {
212+
bench_first_and_last_nightly(b, 100);
213+
}
214+
190215
#[bench]
191-
pub fn first_and_last_0(b: &mut Bencher) {
192-
bench_first_and_last(b, 0);
216+
pub fn first_and_last_100_stable(b: &mut Bencher) {
217+
bench_first_and_last_stable(b, 100);
193218
}
194219

195220
#[bench]
196-
pub fn first_and_last_100(b: &mut Bencher) {
197-
bench_first_and_last(b, 100);
221+
pub fn first_and_last_10k_nightly(b: &mut Bencher) {
222+
bench_first_and_last_nightly(b, 10_000);
198223
}
199224

200225
#[bench]
201-
pub fn first_and_last_10k(b: &mut Bencher) {
202-
bench_first_and_last(b, 10_000);
226+
pub fn first_and_last_10k_stable(b: &mut Bencher) {
227+
bench_first_and_last_stable(b, 10_000);
203228
}
204229

205230
const BENCH_RANGE_SIZE: i32 = 145;

alloc/src/collections/btree/map.rs

+12-36
Original file line numberDiff line numberDiff line change
@@ -1299,7 +1299,7 @@ impl<'a, K: 'a, V: 'a> Iterator for Iter<'a, K, V> {
12991299
None
13001300
} else {
13011301
self.length -= 1;
1302-
Some(unsafe { self.range.next_unchecked() })
1302+
Some(unsafe { self.range.inner.next_unchecked() })
13031303
}
13041304
}
13051305

@@ -1330,7 +1330,7 @@ impl<'a, K: 'a, V: 'a> DoubleEndedIterator for Iter<'a, K, V> {
13301330
None
13311331
} else {
13321332
self.length -= 1;
1333-
Some(unsafe { self.range.next_back_unchecked() })
1333+
Some(unsafe { self.range.inner.next_back_unchecked() })
13341334
}
13351335
}
13361336
}
@@ -1368,7 +1368,7 @@ impl<'a, K: 'a, V: 'a> Iterator for IterMut<'a, K, V> {
13681368
None
13691369
} else {
13701370
self.length -= 1;
1371-
Some(unsafe { self.range.next_unchecked() })
1371+
Some(unsafe { self.range.inner.next_unchecked() })
13721372
}
13731373
}
13741374

@@ -1396,7 +1396,7 @@ impl<'a, K: 'a, V: 'a> DoubleEndedIterator for IterMut<'a, K, V> {
13961396
None
13971397
} else {
13981398
self.length -= 1;
1399-
Some(unsafe { self.range.next_back_unchecked() })
1399+
Some(unsafe { self.range.inner.next_back_unchecked() })
14001400
}
14011401
}
14021402
}
@@ -1475,7 +1475,7 @@ impl<K, V> Drop for Dropper<K, V> {
14751475
#[stable(feature = "btree_drop", since = "1.7.0")]
14761476
impl<K, V> Drop for IntoIter<K, V> {
14771477
fn drop(&mut self) {
1478-
if let Some(front) = self.range.front.take() {
1478+
if let Some(front) = self.range.take_front() {
14791479
Dropper { front, remaining_length: self.length };
14801480
}
14811481
}
@@ -1490,8 +1490,7 @@ impl<K, V> Iterator for IntoIter<K, V> {
14901490
None
14911491
} else {
14921492
self.length -= 1;
1493-
let front = self.range.front.as_mut().unwrap();
1494-
let kv = unsafe { front.deallocating_next_unchecked() };
1493+
let kv = unsafe { self.range.deallocating_next_unchecked() };
14951494
Some(kv.into_key_val())
14961495
}
14971496
}
@@ -1508,8 +1507,7 @@ impl<K, V> DoubleEndedIterator for IntoIter<K, V> {
15081507
None
15091508
} else {
15101509
self.length -= 1;
1511-
let back = self.range.back.as_mut().unwrap();
1512-
let kv = unsafe { back.deallocating_next_back_unchecked() };
1510+
let kv = unsafe { self.range.deallocating_next_back_unchecked() };
15131511
Some(kv.into_key_val())
15141512
}
15151513
}
@@ -1727,7 +1725,7 @@ impl<'a, K, V> Iterator for Range<'a, K, V> {
17271725
type Item = (&'a K, &'a V);
17281726

17291727
fn next(&mut self) -> Option<(&'a K, &'a V)> {
1730-
if self.inner.is_empty() { None } else { Some(unsafe { self.next_unchecked() }) }
1728+
self.inner.next_checked()
17311729
}
17321730

17331731
fn last(mut self) -> Option<(&'a K, &'a V)> {
@@ -1777,12 +1775,6 @@ impl<K, V> ExactSizeIterator for ValuesMut<'_, K, V> {
17771775
#[stable(feature = "fused", since = "1.26.0")]
17781776
impl<K, V> FusedIterator for ValuesMut<'_, K, V> {}
17791777

1780-
impl<'a, K, V> Range<'a, K, V> {
1781-
unsafe fn next_unchecked(&mut self) -> (&'a K, &'a V) {
1782-
unsafe { self.inner.front.as_mut().unwrap_unchecked().next_unchecked() }
1783-
}
1784-
}
1785-
17861778
#[stable(feature = "map_into_keys_values", since = "1.54.0")]
17871779
impl<K, V> Iterator for IntoKeys<K, V> {
17881780
type Item = K;
@@ -1862,13 +1854,7 @@ impl<K, V> FusedIterator for IntoValues<K, V> {}
18621854
#[stable(feature = "btree_range", since = "1.17.0")]
18631855
impl<'a, K, V> DoubleEndedIterator for Range<'a, K, V> {
18641856
fn next_back(&mut self) -> Option<(&'a K, &'a V)> {
1865-
if self.inner.is_empty() { None } else { Some(unsafe { self.next_back_unchecked() }) }
1866-
}
1867-
}
1868-
1869-
impl<'a, K, V> Range<'a, K, V> {
1870-
unsafe fn next_back_unchecked(&mut self) -> (&'a K, &'a V) {
1871-
unsafe { self.inner.back.as_mut().unwrap_unchecked().next_back_unchecked() }
1857+
self.inner.next_back_checked()
18721858
}
18731859
}
18741860

@@ -1878,7 +1864,7 @@ impl<K, V> FusedIterator for Range<'_, K, V> {}
18781864
#[stable(feature = "btree_range", since = "1.17.0")]
18791865
impl<K, V> Clone for Range<'_, K, V> {
18801866
fn clone(&self) -> Self {
1881-
Range { inner: LeafRange { front: self.inner.front, back: self.inner.back } }
1867+
Range { inner: self.inner.clone() }
18821868
}
18831869
}
18841870

@@ -1887,7 +1873,7 @@ impl<'a, K, V> Iterator for RangeMut<'a, K, V> {
18871873
type Item = (&'a K, &'a mut V);
18881874

18891875
fn next(&mut self) -> Option<(&'a K, &'a mut V)> {
1890-
if self.inner.is_empty() { None } else { Some(unsafe { self.next_unchecked() }) }
1876+
self.inner.next_checked()
18911877
}
18921878

18931879
fn last(mut self) -> Option<(&'a K, &'a mut V)> {
@@ -1904,10 +1890,6 @@ impl<'a, K, V> Iterator for RangeMut<'a, K, V> {
19041890
}
19051891

19061892
impl<'a, K, V> RangeMut<'a, K, V> {
1907-
unsafe fn next_unchecked(&mut self) -> (&'a K, &'a mut V) {
1908-
unsafe { self.inner.front.as_mut().unwrap_unchecked().next_unchecked() }
1909-
}
1910-
19111893
/// Returns an iterator of references over the remaining items.
19121894
#[inline]
19131895
pub(super) fn iter(&self) -> Range<'_, K, V> {
@@ -1918,19 +1900,13 @@ impl<'a, K, V> RangeMut<'a, K, V> {
19181900
#[stable(feature = "btree_range", since = "1.17.0")]
19191901
impl<'a, K, V> DoubleEndedIterator for RangeMut<'a, K, V> {
19201902
fn next_back(&mut self) -> Option<(&'a K, &'a mut V)> {
1921-
if self.inner.is_empty() { None } else { Some(unsafe { self.next_back_unchecked() }) }
1903+
self.inner.next_back_checked()
19221904
}
19231905
}
19241906

19251907
#[stable(feature = "fused", since = "1.26.0")]
19261908
impl<K, V> FusedIterator for RangeMut<'_, K, V> {}
19271909

1928-
impl<'a, K, V> RangeMut<'a, K, V> {
1929-
unsafe fn next_back_unchecked(&mut self) -> (&'a K, &'a mut V) {
1930-
unsafe { self.inner.back.as_mut().unwrap_unchecked().next_back_unchecked() }
1931-
}
1932-
}
1933-
19341910
#[stable(feature = "rust1", since = "1.0.0")]
19351911
impl<K: Ord, V> FromIterator<(K, V)> for BTreeMap<K, V> {
19361912
fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> BTreeMap<K, V> {

0 commit comments

Comments
 (0)