[pypy-commit] pypy py3.5: test + impl deque.insert

plan_rich pypy.commits at gmail.com
Mon Oct 10 10:55:38 EDT 2016


Author: Richard Plangger <planrichi at gmail.com>
Branch: py3.5
Changeset: r87693:3458326c0cc4
Date: 2016-10-10 16:54 +0200
http://bitbucket.org/pypy/pypy/changeset/3458326c0cc4/

Log:	test + impl deque.insert

diff --git a/pypy/module/_collections/interp_deque.py b/pypy/module/_collections/interp_deque.py
--- a/pypy/module/_collections/interp_deque.py
+++ b/pypy/module/_collections/interp_deque.py
@@ -363,6 +363,25 @@
                     raise
         raise oefmt(space.w_ValueError, "%R is not in deque", w_x)
 
+    @unwrap_spec(index=int)
+    def insert(self, index, w_value):
+        space = self.space
+        n = space.len_w(self)
+        if n == self.maxlen:
+            raise oefmt(space.w_IndexError, "deque already at its maximum size")
+
+        if index >= n:
+            self.append(w_value)
+        if index <= -n or index == 0:
+            self.appendleft(w_value)
+
+        self.rotate(-index)
+        if index < 0:
+            self.append(w_value)
+        else:
+            self.appendleft(w_value)
+        self.rotate(index)
+
     def reviter(self):
         "Return a reverse iterator over the deque."
         return W_DequeRevIter(self)
@@ -529,6 +548,7 @@
     extend     = interp2app(W_Deque.extend),
     extendleft = interp2app(W_Deque.extendleft),
     index      = interp2app(W_Deque.index),
+    insert     = interp2app(W_Deque.insert),
     pop        = interp2app(W_Deque.pop),
     popleft    = interp2app(W_Deque.popleft),
     remove     = interp2app(W_Deque.remove),
diff --git a/pypy/module/_collections/test/test_deque.py b/pypy/module/_collections/test/test_deque.py
--- a/pypy/module/_collections/test/test_deque.py
+++ b/pypy/module/_collections/test/test_deque.py
@@ -339,14 +339,26 @@
         copy = pickle.loads(pickle.dumps(iterator))
         assert list(iterator) == list(copy)
 
-    def test_queue_mul(self):
+    def test_deque_mul(self):
         from _collections import deque
         d = deque([1,2,3])
         assert d*3 == deque([1,2,3]*3)
 
-    def test_queue_imul(self):
+    def test_deque_imul(self):
         from _collections import deque
         d = deque([1,2,3])
         d *= 3
         assert d == deque([1,2,3]*3)
         assert d is not deque([1,2,3]*3)
+
+    def test_deque_insert(self):
+        from _collections import deque
+        for i in range(0,11):
+            d = deque(range(10))
+            d.insert(i, 'a')
+            assert 'a' in d
+            assert 'b' not in d
+            assert d.index('a') == i
+        d = deque(range(10))
+        d.insert(-1, 500)
+        assert d.index(500) == 9


More information about the pypy-commit mailing list