aboutsummaryrefslogtreecommitdiff
path: root/src/bigint.cpp
diff options
context:
space:
mode:
authorJonathan Marler <jonathan.j.marler@hp.com>2019-08-22 13:56:04 -0600
committerAndrew Kelley <andrew@ziglang.org>2019-08-23 11:14:08 -0400
commit9322eee80aadd6d9f80ebc11d29d09898237a14a (patch)
treec8848c067244ee16f9cd5525a366d4bb451ae474 /src/bigint.cpp
parent0e75fef1decdaba918b2abc84977ecadb010ad32 (diff)
downloadzig-9322eee80aadd6d9f80ebc11d29d09898237a14a.tar.gz
zig-9322eee80aadd6d9f80ebc11d29d09898237a14a.zip
Encapsulate bigint representation, assert on cast data loss
Diffstat (limited to 'src/bigint.cpp')
-rw-r--r--src/bigint.cpp23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/bigint.cpp b/src/bigint.cpp
index da53a2b129..b227b3b4f7 100644
--- a/src/bigint.cpp
+++ b/src/bigint.cpp
@@ -15,6 +15,8 @@
#include <limits>
#include <algorithm>
+static uint64_t bigint_as_unsigned(const BigInt *bigint);
+
static void bigint_normalize(BigInt *dest) {
const uint64_t *digits = bigint_ptr(dest);
@@ -1660,7 +1662,7 @@ size_t bigint_clz(const BigInt *bi, size_t bit_count) {
return count;
}
-uint64_t bigint_as_unsigned(const BigInt *bigint) {
+static uint64_t bigint_as_unsigned(const BigInt *bigint) {
assert(!bigint->is_negative);
if (bigint->digit_count == 0) {
return 0;
@@ -1671,6 +1673,25 @@ uint64_t bigint_as_unsigned(const BigInt *bigint) {
}
}
+uint64_t bigint_as_u64(const BigInt *bigint)
+{
+ return bigint_as_unsigned(bigint);
+}
+
+uint32_t bigint_as_u32(const BigInt *bigint) {
+ uint64_t value64 = bigint_as_unsigned(bigint);
+ uint32_t value32 = (uint32_t)value64;
+ assert (value64 == value32);
+ return value32;
+}
+
+size_t bigint_as_usize(const BigInt *bigint) {
+ uint64_t value64 = bigint_as_unsigned(bigint);
+ size_t valueUsize = (size_t)value64;
+ assert (value64 == valueUsize);
+ return valueUsize;
+}
+
int64_t bigint_as_signed(const BigInt *bigint) {
if (bigint->digit_count == 0) {
return 0;