Skip to content

Commit 35d02e2

Browse files
committed
BTree: lazily locate leaves in rangeless iterators
1 parent aa65b08 commit 35d02e2

File tree

2 files changed

+171
-68
lines changed

2 files changed

+171
-68
lines changed

library/alloc/src/collections/btree/map.rs

+26-31
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use core::ops::{Index, RangeBounds};
99
use core::ptr;
1010

1111
use super::borrow::DormantMutRef;
12-
use super::navigate::LeafRange;
12+
use super::navigate::{LazyLeafRange, LeafRange};
1313
use super::node::{self, marker, ForceResult::*, Handle, NodeRef, Root};
1414
use super::search::SearchResult::*;
1515

@@ -278,7 +278,7 @@ where
278278
/// [`iter`]: BTreeMap::iter
279279
#[stable(feature = "rust1", since = "1.0.0")]
280280
pub struct Iter<'a, K: 'a, V: 'a> {
281-
range: Range<'a, K, V>,
281+
range: LazyLeafRange<marker::Immut<'a>, K, V>,
282282
length: usize,
283283
}
284284

@@ -296,10 +296,20 @@ impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for Iter<'_, K, V> {
296296
///
297297
/// [`iter_mut`]: BTreeMap::iter_mut
298298
#[stable(feature = "rust1", since = "1.0.0")]
299-
#[derive(Debug)]
300299
pub struct IterMut<'a, K: 'a, V: 'a> {
301-
range: RangeMut<'a, K, V>,
300+
range: LazyLeafRange<marker::ValMut<'a>, K, V>,
302301
length: usize,
302+
303+
// Be invariant in `K` and `V`
304+
_marker: PhantomData<&'a mut (K, V)>,
305+
}
306+
307+
#[stable(feature = "collection_debug", since = "1.17.0")]
308+
impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for IterMut<'_, K, V> {
309+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
310+
let range = Iter { range: self.range.reborrow(), length: self.length };
311+
f.debug_list().entries(range).finish()
312+
}
303313
}
304314

305315
/// An owning iterator over the entries of a `BTreeMap`.
@@ -310,16 +320,15 @@ pub struct IterMut<'a, K: 'a, V: 'a> {
310320
/// [`into_iter`]: IntoIterator::into_iter
311321
#[stable(feature = "rust1", since = "1.0.0")]
312322
pub struct IntoIter<K, V> {
313-
range: LeafRange<marker::Dying, K, V>,
323+
range: LazyLeafRange<marker::Dying, K, V>,
314324
length: usize,
315325
}
316326

317327
impl<K, V> IntoIter<K, V> {
318328
/// Returns an iterator of references over the remaining items.
319329
#[inline]
320330
pub(super) fn iter(&self) -> Iter<'_, K, V> {
321-
let range = Range { inner: self.range.reborrow() };
322-
Iter { range: range, length: self.length }
331+
Iter { range: self.range.reborrow(), length: self.length }
323332
}
324333
}
325334

@@ -1298,7 +1307,7 @@ impl<'a, K: 'a, V: 'a> Iterator for Iter<'a, K, V> {
12981307
None
12991308
} else {
13001309
self.length -= 1;
1301-
Some(unsafe { self.range.inner.next_unchecked() })
1310+
Some(unsafe { self.range.next_unchecked() })
13021311
}
13031312
}
13041313

@@ -1329,7 +1338,7 @@ impl<'a, K: 'a, V: 'a> DoubleEndedIterator for Iter<'a, K, V> {
13291338
None
13301339
} else {
13311340
self.length -= 1;
1332-
Some(unsafe { self.range.inner.next_back_unchecked() })
1341+
Some(unsafe { self.range.next_back_unchecked() })
13331342
}
13341343
}
13351344
}
@@ -1367,7 +1376,7 @@ impl<'a, K: 'a, V: 'a> Iterator for IterMut<'a, K, V> {
13671376
None
13681377
} else {
13691378
self.length -= 1;
1370-
Some(unsafe { self.range.inner.next_unchecked() })
1379+
Some(unsafe { self.range.next_unchecked() })
13711380
}
13721381
}
13731382

@@ -1395,7 +1404,7 @@ impl<'a, K: 'a, V: 'a> DoubleEndedIterator for IterMut<'a, K, V> {
13951404
None
13961405
} else {
13971406
self.length -= 1;
1398-
Some(unsafe { self.range.inner.next_back_unchecked() })
1407+
Some(unsafe { self.range.next_back_unchecked() })
13991408
}
14001409
}
14011410
}
@@ -1414,7 +1423,7 @@ impl<'a, K, V> IterMut<'a, K, V> {
14141423
/// Returns an iterator of references over the remaining items.
14151424
#[inline]
14161425
pub(super) fn iter(&self) -> Iter<'_, K, V> {
1417-
Iter { range: self.range.iter(), length: self.length }
1426+
Iter { range: self.range.reborrow(), length: self.length }
14181427
}
14191428
}
14201429

@@ -1430,7 +1439,7 @@ impl<K, V> IntoIterator for BTreeMap<K, V> {
14301439

14311440
IntoIter { range: full_range, length: me.length }
14321441
} else {
1433-
IntoIter { range: LeafRange::none(), length: 0 }
1442+
IntoIter { range: LazyLeafRange::none(), length: 0 }
14341443
}
14351444
}
14361445
}
@@ -1888,14 +1897,6 @@ impl<'a, K, V> Iterator for RangeMut<'a, K, V> {
18881897
}
18891898
}
18901899

1891-
impl<'a, K, V> RangeMut<'a, K, V> {
1892-
/// Returns an iterator of references over the remaining items.
1893-
#[inline]
1894-
pub(super) fn iter(&self) -> Range<'_, K, V> {
1895-
Range { inner: self.inner.reborrow() }
1896-
}
1897-
}
1898-
18991900
#[stable(feature = "btree_range", since = "1.17.0")]
19001901
impl<'a, K, V> DoubleEndedIterator for RangeMut<'a, K, V> {
19011902
fn next_back(&mut self) -> Option<(&'a K, &'a mut V)> {
@@ -2038,9 +2039,9 @@ impl<K, V> BTreeMap<K, V> {
20382039
if let Some(root) = &self.root {
20392040
let full_range = root.reborrow().full_range();
20402041

2041-
Iter { range: Range { inner: full_range }, length: self.length }
2042+
Iter { range: full_range, length: self.length }
20422043
} else {
2043-
Iter { range: Range { inner: LeafRange::none() }, length: 0 }
2044+
Iter { range: LazyLeafRange::none(), length: 0 }
20442045
}
20452046
}
20462047

@@ -2070,15 +2071,9 @@ impl<K, V> BTreeMap<K, V> {
20702071
if let Some(root) = &mut self.root {
20712072
let full_range = root.borrow_valmut().full_range();
20722073

2073-
IterMut {
2074-
range: RangeMut { inner: full_range, _marker: PhantomData },
2075-
length: self.length,
2076-
}
2074+
IterMut { range: full_range, length: self.length, _marker: PhantomData }
20772075
} else {
2078-
IterMut {
2079-
range: RangeMut { inner: LeafRange::none(), _marker: PhantomData },
2080-
length: 0,
2081-
}
2076+
IterMut { range: LazyLeafRange::none(), length: 0, _marker: PhantomData }
20822077
}
20832078
}
20842079

0 commit comments

Comments
 (0)