X-Git-Url: http://nitlanguage.org diff --git a/lib/bufferized_ropes.nit b/lib/bufferized_ropes.nit index 5893e10..18cfa4c 100644 --- a/lib/bufferized_ropes.nit +++ b/lib/bufferized_ropes.nit @@ -25,6 +25,28 @@ private class BufferLeaf 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 @@ -83,6 +105,8 @@ redef class RopeString 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 @@ -312,6 +336,35 @@ redef class RopeString 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