X-Git-Url: http://nitlanguage.org?ds=sidebyside diff --git a/lib/core/text/flat.nit b/lib/core/text/flat.nit index 52de988..e8a2d4f 100644 --- a/lib/core/text/flat.nit +++ b/lib/core/text/flat.nit @@ -36,18 +36,18 @@ end redef class FlatText - private fun first_byte: Int do return 0 + fun first_byte: Int do return 0 - private fun last_byte: Int do return _bytelen - 1 + fun last_byte: Int do return _bytelen - 1 # Cache of the latest position (char) explored in the string - private var position: Int = 0 + var position: Int = 0 # Cached position (bytes) in the NativeString underlying the String - private var bytepos: Int = 0 + var bytepos: Int = 0 # Index of the character `index` in `_items` - private fun char_to_byte_index(index: Int): Int do + fun char_to_byte_index(index: Int): Int do var ln = length assert index >= 0 assert index < ln @@ -90,7 +90,7 @@ redef class FlatText # This enables a double-optimization in `escape_to_c` since if this # method returns 0, then `self` does not need escaping and can be # returned as-is - protected fun chars_to_escape_to_c: Int do + fun chars_to_escape_to_c: Int do var its = _items var max = last_byte var pos = first_byte @@ -200,6 +200,14 @@ class FlatString return _items.utf8_length(_first_byte, _last_byte) end + redef var to_cstring is lazy do + var blen = _bytelen + var new_items = new NativeString(blen + 1) + _items.copy_to(new_items, blen, _first_byte, 0) + new_items[blen] = 0u8 + return new_items + end + redef fun reversed do var b = new FlatBuffer.with_capacity(_bytelen + 1) @@ -304,16 +312,6 @@ class FlatString _bytepos = from end - redef fun to_cstring do - if real_items != null then return real_items.as(not null) - var blen = _bytelen - var new_items = new NativeString(blen + 1) - _items.copy_to(new_items, blen, _first_byte, 0) - new_items[blen] = 0u8 - real_items = new_items - return new_items - end - redef fun ==(other) do if not other isa FlatString then return super @@ -582,6 +580,9 @@ class FlatBuffer private var capacity = 0 + # Real items, used as cache for when to_cstring is called + private var real_items: NativeString is noinit + redef fun fast_cstring do return _items.fast_cstring(0) redef fun substrings do return new FlatSubstringsIter(self) @@ -702,7 +703,7 @@ class FlatBuffer real_items = new_native is_dirty = false end - return real_items.as(not null) + return real_items end # Create a new empty string. @@ -1002,7 +1003,7 @@ redef class NativeString copy_to(new_self, length, 0, 0) var str = new FlatString.with_infos(new_self, length, 0, length - 1) new_self[length] = 0u8 - str.real_items = new_self + str.to_cstring = new_self return str end @@ -1035,7 +1036,7 @@ redef class NativeString end var ok_c: Bool var c = char_at(pos) - var cp = c.ascii + var cp = c.code_point if nxst == 1 then ok_c = cp >= 0 and cp <= 0x7F else if nxst == 2 then