From: Lucas Bajolet Date: Fri, 6 May 2016 20:32:45 +0000 (-0400) Subject: lib/core: Added new `append_substring` service to avoid creating ephemeral instances X-Git-Url: http://nitlanguage.org lib/core: Added new `append_substring` service to avoid creating ephemeral instances Signed-off-by: Lucas Bajolet --- diff --git a/lib/core/text/abstract_text.nit b/lib/core/text/abstract_text.nit index 6c2acd4..c9d1279 100644 --- a/lib/core/text/abstract_text.nit +++ b/lib/core/text/abstract_text.nit @@ -1514,6 +1514,42 @@ 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 + + # Appends `length` chars from `s` starting at index `from` + # + # ~~~nit + # var b = new Buffer + # b.append_substring("abcde", 1, 2) + # assert b == "bc" + # b.append_substring("vwxyz", 2, 3) + # assert b == "bcxyz" + # b.append_substring("ABCDE", 4, 300) + # assert b == "bcxyzE" + # b.append_substring("VWXYZ", 400, 1) + # assert b == "bcxyzE" + # ~~~ + fun append_substring(s: Text, from, length: Int) do + if from < 0 then + length += from + from = 0 + end + var ln = s.length + if (length + from) > ln then length = ln - from + if length <= 0 then return + append_substring_impl(s, from, length) + end + + # Unsafe version of `append_substring` for performance + # + # NOTE: Use only if sure about `from` and `length`, no checks + # or bound recalculation is done + fun append_substring_impl(s: Text, from, length: Int) do + var pos = from + for i in [0 .. length[ do + self.add s[pos] + pos += 1 + end + end end # View for chars on Buffer objects, extends Sequence diff --git a/lib/core/text/flat.nit b/lib/core/text/flat.nit index 45ad144..83cae37 100644 --- a/lib/core/text/flat.nit +++ b/lib/core/text/flat.nit @@ -411,7 +411,7 @@ abstract class FlatString if from < 0 then count += from - if count < 0 then return "" + if count <= 0 then return "" from = 0 end @@ -1054,6 +1054,21 @@ class FlatBuffer return new FlatBuffer.with_infos(r_items, byte_length, byte_length, count) end + redef fun append_substring_impl(s, from, length) do + if length <= 0 then return + if not s isa FlatText then + super + return + end + var bytest = s.char_to_byte_index(from) + var bytend = s.char_to_byte_index(from + length - 1) + var btln = bytend - bytest + 1 + enlarge(btln + _bytelen) + s._items.copy_to(_items, btln, bytest, _bytelen) + _bytelen += btln + _length += length + end + redef fun reverse do written = false