private fun leaves(from: Int): LeavesIterator do return new LeavesIterator(self, from)
# Iterator on the substrings from 0, in forward order
- fun substrings: IndexedIterator[Text] do return new SubstringsIterator(self, 0)
+ redef fun substrings do return new SubstringsIterator(self, 0)
# Iterator on the substrings, starting at position `from`, in forward order
fun substrings_from(from: Int): IndexedIterator[Text] do return new SubstringsIterator(self, from)
redef fun empty do return once new RopeString.from("")
+ redef var chars: SequenceRead[Char] = new RopeStringChars(self)
+
redef fun reversed
do
var ret = empty.as(RopeString)
end
# Inserts a String `str` at position `pos`
- fun insert_at(str: String, pos: Int): RopeString
+ redef fun insert_at(str, pos)
do
if str.length == 0 then return self
if self.length == 0 then return new RopeString.from(str)
var l_half = s.substring(0, s.length - path.offset)
var r_half = s.substring_from(s.length - path.offset)
var cct = new Concat
- cct.right = new Leaf(r_half)
- last_concat.left = new Leaf(l_half)
+ cct.right = new Leaf(r_half.as(FlatString))
+ last_concat.left = new Leaf(l_half.as(FlatString))
if str isa FlatString then last_concat.right = new Leaf(str) else last_concat.right = str.as(RopeString).root
cct.left = last_concat
last_concat = cct
end
# Adds `s` at the beginning of self
- fun prepend(s: String): String do return insert_at(s, 0)
+ redef fun prepend(s) do return insert_at(s, 0)
# Adds `s` at the end of self
- fun append(s: String): String
+ redef fun append(s)
do
if self.is_empty then return s
return new RopeString.from_root(append_to_path(root,s))
var lf = path.leaf
var offset = path.offset
- if path.leaf.str.length - offset > len then lf = new Leaf(lf.str.substring(offset,len)) else lf = new Leaf(lf.str.substring_from(offset))
+ if path.leaf.str.length - offset > len then lf = new Leaf(lf.str.substring(offset,len).as(FlatString)) else lf = new Leaf(lf.str.substring_from(offset).as(FlatString))
var nod: RopeNode = lf
path = ret.node_at(len-1)
offset = path.offset
- nod = new Leaf(path.leaf.str.substring(0, offset+1))
+ nod = new Leaf(path.leaf.str.substring(0, offset+1).as(FlatString))
for i in path.stack.reverse_iterator do
if i.left then continue
end
end
+redef class FlatString
+
+ redef fun append(s) do return (new RopeString.from(self)) + s
+
+ redef fun prepend(s) do return (new RopeString.from(self)).prepend(s)
+
+ redef fun insert_at(s, pos)
+ do
+ if pos == 0 then return prepend(s)
+ if pos == length then return append(s)
+
+ var l = substring(0,pos)
+ var r = substring_from(pos)
+ var ret: String = new RopeString.from(l)
+ ret += s
+ return ret + r
+ end
+
+end
+
+private class RopeStringChars
+ super SequenceRead[Char]
+
+ var tgt: Rope
+
+ redef fun [](pos)
+ do
+ assert pos < tgt.length
+ var path = tgt.node_at(pos)
+ return path.leaf.str.chars[path.offset]
+ end
+
+ redef fun iterator do return iterator_from(0)
+
+ redef fun iterator_from(pos) do return new RopeCharIterator(tgt, pos)
+
+ redef fun reverse_iterator do return reverse_iterator_from(tgt.length-1)
+
+ redef fun reverse_iterator_from(pos) do return new ReverseRopeCharIterator(tgt, pos)
+end
+
# Used to iterate on a Rope
private class IteratorElement