X-Git-Url: http://nitlanguage.org diff --git a/lib/buffered_ropes.nit b/lib/buffered_ropes.nit index bbed4ea..fcc90c7 100644 --- a/lib/buffered_ropes.nit +++ b/lib/buffered_ropes.nit @@ -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 var buf: ManualBuffer var bns: NativeString is noinit - redef var length: Int 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