[pypy-svn] r49551 - in pypy/dist/pypy/rlib: . test
cfbolz at codespeak.net
cfbolz at codespeak.net
Sat Dec 8 15:27:44 CET 2007
Author: cfbolz
Date: Sat Dec 8 15:27:42 2007
New Revision: 49551
Modified:
pypy/dist/pypy/rlib/rope.py
pypy/dist/pypy/rlib/test/test_rope.py
Log:
introduce ways to iterate backward too
Modified: pypy/dist/pypy/rlib/rope.py
==============================================================================
--- pypy/dist/pypy/rlib/rope.py (original)
+++ pypy/dist/pypy/rlib/rope.py Sat Dec 8 15:27:42 2007
@@ -1005,6 +1005,17 @@
self.advance_index()
return result
+def make_seekable_method(resultgetter, backward=False):
+ if backward:
+ direction = -1
+ else:
+ direction = 1
+ def next(self):
+ node = self.getnode()
+ result = getattr(node, resultgetter)(self.index)
+ self.index += direction
+ return result
+ return next
class SeekableItemIterator(object):
def __init__(self, node):
@@ -1032,31 +1043,19 @@
self.index = items
return self.node
- def nextnode(self):
- self.seekforward(0)
-
def getnode(self):
- if self.index == self.node.length():
- self.nextnode()
+ if self.index == self.nodelength:
+ self.seekforward(0)
+ if self.index == -1:
+ self.seekback(0)
return self.node
- def nextchar(self):
- node = self.getnode()
- result = node.getchar(self.index)
- self.index += 1
- return result
-
- def nextunichar(self):
- node = self.getnode()
- result = node.getunichar(self.index)
- self.index += 1
- return result
-
- def nextint(self):
- node = self.getnode()
- result = node.getint(self.index)
- self.index += 1
- return result
+ nextchar = make_seekable_method("getchar")
+ nextunichar = make_seekable_method("getunichar")
+ nextint = make_seekable_method("getint")
+ lastchar = make_seekable_method("getchar", backward=True)
+ lastunichar = make_seekable_method("getunichar", backward=True)
+ lastint = make_seekable_method("getint", backward=True)
def seekforward(self, numchars):
if numchars < (self.nodelength - self.index):
Modified: pypy/dist/pypy/rlib/test/test_rope.py
==============================================================================
--- pypy/dist/pypy/rlib/test/test_rope.py (original)
+++ pypy/dist/pypy/rlib/test/test_rope.py Sat Dec 8 15:27:42 2007
@@ -390,6 +390,17 @@
assert c2 == c
py.test.raises(StopIteration, iter.nextchar)
+def test_iterbackward():
+ rope = BinaryConcatNode(BinaryConcatNode(LiteralStringNode("abc"),
+ LiteralStringNode("def")),
+ LiteralStringNode("ghi"))
+ iter = SeekableItemIterator(rope)
+ iter.seekforward(8)
+ for c in "abcdefghi"[::-1]:
+ c2 = iter.lastchar()
+ assert c2 == c
+ py.test.raises(StopIteration, iter.lastchar)
+
def test_find_int():
rope, st = make_random_string()
rope = getslice_one(rope, 10, 100)
More information about the Pypy-commit
mailing list