[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