lib/standard/string: introduce (an use) `plain_to_s`
[nit.git] / lib / standard / string.nit
index 0d40c3d..aa757b7 100644 (file)
@@ -345,7 +345,7 @@ abstract class Text
                end
                return true
        end
-                       
+
        # Removes the whitespaces at the beginning of self
        #
        #     assert " \n\thello \n\t".l_trim == "hello \n\t"
@@ -851,8 +851,8 @@ abstract class Text
 
        # Gives the formatted string back as a Nit string with `args` in place
        #
-       #       assert "This %1 is a %2.".format("String", "formatted String") == "This String is a formatted String"
-       #       assert "\\%1 This string".format("String") == "\\%1 This string"
+       #    assert "This %1 is a %2.".format("String", "formatted String") == "This String is a formatted String."
+       #    assert "\\%1 This string".format("String") == "\\%1 This string"
        fun format(args: Object...): String do
                var s = new Array[Text]
                var curr_st = 0
@@ -882,6 +882,27 @@ abstract class Text
                return s.to_s
        end
 
+       # Copies `n` bytes from `self` at `src_offset` into `dest` starting at `dest_offset`
+       #
+       # Basically a high-level synonym of NativeString::copy_to
+       #
+       # REQUIRE: `n` must be large enough to contain `len` bytes
+       #
+       #       var ns = new NativeString(8)
+       #       "Text is String".copy_to_native(ns, 8, 2, 0)
+       #       assert ns.to_s_with_length(8) == "xt is St"
+       #
+       fun copy_to_native(dest: NativeString, n, src_offset, dest_offset: Int) do
+               var mypos = src_offset
+               var itspos = dest_offset
+               while n > 0 do
+                       dest[itspos] = self.chars[mypos]
+                       itspos += 1
+                       mypos += 1
+                       n -= 1
+               end
+       end
+
 end
 
 # All kinds of array-based text representations.
@@ -926,6 +947,10 @@ abstract class FlatText
        end
 
        redef fun flatten do return self
+
+       redef fun copy_to_native(dest, n, src_offset, dest_offset) do
+               items.copy_to(dest, n, src_offset, dest_offset)
+       end
 end
 
 # Abstract class for the SequenceRead compatible
@@ -1005,7 +1030,7 @@ abstract class String
        #     assert "Hello World!".to_lower     == "hello world!"
        fun to_lower : SELFTYPE is abstract
 
-       # Takes a camel case `self` and converts it to snake case 
+       # Takes a camel case `self` and converts it to snake case
        #
        #     assert "randomMethodId".to_snake_case == "random_method_id"
        #
@@ -1055,11 +1080,11 @@ abstract class String
                                prev_is_upper = false
                        end
                end
-               
+
                return new_str.to_s
        end
 
-       # Takes a snake case `self` and converts it to camel case 
+       # Takes a snake case `self` and converts it to camel case
        #
        #     assert "random_method_id".to_camel_case == "randomMethodId"
        #
@@ -2195,6 +2220,12 @@ redef class Collection[E]
        # Concatenate elements.
        redef fun to_s
        do
+               return plain_to_s
+       end
+
+       # Concatenate element without separators
+       fun plain_to_s: String
+       do
                var s = new FlatBuffer
                for e in self do if e != null then s.append(e.to_s)
                return s.to_s
@@ -2230,7 +2261,7 @@ end
 redef class Array[E]
 
        # Fast implementation
-       redef fun to_s
+       redef fun plain_to_s
        do
                var l = length
                if l == 0 then return ""