[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