From 99908e6d3e6a642445f8b6b4a8e7ceebf3dabf64 Mon Sep 17 00:00:00 2001 From: Connor Troy Date: Mon, 6 Sep 2021 00:14:26 -0600 Subject: [PATCH] Add deque imul method --- vm/src/stdlib/collections.rs | 39 +++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/vm/src/stdlib/collections.rs b/vm/src/stdlib/collections.rs index a4446ed2c..e9b4b0c37 100644 --- a/vm/src/stdlib/collections.rs +++ b/vm/src/stdlib/collections.rs @@ -59,9 +59,9 @@ mod _collections { } } - struct SimpleSeqDeque<'a>(PyRwLockReadGuard<'a, VecDeque>); + struct SimpleSeqDeque(VecDeque); - impl sequence::SimpleSeq for SimpleSeqDeque<'_> { + impl sequence::SimpleSeq for SimpleSeqDeque { fn len(&self) -> usize { self.0.len() } @@ -71,9 +71,21 @@ mod _collections { } } - impl<'a> From>> for SimpleSeqDeque<'a> { - fn from(from: PyRwLockReadGuard<'a, VecDeque>) -> Self { - Self(from) + impl From> for SimpleSeqDeque { + fn from(deque: VecDeque) -> Self { + Self(deque) + } + } + + impl From>> for SimpleSeqDeque { + fn from(deque: PyRwLockReadGuard<'_, VecDeque>) -> Self { + Self(deque.clone()) + } + } + + impl From>> for SimpleSeqDeque { + fn from(deque: PyRwLockWriteGuard<'_, VecDeque>) -> Self { + Self(deque.clone()) } } @@ -471,6 +483,23 @@ mod _collections { }) } + #[pymethod(magic)] + fn imul(zelf: PyRef, value: isize, vm: &VirtualMachine) -> PyResult> { + let mut deque = zelf.borrow_deque_mut(); + let seq: SimpleSeqDeque = deque.clone().into(); + let mul = sequence::seq_mul(vm, &seq, value)?; + + let skipped = zelf + .maxlen + .and_then(|maxlen| mul.len().checked_sub(maxlen)) + .unwrap_or(0); + + let mut new_deque: VecDeque = mul.skip(skipped).cloned().collect(); + std::mem::swap(&mut *deque, &mut new_deque); + drop(deque); + Ok(zelf) + } + #[pymethod(magic)] fn len(&self) -> usize { self.borrow_deque().len()