lib/string: use indexed access to chars instead of iterators
authorAlexis Laferrière <alexis.laf@xymus.net>
Tue, 12 Aug 2014 21:11:38 +0000 (17:11 -0400)
committerAlexis Laferrière <alexis.laf@xymus.net>
Wed, 13 Aug 2014 15:39:59 +0000 (11:39 -0400)
Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

lib/standard/string.nit

index 6007588..5a0c039 100644 (file)
@@ -247,8 +247,8 @@ abstract class Text
                var i = 0
                var neg = false
 
-               for c in self.chars
-               do
+               for j in [0..length[ do
+                       var c = chars[j]
                        var v = c.to_i
                        if v > base then
                                if neg then
@@ -278,12 +278,10 @@ abstract class Text
        fun is_numeric: Bool
        do
                var has_point_or_comma = false
-               for i in self.chars
-               do
-                       if not i.is_numeric
-                       then
-                               if (i == '.' or i == ',') and not has_point_or_comma
-                               then
+               for i in [0..length[ do
+                       var c = chars[i]
+                       if not c.is_numeric then
+                               if (c == '.' or c == ',') and not has_point_or_comma then
                                        has_point_or_comma = true
                                else
                                        return false
@@ -300,7 +298,8 @@ abstract class Text
        #     assert "0G".is_hex == false
        fun is_hex: Bool
        do
-               for c in self.chars do
+               for i in [0..length[ do
+                       var c = chars[i]
                        if not (c >= 'a' and c <= 'f') and
                           not (c >= 'A' and c <= 'F') and
                           not (c >= '0' and c <= '9') then return false
@@ -316,7 +315,8 @@ abstract class Text
        #     assert "Hello World".is_upper == false
        fun is_upper: Bool
        do
-               for char in self.chars do 
+               for i in [0..length[ do
+                       var char = chars[i]
                        if char.is_lower then return false
                end
                return true
@@ -329,7 +329,8 @@ abstract class Text
        #     assert "Hello World".is_lower == false
        fun is_lower: Bool
        do
-               for char in self.chars do 
+               for i in [0..length[ do
+                       var char = chars[i]
                        if char.is_upper then return false
                end
                return true
@@ -379,7 +380,8 @@ abstract class Text
        do
                var res = new FlatBuffer
                var underscore = false
-               for c in self.chars do
+               for i in [0..length[ do
+                       var c = chars[i]
                        if (c >= 'a' and c <= 'z') or (c >='A' and c <= 'Z') then
                                res.add(c)
                                underscore = false
@@ -412,7 +414,8 @@ abstract class Text
        fun escape_to_c: String
        do
                var b = new FlatBuffer
-               for c in self.chars do
+               for i in [0..length[ do
+                       var c = chars[i]
                        if c == '\n' then
                                b.append("\\n")
                        else if c == '\0' then
@@ -464,7 +467,8 @@ abstract class Text
        do
                var res = new FlatBuffer.with_capacity(self.length)
                var was_slash = false
-               for c in chars do
+               for i in [0..length[ do
+                       var c = chars[i]
                        if not was_slash then
                                if c == '\\' then
                                        was_slash = true
@@ -498,7 +502,8 @@ abstract class Text
        do
                var buf = new FlatBuffer
 
-               for c in self.chars do
+               for i in [0..length[ do
+                       var c = chars[i]
                        if (c >= '0' and c <= '9') or
                           (c >= 'a' and c <= 'z') or
                           (c >= 'A' and c <= 'Z') or
@@ -636,7 +641,8 @@ abstract class Text
                        # djb2 hash algorithm
                        var h = 5381
 
-                       for char in self.chars do
+                       for i in [0..length[ do
+                               var char = chars[i]
                                h = h.lshift(5) + h + char.ascii
                        end
 
@@ -762,7 +768,8 @@ abstract class String
                var new_str = new FlatBuffer.with_capacity(self.length)
                var is_first_char = true
 
-               for char in self.chars do
+               for i in [0..length[ do
+                       var char = chars[i]
                        if is_first_char then 
                                new_str.add(char.to_lower)
                                is_first_char = false
@@ -800,7 +807,8 @@ abstract class String
                var is_first_char = true
                var follows_us = false
 
-               for char in self.chars do
+               for i in [0..length[ do
+                       var char = chars[i]
                        if is_first_char then
                                new_str.add(char)
                                is_first_char = false
@@ -1044,8 +1052,9 @@ class FlatString
                        s.items.copy_to(target_string, its_length, 0, my_length)
                else
                        var curr_pos = my_length
-                       for i in s.chars do
-                               target_string[curr_pos] = i
+                       for i in [0..s.length[ do
+                               var c = s.chars[i]
+                               target_string[curr_pos] = c
                                curr_pos += 1
                        end
                end
@@ -1337,8 +1346,9 @@ class FlatBuffer
                        s.items.copy_to(items, length, 0, 0)
                else
                        var curr_pos = 0
-                       for i in s.chars do
-                               items[curr_pos] = i
+                       for i in [0..s.length[ do
+                               var c = s.chars[i]
+                               items[curr_pos] = c
                                curr_pos += 1
                        end
                end
@@ -1366,8 +1376,9 @@ class FlatBuffer
                        s.items.copy_to(items, sl, 0, length)
                else
                        var curr_pos = self.length
-                       for i in s.chars do
-                               items[curr_pos] = i
+                       for i in [0..s.length[ do
+                               var c = s.chars[i]
+                               items[curr_pos] = c
                                curr_pos += 1
                        end
                end