# and reallocations when concatenating `String` objects.
module buffered_ropes
-intrude import standard::text::ropes
+intrude import core::text::ropes
# Hidden buffer, used to simulate a `FlatBuffer` on a short string.
#
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`
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.ascii
init do
bns = buf.ns
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
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
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
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
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
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
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
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