From 4e733c450b0cb188ea99b8053cf2add70a9910c1 Mon Sep 17 00:00:00 2001 From: Alexander Stromberger Date: Mon, 23 Aug 2021 23:45:57 +0200 Subject: [PATCH] added __add__ method to collections.deque --- Lib/test/test_deque.py | 2 -- vm/src/stdlib/collections.rs | 26 ++++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_deque.py b/Lib/test/test_deque.py index 006d3d6cc..e8102378b 100644 --- a/Lib/test/test_deque.py +++ b/Lib/test/test_deque.py @@ -204,8 +204,6 @@ class TestBasic(unittest.TestCase): d.extend(d) self.assertEqual(list(d), list('abcdabcd')) - # TODO: RUSTPYTHON - @unittest.expectedFailure def test_add(self): d = deque() e = deque('abc') diff --git a/vm/src/stdlib/collections.rs b/vm/src/stdlib/collections.rs index 210015934..80e1ef988 100644 --- a/vm/src/stdlib/collections.rs +++ b/vm/src/stdlib/collections.rs @@ -480,6 +480,32 @@ mod _collections { !self.borrow_deque().is_empty() } + #[pymethod(magic)] + fn add(&self, other: PyObjectRef, vm: &VirtualMachine) -> PyResult { + if let Some(o) = other.payload_if_subclass::(vm) { + let mut deque = self.borrow_deque().clone(); + let elements = o.borrow_deque().clone(); + deque.extend(elements); + + let skipped = self + .maxlen + .and_then(|maxlen| deque.len().checked_sub(maxlen)) + .unwrap_or(0); + deque.drain(0..skipped); + + Ok(PyDeque { + deque: PyRwLock::new(deque), + maxlen: self.maxlen, + state: AtomicCell::new(0), + }) + } else { + Err(vm.new_type_error(format!( + "can only concatenate deque (not \"{}\") to deque", + other.class().name + ))) + } + } + #[pymethod(magic)] fn iadd( zelf: PyRef,