X-Git-Url: http://nitlanguage.org diff --git a/lib/standard/string.nit b/lib/standard/string.nit index e4423d3..011cfa1 100644 --- a/lib/standard/string.nit +++ b/lib/standard/string.nit @@ -16,6 +16,7 @@ module string import math import collection +intrude import collection::array `{ #include @@ -156,13 +157,6 @@ abstract class Text return self.chars.iterator end - # Is 'c' contained in self ? - # - # DEPRECATED : Use self.chars.has instead - fun has(c: Char): Bool - do - return self.chars.has(c) - end # Gets an Array containing the chars of self # @@ -178,7 +172,7 @@ abstract class Text # As with substring, a `from` index < 0 will be replaced by 0 fun substring_from(from: Int): SELFTYPE do - if from > self.length then return empty + if from >= self.length then return empty if from < 0 then from = 0 return substring(from, length - from) end @@ -364,7 +358,7 @@ abstract class Text if iter.item.ascii > 32 then break iter.next end - if iter.index == length then return self.empty + if iter.index < 0 then return self.empty return self.substring(0, iter.index + 1) end @@ -630,6 +624,14 @@ abstract class Text end end + # Escape string used in labels for graphviz + # + # assert ">><<".escape_to_dot == "\\>\\>\\<\\<" + fun escape_to_dot: String + do + return escape_more_to_c("|\{\}<>") + end + # Flat representation of self fun flatten: FlatText is abstract @@ -1136,7 +1138,7 @@ private class FlatStringReverseIterator curr_pos = pos + tgt.index_from end - redef fun is_ok do return curr_pos >= 0 + redef fun is_ok do return curr_pos >= target.index_from redef fun item do return target_items[curr_pos] @@ -1837,18 +1839,51 @@ redef class Collection[E] end redef class Array[E] + # Fast implementation redef fun to_s do - var s = new FlatBuffer - var i = 0 var l = length + if l == 0 then return "" + if l == 1 then if self[0] == null then return "" else return self[0].to_s + var its = _items + var na = new NativeArray[String](l) + var i = 0 + var sl = 0 + var mypos = 0 while i < l do - var e = self[i] - if e != null then s.append(e.to_s) + var itsi = its[i] + if itsi == null then + i += 1 + continue + end + var tmp = itsi.to_s + sl += tmp.length + na[mypos] = tmp i += 1 + mypos += 1 end - return s.to_s + var ns = new NativeString(sl + 1) + ns[sl] = '\0' + 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) + off += tpl + else + for j in tmp.substrings do + var s = j.as(FlatString) + var slen = s.length + s.items.copy_to(ns, slen, s.index_from, off) + off += slen + end + end + i += 1 + end + return ns.to_s_with_length(sl) end end @@ -1893,7 +1928,8 @@ end # Native strings are simple C char * extern class NativeString `{ char* `} super StringCapable - + # Creates a new NativeString with a capacity of `length` + new(length: Int) is intern fun [](index: Int): Char is intern fun []=(index: Int, item: Char) is intern fun copy_to(dest: NativeString, length: Int, from: Int, to: Int) is intern @@ -1934,7 +1970,7 @@ interface StringCapable end redef class Sys - var _args_cache: nullable Sequence[String] + private var args_cache: nullable Sequence[String] # The arguments of the program as given by the OS fun program_args: Sequence[String]