From 31101a5c5b54fece8ff0625871fede1023329cb8 Mon Sep 17 00:00:00 2001 From: mratsim Date: Sat, 6 Oct 2018 11:28:15 +0200 Subject: [PATCH] Add a toUint64 and toInt64 for 32-bit platform (fixes #48) --- stint/io.nim | 16 +++++++++++++++- stint/private/as_words.nim | 5 +++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/stint/io.nim b/stint/io.nim index bcb4dae..bd0e388 100644 --- a/stint/io.nim +++ b/stint/io.nim @@ -75,12 +75,26 @@ func to*(x: SomeUnsignedInt, T: typedesc[StUint]): T = func toInt*(num: Stint or StUint): int {.inline.}= # Returns as int. Result is modulo 2^(sizeof(int) - num.data.least_significant_word.int + cast[int](num.data.least_significant_word) func toUint*(num: Stint or StUint): uint {.inline.}= # Returns as int. Result is modulo 2^(sizeof(int) num.data.least_significant_word +func toInt64*(num: Stint or StUint): int64 {.inline.}= + # Returns as int64. Result is modulo 2^(sizeof(int) + when sizeof(uint) == 8: + cast[int64](num.data.least_significant_word) + else: + cast[int64](num.data.least_significant_two_words) + +func toUint64*(num: Stint or StUint): uint64 {.inline.}= + # Returns as int. Result is modulo 2^(sizeof(int) + when sizeof(uint) == 8: + num.data.least_significant_word.uint64 + else: + cast[uint64](num.data.least_significant_two_words) + func readHexChar(c: char): int8 {.inline.}= ## Converts an hex char to an int case c diff --git a/stint/private/as_words.nim b/stint/private/as_words.nim index 2275f36..79e3d01 100644 --- a/stint/private/as_words.nim +++ b/stint/private/as_words.nim @@ -53,6 +53,11 @@ macro second_least_significant_word*(x: UintImpl or IntImpl): untyped = asWordsImpl(x, x, words) result = words[words.len - 2] +macro least_significant_two_words*(x: UintImpl or IntImpl): untyped = + var words = nnkBracket.newTree() + asWordsImpl(x, x, words) + result = nnkBracket.newTree(words[words.len - 2], words[words.len - 1]) + # ######################################################################### # Iteration macros