end
+redef class Concat
+ redef fun to_leaf
+ do
+ if left == null then
+ if right == null then return new StringLeaf("".as(FlatString))
+ return right.to_leaf
+ end
+ if right == null then return left.as(not null).to_leaf
+ if left.length + right.length < buf_len then
+ var b = new FlatBuffer.with_capacity(buf_len)
+ b.append(left.to_leaf.str)
+ b.append(right.to_leaf.str)
+ return new BufferLeaf(b)
+ else
+ var b = new FlatBuffer.with_capacity(left.length + right.length)
+ b.append(left.to_leaf.str)
+ b.append(right.to_leaf.str)
+ return new StringLeaf(b.lazy_to_s(b.length))
+ end
+ end
+end
+
redef class FlatText
# Creates a substring, only without any copy overhead for Buffers
end
end
+ redef fun +(o) do return insert_at(o.to_s, length)
+
# Inserts a String `str` at position `pos`
redef fun insert_at(str, pos)
do
end
+redef class SubstringsIterator
+
+ # Compute the bounds of the current substring and makes the substring
+ redef fun make_substring
+ do
+ var l = nodes.item
+ var s = l.str
+ var min = 0
+ var length = l.length
+ if nodes.index < pos then
+ min = pos - nodes.index
+ end
+ substring = s.lazy_substring(min, length)
+ end
+
+end
+
+redef class ReverseSubstringsIterator
+
+ redef fun make_substring
+ do
+ var l = leaves.item
+ var s = l.str
+ if pos > (leaves.index + l.length - 1) then return
+ str = s.lazy_substring(0, (pos - leaves.index + 1))
+ end
+
+end
+
+# Default size of a buffer in a rope leaf.
+fun buf_len: Int do return 200
+