Skip to content

Commit 06c4127

Browse files
authored
Merge pull request RustPython#2910 from RustPython/coolreader18/pop_back-3
Further clarify pop_back using iterator adaptors
2 parents 5ad0235 + 7979401 commit 06c4127

File tree

1 file changed

+7
-14
lines changed

1 file changed

+7
-14
lines changed

vm/src/dictdatatype.rs

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -600,22 +600,15 @@ impl<T: Clone> Dict<T> {
600600
}
601601

602602
pub fn pop_back(&self) -> Option<(PyObjectRef, T)> {
603-
let mut inner = self.write();
604-
let mut idx = inner.next_new_entry_idx.checked_sub(1)?;
605-
let entry = loop {
606-
if let Some(entry) = inner.entries.get_mut(idx) {
607-
if entry.is_some() {
608-
break entry;
609-
}
610-
}
611-
idx = idx.checked_sub(1)?;
612-
};
613-
614-
let entry = std::mem::take(entry).unwrap();
615-
603+
let mut inner = &mut *self.write();
604+
let (entry_idx, entry) = inner.entries[..inner.next_new_entry_idx]
605+
.iter_mut()
606+
.enumerate()
607+
.rev()
608+
.find_map(|(i, entry)| entry.take().map(|e| (i, e)))?;
616609
inner.used -= 1;
617610
inner.indices[entry.index] = IndexEntry::DUMMY;
618-
inner.next_new_entry_idx = idx;
611+
inner.next_new_entry_idx = entry_idx;
619612
Some((entry.key, entry.value))
620613
}
621614

0 commit comments

Comments
 (0)