Kernel : Int, optimization on the digit count method for Base 10 numbers.
authorLucas Bajolet <lucas.bajolet@hotmail.com>
Tue, 13 Aug 2013 18:01:33 +0000 (14:01 -0400)
committerLucas Bajolet <lucas.bajolet@hotmail.com>
Tue, 13 Aug 2013 18:01:33 +0000 (14:01 -0400)
Signed-off-by: Lucas Bajolet <lucas.bajolet@hotmail.com>

lib/standard/kernel.nit

index 0c73352..d5f10c1 100644 (file)
@@ -303,6 +303,7 @@ universal Int
        # Number of digits of an integer in base `b' (plus one if negative)
        fun digit_count(b: Int): Int
        do
+               if b == 10 then return digit_count_base_10
                var d: Int # number of digits
                var n: Int # current number
                # Sign
@@ -323,6 +324,28 @@ universal Int
                return d
        end
 
+       # Optimized version for base 10
+       fun digit_count_base_10: Int
+       do
+               var val: Int
+               var result: Int
+               if self < 0 then
+                       result = 2
+                       val = -self
+               else
+                       result = 1
+                       val = self
+               end
+               loop
+                       if val < 10 then return result
+                       if val < 100 then return result+1
+                       if val < 1000 then return result+2
+                       if val < 10000 then return result+3
+                       val = val / 10000
+                       result += 4
+               end
+       end
+
        # Return the corresponding digit character
        # If 0 <= `self' <= 9, return the corresponding character.
        # If 10 <= `self' <= 36, return the corresponding letter [a..z].