[pypy-svn] pypy collections-module: pop(), popleft()

arigo commits-noreply at bitbucket.org
Tue Feb 15 16:02:44 CET 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: collections-module
Changeset: r41963:28a49a7dc3bb
Date: 2011-02-15 13:31 +0100
http://bitbucket.org/pypy/pypy/changeset/28a49a7dc3bb/

Log:	pop(), popleft()

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
@@ -121,6 +121,50 @@
             self.appendleft(w_obj)
 
     @unwrap_spec('self')
+    def pop(self):
+        if self.len == 0:
+            msg = "pop from an empty deque"
+            raise OperationError(self.space.w_IndexError, self.space.wrap(msg))
+        self.len -= 1
+        ri = self.rightindex
+        w_obj = self.rightblock.data[ri]
+        ri -= 1
+        if ri < 0:
+            if self.len == 0:
+                # re-center instead of freeing the last block
+                self.leftindex = CENTER + 1
+                ri = CENTER
+            else:
+                b = self.rightblock.leftlink
+                self.rightblock = b
+                b.rightlink = None
+                ri = BLOCKLEN - 1
+        self.rightindex = ri
+        return w_obj
+
+    @unwrap_spec('self')
+    def popleft(self):
+        if self.len == 0:
+            msg = "pop from an empty deque"
+            raise OperationError(self.space.w_IndexError, self.space.wrap(msg))
+        self.len -= 1
+        li = self.leftindex
+        w_obj = self.leftblock.data[li]
+        li += 1
+        if li >= BLOCKLEN:
+            if self.len == 0:
+                # re-center instead of freeing the last block
+                li = CENTER + 1
+                self.rightindex = CENTER
+            else:
+                b = self.leftblock.rightlink
+                self.leftblock = b
+                b.leftlink = None
+                li = 0
+        self.leftindex = li
+        return w_obj
+
+    @unwrap_spec('self')
     def iter(self):
         return W_DequeIter(self)
 
@@ -143,6 +187,8 @@
     clear      = interp2app(W_Deque.clear),
     extend     = interp2app(W_Deque.extend),
     extendleft = interp2app(W_Deque.extendleft),
+    pop        = interp2app(W_Deque.pop),
+    popleft    = interp2app(W_Deque.popleft),
     __weakref__ = make_weakref_descr(W_Deque),
     __iter__ = interp2app(W_Deque.iter),
     __len__ = interp2app(W_Deque.length),


More information about the Pypy-commit mailing list