Makefile: Document deeply-nested libraries.
[nit.git] / lib / bufferized_ropes.nit
index 8c8512a..18cfa4c 100644 (file)
@@ -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,3 +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
+