[pypy-svn] r15858 - pypy/dist/pypy/lib
pedronis at codespeak.net
pedronis at codespeak.net
Tue Aug 9 19:58:56 CEST 2005
Author: pedronis
Date: Tue Aug 9 19:58:55 2005
New Revision: 15858
Removed:
pypy/dist/pypy/lib/collections.py
Log:
removing for reverting
Deleted: /pypy/dist/pypy/lib/collections.py
==============================================================================
--- /pypy/dist/pypy/lib/collections.py Tue Aug 9 19:58:55 2005
+++ (empty file)
@@ -1,284 +0,0 @@
-"""High performance data structures
-"""
-#
-# Copied and completed from the sandbox of CPython
-# (nondist/sandbox/collections/pydeque.py rev 1.1, Raymond Hettinger)
-#
-
-import operator
-try:
- from thread import get_ident as _thread_ident
-except ImportError:
- def _thread_ident():
- return -1
-
-
-n = 30
-LFTLNK = n
-RGTLNK = n+1
-BLOCKSIZ = n+2
-
-class deque(object):
-
- def __new__(cls, iterable=()):
- self = super(deque, cls).__new__(cls)
- self.clear()
- return self
-
- def __init__(self, iterable=()):
- add = self.append
- for elem in iterable:
- add(elem)
-
- def clear(self):
- self.right = self.left = [None] * BLOCKSIZ
- self.rightndx = n//2 # points to last written element
- self.leftndx = n//2+1
-
- def append(self, x):
- self.rightndx += 1
- if self.rightndx == n:
- newblock = [None] * BLOCKSIZ
- self.right[RGTLNK] = newblock
- newblock[LFTLNK] = self.right
- self.right = newblock
- self.rightndx = 0
- self.right[self.rightndx] = x
-
- def appendleft(self, x):
- self.leftndx -= 1
- if self.leftndx == -1:
- newblock = [None] * BLOCKSIZ
- self.left[LFTLNK] = newblock
- newblock[RGTLNK] = self.left
- self.left = newblock
- self.leftndx = n-1
- self.left[self.leftndx] = x
-
- def extend(self, iterable):
- for elem in iterable:
- self.append(elem)
-
- def extendleft(self, iterable):
- for elem in iterable:
- self.appendleft(elem)
-
- def pop(self):
- if self.left is self.right and self.leftndx > self.rightndx:
- raise IndexError, "pop from an empty deque"
- x = self.right[self.rightndx]
- self.right[self.rightndx] = None
- self.rightndx -= 1
- if self.rightndx == -1:
- prevblock = self.right[LFTLNK]
- if prevblock is None:
- # the deque has become empty; recenter instead of freeing block
- self.rightndx = n//2
- self.leftndx = n//2+1
- else:
- prevblock[RGTLNK] = None
- self.right[LFTLNK] = None
- self.right = prevblock
- self.rightndx = n-1
- return x
-
- def popleft(self):
- if self.left is self.right and self.leftndx > self.rightndx:
- raise IndexError, "pop from an empty deque"
- x = self.left[self.leftndx]
- self.left[self.leftndx] = None
- self.leftndx += 1
- if self.leftndx == n:
- prevblock = self.left[RGTLNK]
- if prevblock is None:
- # the deque has become empty; recenter instead of freeing block
- self.rightndx = n//2
- self.leftndx = n//2+1
- else:
- prevblock[LFTLNK] = None
- self.left[RGTLNK] = None
- self.left = prevblock
- self.leftndx = 0
- return x
-
- def remove(self, value):
- del self[operator.indexOf(self, value)]
-
- def rotate(self, n=1):
- length = len(self)
- if length == 0:
- return
- halflen = (length+1) >> 1
- if n > halflen or n < -halflen:
- n %= length
- if n > halflen:
- n -= length
- elif n < -halflen:
- n += length
- while n > 0:
- self.appendleft(self.pop())
- n -= 1
- while n < 0:
- self.append(self.popleft())
- n += 1
-
- def __repr__(self):
- threadlocalattr = '__repr' + str(_thread_ident())
- if threadlocalattr in self.__dict__:
- return 'deque([...])'
- else:
- self.__dict__[threadlocalattr] = True
- try:
- return 'deque(%r)' % (list(self),)
- finally:
- del self.__dict__[threadlocalattr]
-
- def __iter__(self):
- return dequeIterator(self)
-
-
- def __reversed__(self):
- return dequeIterator(self,True)
-
- def __len__(self):
- sum = 0
- block = self.left
- while block:
- sum += n
- block = block[RGTLNK]
- return sum + self.rightndx - self.leftndx + 1 - n
-
- def __getref(self, index):
- if index >= 0:
- block = self.left
- while block:
- l, r = 0, n
- if block is self.left:
- l = self.leftndx
- if block is self.right:
- r = self.rightndx + 1
- span = r-l
- if index < span:
- return block, l+index
- index -= span
- block = block[RGTLNK]
- else:
- block = self.right
- while block:
- l, r = 0, n
- if block is self.left:
- l = self.leftndx
- if block is self.right:
- r = self.rightndx + 1
- negative_span = l-r
- if index >= negative_span:
- return block, r+index
- index -= negative_span
- block = block[LFTLNK]
- raise IndexError("deque index out of range")
-
- def __getitem__(self, index):
- block, index = self.__getref(index)
- return block[index]
-
- def __setitem__(self, index, value):
- block, index = self.__getref(index)
- block[index] = value
-
- def __delitem__(self, index):
- length = len(self)
- if index >= 0:
- if index >= length:
- raise IndexError("deque index out of range")
- self.rotate(-index)
- self.popleft()
- self.rotate(index)
- else:
- index = ~index
- if index >= length:
- raise IndexError("deque index out of range")
- self.rotate(index)
- self.pop()
- self.rotate(-index)
-
- def __reduce_ex__(self, proto):
- return type(self), (), self.__dict__, iter(self), None
-
- def __hash__(self):
- raise TypeError, "deque objects are unhashable"
-
- def __copy__(self):
- return self.__class__(self)
-
- # XXX make comparison more efficient
- def __eq__(self, other):
- if isinstance(other, deque):
- return list(self) == list(other)
- else:
- return NotImplemented
-
- def __ne__(self, other):
- if isinstance(other, deque):
- return list(self) != list(other)
- else:
- return NotImplemented
-
- def __lt__(self, other):
- if isinstance(other, deque):
- return list(self) < list(other)
- else:
- return NotImplemented
-
- def __le__(self, other):
- if isinstance(other, deque):
- return list(self) <= list(other)
- else:
- return NotImplemented
-
- def __gt__(self, other):
- if isinstance(other, deque):
- return list(self) > list(other)
- else:
- return NotImplemented
-
- def __ge__(self, other):
- if isinstance(other, deque):
- return list(self) >= list(other)
- else:
- return NotImplemented
-
-class dequeIterator:
-
- def __init__(self, dequeobj, reverse=False):
- self.deque = dequeobj
- self.length = len(dequeobj)
- self.consumed = 0
- if reverse:
- self.index = self.length-1
- self.inc = -1
- else:
- self.index = 0
- self.inc = 1
- self.reverse = reverse
-
- def __iter__(self):
- return self
-
- def next(self):
- if self.length == len(self.deque):
- if self.index < self.length and self.index >= 0:
- res = self.deque[self.index]
- self.index += self.inc
- self.consumed += 1
- return res
- else:
- raise StopIteration
- else:
- self.deque = []
- self.index = 0
- self.length = self.consumed = 0
- raise RuntimeError("deque mutated during iteration")
-
- def __len__(self):
- return self.length - self.consumed
-
\ No newline at end of file
More information about the Pypy-commit
mailing list