lib/standard/text: Removed byte-level modification on Buffers
authorLucas Bajolet <r4pass@hotmail.com>
Tue, 11 Aug 2015 14:13:54 +0000 (10:13 -0400)
committerLucas Bajolet <r4pass@hotmail.com>
Thu, 20 Aug 2015 14:50:47 +0000 (10:50 -0400)
Signed-off-by: Lucas Bajolet <r4pass@hotmail.com>

lib/standard/text/abstract_text.nit
lib/standard/text/flat.nit
lib/standard/text/ropes.nit

index d7b915c..427afaf 100644 (file)
@@ -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
index 87381e6..1ad261c 100644 (file)
@@ -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)
index 08611b7..870859a 100644 (file)
@@ -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)