Skip to content

Commit f1cf95e

Browse files
committed
Make RangeMut::next_unchecked() output a mutable key reference
1 parent 9d58198 commit f1cf95e

File tree

1 file changed

+11
-7
lines changed
  • src/liballoc/collections/btree

1 file changed

+11
-7
lines changed

src/liballoc/collections/btree/map.rs

+11-7
Original file line numberDiff line numberDiff line change
@@ -1359,7 +1359,10 @@ impl<'a, K: 'a, V: 'a> Iterator for IterMut<'a, K, V> {
13591359
None
13601360
} else {
13611361
self.length -= 1;
1362-
unsafe { Some(self.range.next_unchecked()) }
1362+
unsafe {
1363+
let (k, v) = self.range.next_unchecked();
1364+
Some((k, v)) // coerce k from `&mut K` to `&K`
1365+
}
13631366
}
13641367
}
13651368

@@ -1756,7 +1759,10 @@ impl<'a, K, V> Iterator for RangeMut<'a, K, V> {
17561759
if self.front == self.back {
17571760
None
17581761
} else {
1759-
unsafe { Some(self.next_unchecked()) }
1762+
unsafe {
1763+
let (k, v) = self.next_unchecked();
1764+
Some((k, v)) // coerce k from `&mut K` to `&K`
1765+
}
17601766
}
17611767
}
17621768

@@ -1766,16 +1772,15 @@ impl<'a, K, V> Iterator for RangeMut<'a, K, V> {
17661772
}
17671773

17681774
impl<'a, K, V> RangeMut<'a, K, V> {
1769-
unsafe fn next_unchecked(&mut self) -> (&'a K, &'a mut V) {
1775+
unsafe fn next_unchecked(&mut self) -> (&'a mut K, &'a mut V) {
17701776
let handle = ptr::read(&self.front);
17711777

17721778
let mut cur_handle = match handle.right_kv() {
17731779
Ok(kv) => {
17741780
self.front = ptr::read(&kv).right_edge();
17751781
// Doing the descend invalidates the references returned by `into_kv_mut`,
17761782
// so we have to do this last.
1777-
let (k, v) = kv.into_kv_mut();
1778-
return (k, v); // coerce k from `&mut K` to `&K`
1783+
return kv.into_kv_mut();
17791784
}
17801785
Err(last_edge) => {
17811786
let next_level = last_edge.into_node().ascend().ok();
@@ -1789,8 +1794,7 @@ impl<'a, K, V> RangeMut<'a, K, V> {
17891794
self.front = first_leaf_edge(ptr::read(&kv).right_edge().descend());
17901795
// Doing the descend invalidates the references returned by `into_kv_mut`,
17911796
// so we have to do this last.
1792-
let (k, v) = kv.into_kv_mut();
1793-
return (k, v); // coerce k from `&mut K` to `&K`
1797+
return kv.into_kv_mut();
17941798
}
17951799
Err(last_edge) => {
17961800
let next_level = last_edge.into_node().ascend().ok();

0 commit comments

Comments
 (0)