README: document nit_env.sh
[nit.git] / lib / buffered_ropes.nit
index 9a143ca..fcc90c7 100644 (file)
@@ -22,7 +22,7 @@
 # and reallocations when concatenating `String` objects.
 module buffered_ropes
 
-intrude import standard::ropes
+intrude import core::text::ropes
 
 # Hidden buffer, used to simulate a `FlatBuffer` on a short string.
 #
@@ -59,17 +59,17 @@ private class ManualBuffer
 
        init do ns = new NativeString(maxlen)
 
-       fun [](i: Int): Char do return ns[i]
+       fun [](i: Int): Byte do return ns[i]
 end
 
 # Simple implementation of the iterator on Substrings for `Leaf`
 #
 # Basically just returns `self` encapsulated in a `FlatString`.
 private class LeafSubstrings
-       super IndexedIterator[Text]
+       super IndexedIterator[FlatText]
 
        var leaf: Leaf
-       var str: String is noinit
+       var str: FlatString is noinit
        var avail = true
 
        init do
@@ -87,25 +87,29 @@ end
 
 # Leaf of a `Rope`, used as a buffered area for speedy concatenation.
 private class Leaf
-       super RopeString
+       super String
+       super Rope
 
-       private var buf: ManualBuffer
-       private var bns: NativeString is noinit
-       redef var length: Int is noinit
+       var buf: ManualBuffer
+       var bns: NativeString is noinit
+       redef var length is noinit
+
+       # Unsafe, but since it is an experiment, don't mind
+       redef fun bytelen do return length
 
        redef fun empty do return new Leaf(new ManualBuffer)
 
        redef fun to_cstring do
                var len = length
                var ns = new NativeString(len + 1)
-               ns[len] = '\0'
+               ns[len] = 0u8
                buf.ns.copy_to(ns, len, 0, 0)
                return ns
        end
 
        redef fun substrings do return new LeafSubstrings(self)
 
-       redef fun [](i) do return buf[i]
+       redef fun [](i) do return buf[i].to_i.code_point
 
        init do
                bns = buf.ns
@@ -115,27 +119,15 @@ private class Leaf
        redef fun output do new FlatString.with_infos(buf.ns, length, 0, length - 1).output
 
        redef fun to_upper do
-               var x = new ManualBuffer
-               var nns = x.ns
-               var ns = bns
-               var mlen = length
-               for i in [0..mlen[ do
-                       nns[i] = ns[i].to_upper
-               end
-               x.pos = mlen - 1
-               return new Leaf(x)
+               var x = new FlatBuffer
+               for i in chars do x.add(i.to_upper)
+               return x.to_s
        end
 
        redef fun to_lower do
-               var x = new ManualBuffer
-               var nns = x.ns
-               var ns = bns
-               var mlen = length
-               for i in [0..mlen[ do
-                       nns[i] = ns[i].to_lower
-               end
-               x.pos = mlen - 1
-               return new Leaf(x)
+               var x = new FlatBuffer
+               for i in chars do x.add(i.to_lower)
+               return x.to_s
        end
 
        redef fun reversed do
@@ -164,8 +156,8 @@ private class Leaf
 
        redef fun +(o) do
                var s = o.to_s
-               var slen = s.length
-               var mlen = length
+               var slen = s.bytelen
+               var mlen = bytelen
                if slen == 0 then return self
                if mlen == 0 then return s
                var nlen = mlen + slen
@@ -174,14 +166,14 @@ private class Leaf
                        var bpos = buf.pos
                        var sits = s.items
                        if bpos == mlen then
-                               sits.copy_to(buf.ns, slen, s.index_from, bpos)
+                               sits.copy_to(buf.ns, slen, s.first_byte, bpos)
                                buf.pos = bpos + slen
                                return new Leaf(buf)
                        else
                                var b = new ManualBuffer
                                var nbns = b.ns
                                bns.copy_to(nbns, mlen, 0, 0)
-                               sits.copy_to(nbns, slen, s.index_from, mlen)
+                               sits.copy_to(nbns, slen, s.first_byte, mlen)
                                b.pos = nlen
                                return new Leaf(b)
                        end
@@ -212,7 +204,7 @@ private class Leaf
                                b = new ManualBuffer
                                bns.copy_to(b.ns, mlen, 0, 0)
                        end
-                       for i in s.chars do
+                       for i in s.bytes do
                                bns[bpos] = i
                                bpos += 1
                        end
@@ -225,12 +217,12 @@ redef class Concat
        redef fun to_cstring do
                var len = length
                var ns = new NativeString(len + 1)
-               ns[len] = '\0'
+               ns[len] = 0u8
                var off = 0
                for i in substrings do
                        var ilen = i.length
                        if i isa FlatString then
-                               i.items.copy_to(ns, ilen, i.index_from, off)
+                               i.items.copy_to(ns, ilen, i.first_byte, off)
                        else if i isa Leaf then
                                i.buf.ns.copy_to(ns, ilen, 0, off)
                        else
@@ -272,8 +264,8 @@ redef class FlatString
                if s isa FlatString then
                        if slen + mlen > maxlen then return new Concat(self, s)
                        var mits = items
-                       var sifrom = s.index_from
-                       var mifrom = index_from
+                       var sifrom = s.first_byte
+                       var mifrom = first_byte
                        var sits = s.items
                        var b = new ManualBuffer
                        var bns = b.ns
@@ -288,7 +280,7 @@ redef class FlatString
                        return new Concat(sl + self, s.right)
                else if s isa Leaf then
                        if slen + mlen > maxlen then return new Concat(self, s)
-                       var mifrom = index_from
+                       var mifrom = first_byte
                        var sb = s.buf
                        var b = new ManualBuffer
                        var bns = b.ns
@@ -327,20 +319,20 @@ redef class Array[E]
                        mypos += 1
                end
                var ns = new NativeString(sl + 1)
-               ns[sl] = '\0'
+               ns[sl] = 0u8
                i = 0
                var off = 0
                while i < mypos do
                        var tmp = na[i]
                        var tpl = tmp.length
                        if tmp isa FlatString then
-                               tmp.items.copy_to(ns, tpl, tmp.index_from, off)
+                               tmp.items.copy_to(ns, tpl, tmp.first_byte, off)
                                off += tpl
                        else
                                for j in tmp.substrings do
                                        var slen = j.length
                                        if j isa FlatString then
-                                               j.items.copy_to(ns, slen, j.index_from, off)
+                                               j.items.copy_to(ns, slen, j.first_byte, off)
                                        else if j isa Leaf then
                                                j.buf.ns.copy_to(ns, slen, 0, off)
                                        end