From 4e9ba62f39530be469c4aa04613d9046434d5c79 Mon Sep 17 00:00:00 2001 From: Lucas Bajolet Date: Tue, 11 Aug 2015 10:13:54 -0400 Subject: [PATCH] lib/standard/text: Removed byte-level modification on Buffers Signed-off-by: Lucas Bajolet --- lib/standard/text/abstract_text.nit | 5 --- lib/standard/text/flat.nit | 67 +++++------------------------------ lib/standard/text/ropes.nit | 34 +++--------------- 3 files changed, 13 insertions(+), 93 deletions(-) diff --git a/lib/standard/text/abstract_text.nit b/lib/standard/text/abstract_text.nit index d7b915c..427afaf 100644 --- a/lib/standard/text/abstract_text.nit +++ b/lib/standard/text/abstract_text.nit @@ -1501,10 +1501,6 @@ abstract class Buffer # In Buffers, the internal sequence of character is mutable # Thus, `chars` can be used to modify the buffer. redef fun chars: Sequence[Char] is abstract - - # In Buffers, the internal sequence of bytes is mutable - # Thus, `bytes` can be used to modify the buffer. - redef fun bytes: Sequence[Byte] is abstract end # View for chars on Buffer objects, extends Sequence @@ -1521,7 +1517,6 @@ end # for mutation operations private abstract class BufferByteView super StringByteView - super Sequence[Byte] redef type SELFTYPE: Buffer end diff --git a/lib/standard/text/flat.nit b/lib/standard/text/flat.nit index 87381e6..1ad261c 100644 --- a/lib/standard/text/flat.nit +++ b/lib/standard/text/flat.nit @@ -471,23 +471,11 @@ class FlatBuffer redef var chars: Sequence[Char] = new FlatBufferCharView(self) is lazy - redef var bytes: Sequence[Byte] = new FlatBufferByteView(self) is lazy + redef var bytes = new FlatBufferByteView(self) is lazy redef var bytelen = 0 - # O(n) - redef fun length do - var max = bytelen - if max == 0 then return 0 - var pos = 0 - var ln = 0 - var its = items - while pos < max do - pos += its.length_of_char_at(pos) - ln += 1 - end - return ln - end + redef var length = 0 private var capacity = 0 @@ -564,21 +552,14 @@ class FlatBuffer enlarge(bytelen + clen) items.set_char_at(bytelen, c) bytelen += clen - end - - private fun add_byte(b: Byte) do - if written then reset - is_dirty = true - enlarge(bytelen + 1) - items[bytelen] = b - # FIXME: Might trigger errors - bytelen += 1 + length += 1 end redef fun clear do is_dirty = true if written then reset bytelen = 0 + length = 0 end redef fun empty do return new Buffer @@ -626,11 +607,12 @@ class FlatBuffer # # If `items` is shared, `written` should be set to true after the creation # so that a modification will do a copy-on-write. - private init with_infos(items: NativeString, capacity, bytelen: Int) + private init with_infos(items: NativeString, capacity, bytelen, length: Int) do self.items = items self.capacity = capacity self.bytelen = bytelen + self.length = length end # Create a new string copied from `s`. @@ -643,6 +625,7 @@ class FlatBuffer for i in substrings do i.as(FlatString).items.copy_to(items, i.bytelen, 0, 0) end bytelen = s.bytelen + length = s.length capacity = s.bytelen written = true end @@ -671,6 +654,7 @@ class FlatBuffer return end bytelen += sl + length += s.length end # Copies the content of self in `dest` @@ -695,7 +679,7 @@ class FlatBuffer var byte_length = byteto - bytefrom + 1 var r_items = new NativeString(byte_length) items.copy_to(r_items, byte_length, bytefrom, 0) - return new FlatBuffer.with_infos(r_items, byte_length, byte_length) + return new FlatBuffer.with_infos(r_items, byte_length, byte_length, count) else return new Buffer end @@ -761,39 +745,6 @@ private class FlatBufferByteView redef fun [](index) do return target.items[index] - redef fun []=(index, item) - do - assert index >= 0 and index <= target.bytelen - if index == target.bytelen then - add(item) - return - end - target.items[index] = item - end - - redef fun push(c) - do - target.add_byte(c) - end - - fun enlarge(cap: Int) - do - target.enlarge(cap) - end - - redef fun append(s) - do - var s_length = s.length - if target.capacity < (target.length + s_length) then enlarge(s_length + target.length) - var pos = target.length - var its = target.items - for i in s do - its[pos] = i - pos += 1 - end - target.length += s.length - end - redef fun iterator_from(pos) do return new FlatBufferByteIterator.with_pos(target, pos) redef fun reverse_iterator_from(pos) do return new FlatBufferByteReverseIterator.with_pos(target, pos) diff --git a/lib/standard/text/ropes.nit b/lib/standard/text/ropes.nit index 08611b7..870859a 100644 --- a/lib/standard/text/ropes.nit +++ b/lib/standard/text/ropes.nit @@ -270,7 +270,7 @@ class RopeBuffer redef var chars: Sequence[Char] is lazy do return new RopeBufferChars(self) - redef var bytes: Sequence[Byte] is lazy do return new RopeBufferBytes(self) + redef var bytes is lazy do return new RopeBufferBytes(self) # The final string being built on the fly private var str: String = "" @@ -281,6 +281,9 @@ class RopeBuffer # Next available (e.g. unset) character in the `Buffer` private var rpos = 0 + # Length (in chars) of the buffered part + private var nslen = 0 + # Keeps track of the buffer's currently dumped part # # This might happen if for instance, a String was being @@ -467,18 +470,6 @@ class RopeBuffer rpos = rp end - private fun add_byte(b: Byte) do - var rp = rpos - if rp >= buf_size then - dump_buffer - rp = 0 - end - ns[rp] = b - rp += 1 - bytelen += 1 - rpos = rp - end - # Converts the Buffer to a FlatString, appends it to # the final String and re-allocates a new larger Buffer. private fun dump_buffer do @@ -1237,23 +1228,6 @@ class RopeBufferBytes end end - redef fun []=(i,c) do - if i == target.length then target.add_byte c - if i < target.str.length then - # FIXME: Will need to be optimized and rewritten with Unicode - var s = target.str - var l = s.substring(0, i) - var r = s.substring_from(i + 1) - target.str = l + c.to_i.ascii.to_s + r - else - target.ns[i - target.str.length] = c - end - end - - redef fun add(c) do target.add_byte c - - redef fun push(c) do target.add_byte c - redef fun iterator_from(i) do return new RopeBufferByteIterator.from(target, i) redef fun reverse_iterator_from(i) do return new RopeBufferByteReverseIterator.from(target, i) -- 1.7.9.5