Skip to content

Commit 342aa69

Browse files
committed
BTree: move more shared iterator code into navigate.rs
1 parent 9503ea1 commit 342aa69

File tree

2 files changed

+67
-98
lines changed

2 files changed

+67
-98
lines changed

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

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

1111
use super::borrow::DormantMutRef;
12+
use super::navigate::LeafRange;
1213
use super::node::{self, marker, ForceResult::*, Handle, NodeRef, Root};
1314
use super::search::SearchResult::*;
1415

@@ -307,20 +308,15 @@ pub struct IterMut<'a, K: 'a, V: 'a> {
307308
/// [`into_iter`]: IntoIterator::into_iter
308309
#[stable(feature = "rust1", since = "1.0.0")]
309310
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>,
312312
length: usize,
313313
}
314314

315315
impl<K, V> IntoIter<K, V> {
316316
/// Returns an iterator of references over the remaining items.
317317
#[inline]
318318
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() };
324320
Iter { range: range, length: self.length }
325321
}
326322
}
@@ -438,8 +434,7 @@ impl<K, V: fmt::Debug> fmt::Debug for IntoValues<K, V> {
438434
/// [`range`]: BTreeMap::range
439435
#[stable(feature = "btree_range", since = "1.17.0")]
440436
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>,
443438
}
444439

445440
#[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> {
457452
/// [`range_mut`]: BTreeMap::range_mut
458453
#[stable(feature = "btree_range", since = "1.17.0")]
459454
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>,
462456

463457
// Be invariant in `K` and `V`
464458
_marker: PhantomData<&'a mut (K, V)>,
@@ -467,10 +461,7 @@ pub struct RangeMut<'a, K: 'a, V: 'a> {
467461
#[stable(feature = "collection_debug", since = "1.17.0")]
468462
impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for RangeMut<'_, K, V> {
469463
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() };
474465
f.debug_list().entries(range).finish()
475466
}
476467
}
@@ -1018,11 +1009,9 @@ impl<K, V> BTreeMap<K, V> {
10181009
R: RangeBounds<T>,
10191010
{
10201011
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) }
10241013
} else {
1025-
Range { front: None, back: None }
1014+
Range { inner: LeafRange::none() }
10261015
}
10271016
}
10281017

@@ -1064,11 +1053,9 @@ impl<K, V> BTreeMap<K, V> {
10641053
R: RangeBounds<T>,
10651054
{
10661055
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 }
10701057
} else {
1071-
RangeMut { front: None, back: None, _marker: PhantomData }
1058+
RangeMut { inner: LeafRange::none(), _marker: PhantomData }
10721059
}
10731060
}
10741061

@@ -1407,11 +1394,11 @@ impl<K, V> IntoIterator for BTreeMap<K, V> {
14071394
fn into_iter(self) -> IntoIter<K, V> {
14081395
let mut me = ManuallyDrop::new(self);
14091396
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();
14111398

1412-
IntoIter { front: Some(f), back: Some(b), length: me.length }
1399+
IntoIter { range: full_range, length: me.length }
14131400
} else {
1414-
IntoIter { front: None, back: None, length: 0 }
1401+
IntoIter { range: LeafRange::none(), length: 0 }
14151402
}
14161403
}
14171404
}
@@ -1450,7 +1437,7 @@ impl<K, V> Drop for Dropper<K, V> {
14501437
#[stable(feature = "btree_drop", since = "1.7.0")]
14511438
impl<K, V> Drop for IntoIter<K, V> {
14521439
fn drop(&mut self) {
1453-
if let Some(front) = self.front.take() {
1440+
if let Some(front) = self.range.front.take() {
14541441
Dropper { front, remaining_length: self.length };
14551442
}
14561443
}
@@ -1465,7 +1452,7 @@ impl<K, V> Iterator for IntoIter<K, V> {
14651452
None
14661453
} else {
14671454
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() })
14691456
}
14701457
}
14711458

@@ -1481,7 +1468,7 @@ impl<K, V> DoubleEndedIterator for IntoIter<K, V> {
14811468
None
14821469
} else {
14831470
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() })
14851472
}
14861473
}
14871474
}
@@ -1698,7 +1685,7 @@ impl<'a, K, V> Iterator for Range<'a, K, V> {
16981685
type Item = (&'a K, &'a V);
16991686

17001687
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() }) }
17021689
}
17031690

17041691
fn last(mut self) -> Option<(&'a K, &'a V)> {
@@ -1749,12 +1736,8 @@ impl<K, V> ExactSizeIterator for ValuesMut<'_, K, V> {
17491736
impl<K, V> FusedIterator for ValuesMut<'_, K, V> {}
17501737

17511738
impl<'a, K, V> Range<'a, K, V> {
1752-
fn is_empty(&self) -> bool {
1753-
self.front == self.back
1754-
}
1755-
17561739
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() }
17581741
}
17591742
}
17601743

@@ -1837,13 +1820,13 @@ impl<K, V> FusedIterator for IntoValues<K, V> {}
18371820
#[stable(feature = "btree_range", since = "1.17.0")]
18381821
impl<'a, K, V> DoubleEndedIterator for Range<'a, K, V> {
18391822
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() }) }
18411824
}
18421825
}
18431826

18441827
impl<'a, K, V> Range<'a, K, V> {
18451828
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() }
18471830
}
18481831
}
18491832

@@ -1853,7 +1836,7 @@ impl<K, V> FusedIterator for Range<'_, K, V> {}
18531836
#[stable(feature = "btree_range", since = "1.17.0")]
18541837
impl<K, V> Clone for Range<'_, K, V> {
18551838
fn clone(&self) -> Self {
1856-
Range { front: self.front, back: self.back }
1839+
Range { inner: LeafRange { front: self.inner.front, back: self.inner.back } }
18571840
}
18581841
}
18591842

@@ -1862,7 +1845,7 @@ impl<'a, K, V> Iterator for RangeMut<'a, K, V> {
18621845
type Item = (&'a K, &'a mut V);
18631846

18641847
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() }) }
18661849
}
18671850

18681851
fn last(mut self) -> Option<(&'a K, &'a mut V)> {
@@ -1879,28 +1862,21 @@ impl<'a, K, V> Iterator for RangeMut<'a, K, V> {
18791862
}
18801863

18811864
impl<'a, K, V> RangeMut<'a, K, V> {
1882-
fn is_empty(&self) -> bool {
1883-
self.front == self.back
1884-
}
1885-
18861865
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() }
18881867
}
18891868

18901869
/// Returns an iterator of references over the remaining items.
18911870
#[inline]
18921871
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() }
18971873
}
18981874
}
18991875

19001876
#[stable(feature = "btree_range", since = "1.17.0")]
19011877
impl<'a, K, V> DoubleEndedIterator for RangeMut<'a, K, V> {
19021878
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() }) }
19041880
}
19051881
}
19061882

@@ -1909,7 +1885,7 @@ impl<K, V> FusedIterator for RangeMut<'_, K, V> {}
19091885

19101886
impl<'a, K, V> RangeMut<'a, K, V> {
19111887
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() }
19131889
}
19141890
}
19151891

@@ -2043,11 +2019,11 @@ impl<K, V> BTreeMap<K, V> {
20432019
#[stable(feature = "rust1", since = "1.0.0")]
20442020
pub fn iter(&self) -> Iter<'_, K, V> {
20452021
if let Some(root) = &self.root {
2046-
let (f, b) = root.reborrow().full_range();
2022+
let full_range = root.reborrow().full_range();
20472023

2048-
Iter { range: Range { front: Some(f), back: Some(b) }, length: self.length }
2024+
Iter { range: Range { inner: full_range }, length: self.length }
20492025
} else {
2050-
Iter { range: Range { front: None, back: None }, length: 0 }
2026+
Iter { range: Range { inner: LeafRange::none() }, length: 0 }
20512027
}
20522028
}
20532029

@@ -2075,14 +2051,17 @@ impl<K, V> BTreeMap<K, V> {
20752051
#[stable(feature = "rust1", since = "1.0.0")]
20762052
pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
20772053
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();
20792055

20802056
IterMut {
2081-
range: RangeMut { front: Some(f), back: Some(b), _marker: PhantomData },
2057+
range: RangeMut { inner: full_range, _marker: PhantomData },
20822058
length: self.length,
20832059
}
20842060
} 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+
}
20862065
}
20872066
}
20882067

0 commit comments

Comments
 (0)