# Substrings of a Rope (i.e. Reverse postfix iterator on leaves)
private class ReverseRopeSubstrings
- super IndexedIterator[String]
+ super IndexedIterator[FlatString]
# Visit Stack
- var iter: RopeIterPiece is noinit
+ var iter: RopeCharIteratorPiece is noinit
# Position in `Rope`
var pos: Int is noinit
# Current leaf
- var str: String is noinit
+ var str: FlatString is noinit
init(root: Concat) is old_style_init do
- var r = new RopeIterPiece(root, false, true, null)
+ var r = new RopeCharIteratorPiece(root, false, true, null)
pos = root.length - 1
var lnod: String = root
loop
if lnod isa Concat then
lnod = lnod.right
- r = new RopeIterPiece(lnod, false, true, r)
+ r = new RopeCharIteratorPiece(lnod, false, true, r)
else
- str = lnod
+ str = lnod.as(FlatString)
iter = r
break
end
end
init from(root: Concat, pos: Int) do
- var r = new RopeIterPiece(root, false, true, null)
+ var r = new RopeCharIteratorPiece(root, false, true, null)
var rnod: String = root
var off = pos
loop
if off >= rnod.left.length then
off -= rnod.left.length
rnod = rnod.right
- r = new RopeIterPiece(rnod, false, true, r)
+ r = new RopeCharIteratorPiece(rnod, false, true, r)
else
r.ldone = true
rnod = rnod.left
- r = new RopeIterPiece(rnod, false, true, r)
+ r = new RopeCharIteratorPiece(rnod, false, true, r)
end
else
- str = rnod
+ str = rnod.as(FlatString)
r.ldone = true
iter = r
self.pos = pos - off
while curr != null do
currit = curr.node
if not currit isa Concat then
- str = currit
+ str = currit.as(FlatString)
pos -= str.length
iter = curr
return
end
if not curr.rdone then
curr.rdone = true
- curr = new RopeIterPiece(currit.right, false, false, curr)
+ curr = new RopeCharIteratorPiece(currit.right, false, false, curr)
continue
end
if not curr.ldone then
curr.ldone = true
- curr = new RopeIterPiece(currit.left, false, false, curr)
+ curr = new RopeCharIteratorPiece(currit.left, false, false, curr)
continue
end
curr = curr.prev
super IndexedIterator[FlatString]
# Visit Stack
- var iter: RopeIterPiece is noinit
+ var iter: RopeCharIteratorPiece is noinit
# Position in `Rope`
var pos: Int is noinit
# Maximum position in `Rope` (i.e. length - 1)
var str: FlatString is noinit
init(root: Concat) is old_style_init do
- var r = new RopeIterPiece(root, true, false, null)
+ var r = new RopeCharIteratorPiece(root, true, false, null)
pos = 0
max = root.length - 1
var rnod: String = root
loop
if rnod isa Concat then
rnod = rnod.left
- r = new RopeIterPiece(rnod, true, false, r)
+ r = new RopeCharIteratorPiece(rnod, true, false, r)
else
str = rnod.as(FlatString)
r.rdone = true
end
init from(root: Concat, pos: Int) do
- var r = new RopeIterPiece(root, true, false, null)
+ var r = new RopeCharIteratorPiece(root, true, false, null)
max = root.length - 1
var rnod: String = root
var off = pos
r.rdone = true
off -= rnod.left.length
rnod = rnod.right
- r = new RopeIterPiece(rnod, true, false, r)
+ r = new RopeCharIteratorPiece(rnod, true, false, r)
else
rnod = rnod.left
- r = new RopeIterPiece(rnod, true, false, r)
+ r = new RopeCharIteratorPiece(rnod, true, false, r)
end
else
str = rnod.as(FlatString)
if not it.ldone then
rnod = rnod.left
it.ldone = true
- it = new RopeIterPiece(rnod, false, false, it)
+ it = new RopeCharIteratorPiece(rnod, false, false, it)
else if not it.rdone then
it.rdone = true
rnod = rnod.right
- it = new RopeIterPiece(rnod, false, false, it)
+ it = new RopeCharIteratorPiece(rnod, false, false, it)
else
it = it.prev
rnod = it.node