summary refs log tree commit diff stats
path: root/lib/std/private
diff options
context:
space:
mode:
authorClyybber <darkmine956@gmail.com>2021-06-28 15:00:14 +0200
committerGitHub <noreply@github.com>2021-06-28 15:00:14 +0200
commit6e74fecb4275272e5224e2a0ba45df5ca2c40b82 (patch)
tree7c675a2c5cbec85bc586b85bd2ef699049129935 /lib/std/private
parente720bbdd76303e2cc0a3a169e870859470a1da84 (diff)
downloadNim-6e74fecb4275272e5224e2a0ba45df5ca2c40b82.tar.gz
Simplify addInt, remove digits10 (#18356)
* Simplify addInt, remove digits10

Co-authored-by: Charles Blake <charlechaud@gmail.com>

* Fix bootstrapping

* Add noInit to tmp array

* noInit -> noinit

Co-authored-by: Charles Blake <charlechaud@gmail.com>
Diffstat (limited to 'lib/std/private')
-rw-r--r--lib/std/private/digitsutils.nim58
1 files changed, 23 insertions, 35 deletions
diff --git a/lib/std/private/digitsutils.nim b/lib/std/private/digitsutils.nim
index cc985c7bd..7aefc36bc 100644
--- a/lib/std/private/digitsutils.nim
+++ b/lib/std/private/digitsutils.nim
@@ -38,51 +38,39 @@ proc trailingZeros2Digits*(digits: uint32): int32 {.inline.} =
   assert(digits <= 99)
   return trailingZeros100[digits]
 
-func digits10*(num: uint64): int {.noinline.} =
-  if num < 10'u64:
-    result = 1
-  elif num < 100'u64:
-    result = 2
-  elif num < 1_000'u64:
-    result = 3
-  elif num < 10_000'u64:
-    result = 4
-  elif num < 100_000'u64:
-    result = 5
-  elif num < 1_000_000'u64:
-    result = 6
-  elif num < 10_000_000'u64:
-    result = 7
-  elif num < 100_000_000'u64:
-    result = 8
-  elif num < 1_000_000_000'u64:
-    result = 9
-  elif num < 10_000_000_000'u64:
-    result = 10
-  elif num < 100_000_000_000'u64:
-    result = 11
-  elif num < 1_000_000_000_000'u64:
-    result = 12
-  else:
-    result = 12 + digits10(num div 1_000_000_000_000'u64)
-
-template numToString*(result: var string, origin: uint64, length: int) =
+func addIntImpl*(result: var string, origin: uint64) =
+  var tmp {.noinit.}: array[24, char]
   var num = origin
-  var next = length - 1
+  var next = tmp.len - 1
   const nbatch = 100
 
   while num >= nbatch:
     let originNum = num
     num = num div nbatch
     let index = (originNum - num * nbatch) shl 1
-    result[next] = digits100[index + 1]
-    result[next - 1] = digits100[index]
+    tmp[next] = digits100[index + 1]
+    tmp[next - 1] = digits100[index]
     dec(next, 2)
 
   # process last 1-2 digits
   if num < 10:
-    result[next] = chr(ord('0') + num)
+    tmp[next] = chr(ord('0') + num)
   else:
     let index = num * 2
-    result[next] = digits100[index + 1]
-    result[next - 1] = digits100[index]
+    tmp[next] = digits100[index + 1]
+    tmp[next - 1] = digits100[index]
+    dec next
+  let n = result.len
+  let length = tmp.len - next
+  result.setLen n + length
+  when nimvm:
+    for i in 0..<length:
+      result[n+i] = tmp[next+i]
+  else:
+    when defined(js) or defined(nimscript):
+      for i in 0..<length:
+        result[n+i] = tmp[next+i]
+    else:
+      {.noSideEffect.}:
+        copyMem result[n].addr, tmp[next].addr, length
+